☰
Linux磁盘管理实战:从分区、格式化到挂载与LVM在线扩容
2026/10/17 4:40:58 网站建设 项目流程

上一篇我们把lsblk、df、du、fdisk -l这些“看家本领”过了一遍,学会了怎么把磁盘信息摸清楚。但光会看没用,真正让磁盘“为我所用”的,是后面这些硬功夫:分区、格式化、挂载,还有多用户环境下的配额控制,以及一旦磁盘不够用怎么不重启就扩容的 LVM。这篇不绕弯子,直接按生产环境实操的顺序展开:先从分区表的选择讲起,再走一遍分区、格式化、挂载的完整流程,最后把配额和 LVM 这两个高阶技能拆开揉碎。你如果正在折腾一台新服务器,或者准备把存储方案重新规划一遍,跟着这篇走完,至少能少踩一半的坑。

1. 动手之前,先把分区表这件事想明白

1.1 MBR 和 GPT 到底差在哪

很多人装了无数次系统,却从没认真想过磁盘上那一小块“元数据”才是整个存储的定盘星。MBR(主引导记录)是上世纪 80 年代的老设计,它把分区表塞在磁盘第一个扇区的末尾,总共只有 64 字节。这点空间决定了它天生只有两个硬限制:最多 4 个主分区,单分区最大 2TB。你要是拿一块 4TB 的盘用 MBR,剩下的 2TB 就成了连系统都不认的“黑洞”。

GPT(GUID 分区表)是 UEFI 时代的标准配置。它在磁盘头部放主分区表,在磁盘尾部放备份分区表,中间每一份分区条目都有 CRC32 校验,坏了一块自动从备份恢复。分区的数量上限是 128 个,单分区容量理论值早就超过了当前硬盘物理上限,所以大容量存储场景基本没得选,直接用 GPT。

我的建议是:2025 年还纠结 MBT 和 GPT 的意义不大,新设备一律 GPT,除非你是在给十年前的老机器做维护,或者需要跟某个只认 MBR 的老系统做兼容。

1.2 分区规划时容易被忽略的三件事

第一件事是/boot和 UEFI 的关系。如果你的机器开了 UEFI 安全启动,那必须有一个 EFI 系统分区(ESP),格式是 FAT32,挂载在/boot/efi。在老式 BIOS 启动模式下,/boot分区可以放在 MBR 磁盘上,但 GPT 磁盘上也能放,只是 grub 的兼容性处理略有差异。

第二件事是 swap 分区。现在内存动不动 64G、128G,很多人觉得 swap 没必要了,但服务器上跑数据库或者 Java 应用时,swap 仍然是系统稳定性的兜底。建议按内存的 0.5 到 1 倍预留,如果内存超过 64G,可以适当调低比例,但别直接设为 0。

第三件事是预留空间。我见过太多直接把整块盘分完、不留一点余量的案例。物理卷上留 5% 到 10% 的空闲,后面 LVM 扩容、文件系统调整都有回旋余地。这就像搬家时箱子别塞满,不然东西磕碰了连个缓冲都没有。

2. 分区实战:fdisk 与 parted 的取舍

2.1 用 fdisk 搞定常规分区

fdisk 是 Linux 下最老牌的分区工具,新一代版本已经原生支持 GPT,所以小容量磁盘直接用 fdisk 就够了。比如要对/dev/sdb分区,操作流程是这样:

# 交互式进入分区界面 fdisk /dev/sdb # 在 fdisk 命令行输入 g 创建 GPT 分区表 # (输 m 进入 MBR,实际现在都选 g) # 输入 n 新建分区 # 分区号默认、起始扇区默认 # 最后一个参数决定结束位置,可以写 +200G 表示分 200G # 输入 w 写入并退出

分区完成后,习惯性用partprobe /dev/sdb让内核重新读取分区表,这一步经常被新手跳过,结果明明 fdisk 里看到了新分区,lsblk里却死活不显示。还有个小细节:fdisk 交互界面的指令不需要完整输入,p是打印分区表、d是删除分区、t是改分区类型,熟练之后操作起来比图形界面还快。

说到分区类型,值得单独提一嘴。fdisk 里默认把新建分区标为 Linux filesystem(类型代码 8300),这在普通数据盘上没问题。但如果你打算拿它做 LVM 物理卷,就要用t指令把类型改成 Linux LVM(8E00);拿它做 swap,就改成 Linux swap(8200)。很多教程省略了这一步,LVM 也能创建成功,但系统在某些异常情况下识别分区类型时会出幺蛾子,规规矩矩把类型写上,成本极低收益却很明显。

2.2 parted 处理大容量磁盘的隐藏优势

当磁盘容量超过 2TB,或者你需要非交互式地脚本化分区时,parted 是比 fdisk 更顺手的工具。它早期最大的卖点就是支持 GPT,但现在 fdisk 也支持了,所以真正的差异在于 parted 支持非交互模式,可以直接一条命令完成分区创建:

# 用 parted 直接在 /dev/sdc 上创建 GPT 分区表 parted /dev/sdc mklabel gpt # 创建主分区,从 1MiB 开始,到 500GiB 结束 parted /dev/sdc mkpart primary ext4 1MiB 500GiB # 剩下的空间续一个分区 parted /dev/sdc mkpart primary ext4 500GiB 100%

注意 parted 创建分区时如果带了文件系统参数,只是在分区表里做个标记,并不会真的格式化分区,最终文件系统还是要靠 mkfs 来做。用 parted 还有一个细节就是单位问题,它默认的“百分百”之类的写法很直观,但如果你混用了 GB 和 GiB,会遇到容量偏差的问题。建议统一用 GiB、MiB 这种二进制单位,避免 1GB=1000MB 与 1GiB=1024MiB 的换算歧义。

2.3 分区表操作的心得和禁忌

分区操作是高风险动作,我一般遵循“一查二备三动手”的原则。查,是用lsblk确认自己没搞错盘符,/dev/sdb和/dev/sdb1这种一级二级关系务必看清楚。备,是确保重要数据已经备份,特别是生产环境,没有备份就动分区表,是对自己的不负责。动手之前还要确认没有进程在访问这块盘,否则后面 mount 和 fsck 都可能报设备忙。

还有个容易踩的坑:对正在使用的系统盘执行fdisk /dev/sda时,系统会警告“This disk is currently in use”,这时候继续操作极有可能导致内核分区表信息错乱。最稳妥的做法是,所有需要重新分区的数据盘,先umount卸载,再用swapoff关掉对应的 swap 分区,确保物理卷没被占用,然后才进行分区操作。

3. 文件系统格式化:选型比命令更关键

3.1 ext4、XFS、Btrfs 三选一,到底怎么选

分区只是划好了地,真正决定性能表现的是文件系统。现在主流的候选就三个:ext4、XFS、Btrfs。我给它们做了个直观对比:

文件系统适合场景最大优势典型局限
ext4通用场景、中小型服务器成熟稳定、兼容性极好大文件高并发下不如 XFS
XFS大文件存储、高并发写入并行 IO 性能强劲,RHEL 系默认不能在线缩容,只能扩容
Btrfs需要快照、压缩、自修复的高级场景功能丰富,COW 机制自带数据校验运维复杂度高,需要学习成本

日常使用我推荐 ext4,除非你的系统默认就是 XFS,比如 RHEL、CentOS 系的安装器会默认选 XFS,那就顺其自然用 XFS。Btrfs 功能确实诱人,但它的 RAID 和快照机制在生产环境里对操作者的要求不低,新手贸然上 Btrfs,容易在子卷和快照的细节里翻车。

3.2 mkfs 命令与分区对齐

格式化本身不复杂,一条命令的事,但命令里要是不带对齐参数,后面性能会打折。所谓对齐,指的是文件系统的块和磁盘物理扇区边界对齐。新型硬盘扇区是 4K,如果文件系统块没对齐,一个 IO 操作就可能跨两个扇区,性能损耗可达 20% 以上。

让分区对齐的关键提前在分区阶段就完成了——fdisk 和 parted 默认都会从 1MiB 对齐处开始。格式化时如果用的是默认参数,通常没问题。但如果你手动指定了起始扇区,就要用-E或-b参数配合检查。格式化命令本身很简单:

# ext4 格式化并设置卷标 mkfs.ext4 -L data_disk /dev/sdb1 # XFS 格式化并设置卷标 mkfs.xfs -L data_disk /dev/sdb1 # 格式化 swap mkswap /dev/sdb2

格式化之后别急着挂载,用blkid看一眼,把 UUID 和文件系统类型记录下来。这一步非常重要,因为后面写/etc/fstab时,最好用 UUID 而不是设备名,原因很简单:系统重启后设备名可能变化,比如插了新盘后/dev/sdb可能变成/dev/sdc,但 UUID 是跟着数据走的,永远不会变。

格式化时的另一个常见错误是对正在使用的设备执行 mkfs。有一次我帮一个朋友排查问题,他误把/dev/sda当成了新盘执行格式化,结果把系统盘清了。所以执行 mkfs 之前,务必用lsblk -f查看设备和挂载情况,确认这个盘上没有任何需要保留的数据,再敲下回车。

4. 挂载管理:mount 到 fstab 的完整链路

4.1 临时挂载命令的常用姿势

挂载本质上就是把文件系统关联到目录树的一个节点上。临时挂载用 mount 即可:

# 基本挂载,最常用 mount /dev/sdb1 /data # 带选项挂载,关闭 atime 更新,降低磁盘写入 mount -o noatime /dev/sdb1 /data # 只读挂载,适合排查故障 mount -o ro /dev/sdb1 /data

noatime是个很实用的选项。默认情况下,每次文件被读取时系统都会更新 atime 元数据,这意味着大量读操作也会带来写放大。数据库服务器上的热数据盘挂上noatime,IO 压力肉眼可见地下降。另一个值得关注的是nodiratime,但现在内核默认已经包含目录的 atime 优化,单独设置意义不大。

挂载点目录有个讲究:必须是已存在的空目录。如果目录里有内容,mount 之后原内容会被“遮住”,umount 之后才能重新看到,这会让不知情的人误以为数据丢了,实际上它们被挂载层盖住了。

4.2 /etc/fstab 的正确编写方式

临时挂载重启就没了,要长期生效必须写入/etc/fstab。这个文件是系统启动时自动挂载的依据,格式非常严格,六个字段一个都不能少:

# <设备> <挂载点> <文件系统类型> <挂载选项> <dump> <fsck检查顺序> UUID=8b7a6c6e-0253-4f3d-9a4b-2c3de1234567 /data ext4 defaults,noatime 0 2

逐字段解释一下:第一个字段是设备,推荐写 UUID,不写/dev/sdb1;第二个字段是挂载点路径;第三个字段是文件系统类型;第四个字段是挂载选项,defaults相当于 rw、suid、dev、exec、auto、nouser、async 这一堆选项的集合;第五个字段是 dump 备份标志,现在基本没人用 dump 了,填 0;第六个字段是 fsck 启动检查顺序,/根文件系统填 1,其他所有要检查的填 2,不需要检查的填 0。

写 fstab 有个保命技巧:每次修改完之后,先执行mount -a测试一下。如果 fstab 里有错误,mount -a会立刻给出错误信息,这时候还有机会改正。等重启之后系统因为 fstab 错误卡在维护模式,虽然也能救,但就狼狈多了。还有更稳妥的做法,在修改前先备份一份cp /etc/fstab /etc/fstab.bak,真出问题时可以进入救援模式恢复。

swap 分区也会出现在 fstab 里,写法稍有不同:

UUID=xxx none swap sw 0 0

注意挂载点字段写none,文件系统类型写swap,没有实际目录。执行swapon -a就可以启动所有 fstab 中的 swap 条目。

4.3 挂载选项的安全强化思路

很多生产环境对安全有要求,挂载时通过选项做加固是最低成本的方案。nodev、nosuid、noexec这三个选项组合,能有效阻止存放数据的目录中执行特殊文件或创建设备节点。

我的习惯是:如果挂载点是普通数据目录,比如/data、/home,就加nodev,nosuid;如果这个目录明确不需要执行任何程序,比如存备份文件、视频素材,那就把noexec也加上。代价无非是一些脚本执行会受影响,但换来的安全收益在用户可控的共享目录场景下非常明显。这个思路尤其适合多用户环境的共享目录。

5. 磁盘配额:把存储资源关进笼子里

5.1 配额是个什么玩法

磁盘配额解决的是“多用户共享一台服务器,谁把空间吃完了”的问题。比如一个班级的课程项目服务器,每个学生都能写入,如果不设配额,某个人传几个大文件就能把整个磁盘填满,其他人连写临时文件都会失败。

配额分两个维度:用户配额和组配额。用户配额限制单个用户的用量,组配额限制整个组的成员共同消耗的量。这两者配合用,能实现对共享目录的精细控制。

5.2 配额的配置流程

配额配置的整个流程分为五步,每一步都不复杂,但顺序错了就会踩坑:

# 1. 在挂载选项中开启配额功能 # 修改 /etc/fstab 中对应分区,在 mount options 栏加 usrquota,grpquota # 然后重新挂载,让选项生效 mount -o remount /data # 2. 初始化配额数据库(第一次执行会生成 aquota.user 和 aquota.group) quotacheck -cugm /data # 3. 启用配额功能 quotaon /data # 4. 编辑用户配额 edquota -u 某用户名

edquota -u会打开一个编辑器,里面显示两个维度:blocks是磁盘空间占用,inodes是文件数量占用。每个维度都有 soft 和 hard 两个限制。soft 是警告线,超过后会有一个宽限期,宽限期内可以超过,但一直超就会被拒绝写入;hard 是硬限制,到了就立马上报“Disk quota exceeded”,谁来了也没用。

设置完用户配额,组配额用edquota -g,方法一样。最后验证一下实际效果,可以用quota -u 某用户名查看,或者用repquota -a一次性列出所有配额状态。

配额的宽限期默认是 7 天,可以改edquota -t调整。我做过一次实验,把宽限期调成 1 天后,用户第二天就看到警告,几乎不会再出现把磁盘写满然后再来报修的恶性循环。

配额部署后有个副作用要留意:quotacheck在高负载文件系统上会消耗一定的 IO 资源,特别是刚启用的前几次。如果是在生产环境,建议在业务低峰期初始化配额数据库,避免影响白天正在跑的读写任务。

6. LVM:磁盘管理的终极大招

6.1 LVM 的三层抽象搞不明白就白学

LVM(逻辑卷管理器)的核心理念是把“物理存储”和“逻辑存储”解耦。物理层是 PV(物理卷),就是一块块真实的磁盘分区;管理层是 VG(卷组),由多个 PV 聚合成一个存储池;逻辑层是 LV(逻辑卷),从 VG 里切出来的可挂载块设备。

这三层关系可以类比成一个仓库管理系统:PV 是仓库里的货架(物理资源),VG 是整个仓库(统一管理空间),LV 是给每个客户划定的货位(逻辑分配)。没有 LVM 时,货架物理位置决定货位大小,想扩就只能搬东西;有了 LVM,你可以把多个货架的空间动态并进仓库,再灵活调整货位,全程不影响货位上已有的东西。

6.2 从零创建一个完整的 LVM 存储

拿一块新盘/dev/sdb举例,完整流程如下:

# 分区,并把类型设置为 LVM 使用的类型(8E00) fdisk /dev/sdb # 交互命令:g 创建 GPT 分区表,n 新建分区,t 改类型为 8E00,w 写入 # 创建物理卷 pvcreate /dev/sdb1 # 创建卷组 vg_data,把物理卷加入 vgcreate vg_data /dev/sdb1 # 在卷组里创建 200G 的逻辑卷 lv_data lvcreate -L 200G -n lv_data vg_data # 格式化逻辑卷 mkfs.ext4 /dev/vg_data/lv_data # 挂载使用 mount /dev/vg_data/lv_data /data

创建成功之后,用pvs、vgs、lvs三个命令分别查看物理卷、卷组、逻辑卷的当前状态,这在排查问题时非常关键。lsblk也能看到逻辑卷,但层级上 LVM 的设备路径不同于普通分区,它是通过设备映射机制呈现的。

6.3 在线扩容:LVM 存在的最大意义

LVM 真正的杀手锏是空间不够时不用停机拔盘。当/data快满时,假设卷组 vg_data 里还有空间,直接执行:

# 把 lv_data 扩展 50G lvextend -L +50G /dev/vg_data/lv_data # ext4 文件系统同步扩展 resize2fs /dev/vg_data/lv_data # 如果是 XFS 文件系统,用这个命令同步扩展 xfs_growfs /data

lvextend和resize2fs这两条必须在同一窗口连续执行,中间没有业务中断,数据也不会丢。我实际操作过多次,扩展期间正在跑的服务完全不受影响,唯一需要注意的就是文件系统类型对应正确的扩容命令。

如果卷组本身也没空间了,那就得加新盘。新盘分区后执行:

pvcreate /dev/sdc1 vgextend vg_data /dev/sdc1 # 此时再执行上面的 lvextend 命令即可

这套流程是 LVM 最具价值的部分,也是生产环境应对存储瓶颈的标准姿势。基本思路就是:平时把磁盘空间尽量留给卷组统一调配,出问题时在线扩展,不需要动业务。

6.4 缩容操作:能不做就不做

LVM 支持缩容,但缩容的风险远大于扩容,特别是 ext4 文件系统,必须先缩小文件系统再缩小逻辑卷,顺序一旦反了,轻则数据错乱,重则整个文件系统崩溃。

我自己的态度是:不到万不得已不缩容。如果只是临时需要空间,优先考虑用配额限制其他用户、清理过期日志,而不是去缩一个正在使用的逻辑卷。如果真要缩容,必须提前全量备份,在无人访问、umount 的状态下操作,宁慢勿快。

7. 磁盘监控与故障排查:实战中踩过的坑

7.1 磁盘性能监控命令的正确使用姿势

运维里最常见的磁盘故障不外乎三种:空间被占满、IO 延迟飙升、文件系统损坏。工具方面,iostat 和 iotop 是排查性能问题的利器。

# 每 1 秒刷新一次磁盘 IO 状态 iostat -x 1 # 交互式查看每个进程的磁盘读写情况 iotop

iostat 的输出里,%util是设备忙绿率,接近 100% 说明磁盘已经是瓶颈了;await是平均 IO 响应时间,SSD 如果长时间大于 20 毫秒就要留意;svctm现在基本可以忽略,内核新版本里不再可靠。iotop 则能看到具体哪个进程在疯狂读写,定位直接命中。

7.2 空间不足排查的三个经典场景

第一个场景:df -h显示磁盘 100%,但你清了一堆大文件后使用率还没下来。这种情况八成是有进程占用了已删除的文件。Linux 只要允许进程保持对文件的打开句柄,文件即使被rm删除,空间也不会释放。排查命令是lsof | grep deleted,找到对应的进程 PID 后,重启该进程或者让进程释放句柄,空间马上回来。

第二个场景:写文件时提示 “No space left on device”,但df -h显示还有几十 G 余量。这是 inode 用完了的表现,用df -i查看 inode 使用率。这种情况通常是因为目录下生成了海量小文件,比如定时任务每秒钟写一个日志。解决方案是清理旧文件或者改用能存海量索引的文件系统。

第三个场景:系统启动时报文件系统错误,卡在维护模式。这通常是异常断电或强制关机造成的。进入维护模式执行fsck修复即可,但 fsck 对正在挂载中的文件系统是非常危险的,必须mount -o remount,ro或用系统自带的 rescue 模式卸载后再修。修复之前先备份重要数据,fsck 不是什么坏块都能救回来。

7.3 RAID 状态也要及时关注

如果服务器配置了硬 RAID,磁盘故障不是立即可见的,要定期检查 RAID 阵列状态。硬 RAID 工具通常是厂商专用命令,软 RAID 用cat /proc/mdstat查看,发现阵列降级或重建中,第一时间处理故障盘,避免第二块盘也挂掉导致数据全丢。这些辅助检查虽然不直接属于分区和挂载的范畴,但它是磁盘管理体系里绕不过去的一环,我习惯在每周巡检清单里加一条。

8. 最后再分享几条实操心得

这套磁盘管理的流程,我在不同机器上反复操作过很多轮,总结几条通用心得供参考。

第一,所有磁盘操作前都执行一次lsblk -f,确认盘符、文件系统、挂载点三者对应关系。这个习惯帮我避开了至少三次把新盘和系统盘搞混的险情。第二,在 fstab 和 LVM 相关配置上,尽量用 UUID 而不是设备名,这是一劳永逸的稳定性投资。第三,重大磁盘变更之前,留一条数据备份的退路,有时是一句tar命令的事,有时就是把操作窗口放在业务低峰期。

磁盘管理是个越用越有体会的领域,今天这些内容基于常见的 ext4 + LVM 组合,你完全可以根据自己的系统环境做调整。如果你手头有特殊场景,比如文件系统跑在 Btrfs 上、或者用了复杂的软 RAID 组合,建议先在虚拟机里把流程演练一遍,再上真机操作。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询