1. 磁盘分区到底在解决什么问题很多人第一次接触 Linux 磁盘管理都是在装系统那一刻。安装器弹出一个界面问你要不要“自动分区”你点了“是”然后一路下一步系统装好了分区这件事就被抛到脑后。直到某天服务器磁盘满了、要加一块新硬盘、或者想把某个目录单独挂载到另一块盘上才发现自己根本不知道从哪下手。磁盘分区这件事本质上是在一块物理磁盘上划出若干个逻辑区域每个区域可以被独立格式化、独立挂载、独立管理。它解决的问题很具体把系统、数据、日志、备份这些东西隔离开避免一个目录写满把整台机器拖垮让不同用途的数据可以有不同的文件系统、不同的挂载选项、不同的容量规划。对于一台长期运行的服务器来说分区规划得好不好直接决定了后期运维是轻松还是痛苦。这篇文章面向的是有一定 Linux 基础、但没系统学过磁盘管理的读者。不管你是刚接手一台云主机还是准备给本地虚拟机加一块数据盘又或者是想搞清楚fdisk、parted、lsblk这些命令到底怎么配合使用下面这些内容都能直接拿去参考。我会从整体思路讲到具体命令再到实际踩过的坑尽量把每一步背后的原因说清楚而不是只丢一堆命令让你照抄。2. 分区方案的整体设计与选型思路2.1 先搞清楚磁盘、分区、文件系统三者的关系很多人把“分区”和“格式化”混为一谈其实这是两个独立步骤。一块物理磁盘比如/dev/sdb本身只是一堆扇区的集合你没法直接往里面存文件。你需要先在上面划分分区比如/dev/sdb1、/dev/sdb2分区表记录了每个分区的起止位置然后对每个分区做格式化也就是写入文件系统ext4、xfs、btrfs 等这时候分区才真正具备存储文件的能力最后把格式化好的分区挂载到某个目录比如/data你才能通过路径访问它。用生活化的类比磁盘是一块空地分区是你在空地上画的停车位格式化是给每个车位铺上不同材质的地面挂载是把车位编号对应到具体的门牌地址。少任何一步车都停不进去。理解这个链条之后很多命令的用途就清楚了。lsblk看的是磁盘和分区的层级关系fdisk -l看的是分区表细节mkfs做的是格式化mount做的是挂载。它们各管一段不能互相替代。2.2 MBR 和 GPT 怎么选分区表格式是绕不开的第一个决策点。老式的 MBR 分区表最大只支持 2TB 磁盘最多 4 个主分区超过 4 个就得用扩展分区加逻辑分区的嵌套结构管理起来很别扭。GPT 是后来取代它的方案支持远超 2TB 的磁盘默认可以建 128 个分区而且分区表在磁盘头尾各存一份损坏了还能恢复。现在这个时间点除非你面对的是十年前的老硬件或者某些特殊兼容场景否则一律选 GPT。判断当前磁盘用的是哪种格式用fdisk -l看输出里有没有 “Disklabel type: gpt” 或 “dos” 字样就行。如果一块盘已经是 MBR 且你想转 GPT注意转换会清空分区表数据必须先备份。提示云厂商提供的数据盘默认基本都是 GPT但系统盘有时仍是 MBR动手前先用lsblk和fdisk -l确认清楚别想当然。2.3 分区工具的选择fdisk、parted、gdisk 各管什么命令行分区工具主要有三个流派。fdisk是最经典的交互式工具操作直观适合 MBR 和 GPT 的日常分区但处理大于 2TB 的磁盘时老版本会有问题。parted支持脚本化操作一条命令就能完成分区适合写进自动化脚本也支持 GPT 和大容量磁盘。gdisk可以看作是专门为 GPT 设计的 fdisk 替代品交互方式和 fdisk 类似但只认 GPT。我的习惯是手动操作、磁盘不大用fdisk需要脚本化、磁盘超过 2TB用parted纯 GPT 环境且喜欢交互式用gdisk。三者不要混用在同一块盘上反复操作虽然理论上兼容但实际中容易因为对齐或元数据问题出岔子。2.4 容量规划的几个经验数字分区大小怎么分没有标准答案但有几个经验值可以参考。根分区/一般给 20 到 50GB取决于你装多少软件/var如果跑日志密集的服务单独分出来给 50GB 以上避免日志写满根分区/home看用户数据量服务器上通常不大/boot给 1GB 足够现代系统内核和 initramfs 加起来也就几百 MBswap 分区传统建议是内存的 1 到 2 倍但现在内存普遍很大除非你要用休眠功能否则给 4 到 8GB 或者干脆用 swap 文件就够了。这些数字不是死的核心原则是把会快速增长的数据日志、数据库、用户上传单独分区把系统本身和易变数据隔离开。这样即使某个分区写满也不会导致系统无法启动。3. 核心命令与实操要点拆解3.1 动手前必须做的三件事第一件事是确认目标磁盘。lsblk会列出所有块设备输出里能看到磁盘名、大小、挂载点。你要找的是那块没有挂载点、大小对得上的盘。千万别看着/dev/sda就下手那很可能是你的系统盘。第二件事是备份。如果磁盘上已有数据分区操作会破坏分区表数据恢复极其困难能备份就备份。第三件事是确认磁盘没有被挂载。mount | grep sdb或者lsof /dev/sdb都能查正在使用的磁盘没法安全分区。注意fdisk的写入操作在你按下w之前都只是内存中的修改按q可以随时放弃。这个设计很友好但别因此就掉以轻心确认清楚再按w。3.2 用 fdisk 完成一次标准分区假设我们要给/dev/sdb分一个区占满整块盘。先执行fdisk /dev/sdb进入交互界面。输入p查看当前分区表确认是空盘或者你准备清空的盘。输入g创建新的 GPT 分区表如果是 MBR 就输o。然后输入n新建分区分区号默认 1起始扇区直接回车用默认值结束扇区也回车用默认值这样就会占满整块盘。最后输入w写入并退出。整个过程里起始扇区的默认值很关键。现代分区工具默认会做 1MiB 对齐也就是起始扇区从 2048 开始这个对齐对 SSD 性能和寿命都有好处。如果你手动指定了一个不对齐的起始扇区虽然能用但性能会打折扣。所以除非有特殊需求起始和结束扇区都直接用默认值最省心。分区完成后用partprobe /dev/sdb或者partx -u /dev/sdb让内核重新读取分区表然后lsblk就能看到/dev/sdb1了。3.3 用 parted 做脚本化分区如果要在自动化脚本里分区parted更合适。一条命令搞定parted -s /dev/sdb mklabel gpt mkpart primary ext4 0% 100%。这里的-s表示脚本模式不进入交互mklabel gpt创建 GPT 分区表mkpart primary ext4 0% 100%创建一个从 0% 到 100% 的主分区文件系统标记为 ext4注意这只是标记实际格式化还要单独做。parted的百分比写法很实用不用去算扇区号。但要注意parted对已有分区的修改是立即生效的没有 fdisk 那种“确认后才写入”的缓冲所以命令敲下去之前一定要看清楚设备名。3.4 格式化mkfs 的参数怎么选分区建好后用mkfs.ext4 /dev/sdb1就能格式化成 ext4。如果想用 xfs就mkfs.xfs /dev/sdb1。ext4 和 xfs 是 Linux 上最常用的两个文件系统ext4 兼容性好、工具链成熟xfs 在大文件和高并发场景下表现更好很多发行版默认已经转向 xfs。格式化时有个参数值得关注-L可以给文件系统打标签比如mkfs.ext4 -L data /dev/sdb1之后挂载时可以用LABELdata代替设备名。这在设备名可能变化的场景下很有用比如 USB 设备插拔后/dev/sdb变成/dev/sdc用标签挂载就不会出错。还有一个参数是-m控制 reserved blocks 的比例默认 ext4 会保留 5% 的空间给 root。对于纯数据盘这个比例可以调到 1% 甚至 0能多出不少可用空间。命令是mkfs.ext4 -m 1 /dev/sdb1。3.5 挂载与开机自动挂载临时挂载用mount /dev/sdb1 /data就行但重启后就没了。要开机自动挂载得改/etc/fstab。一行典型的配置是/dev/sdb1 /data ext4 defaults 0 2六个字段分别是设备、挂载点、文件系统类型、挂载选项、dump 标志、fsck 顺序。最后那个2表示开机时做文件系统检查根分区是1其他分区用2不需要检查的用0。改完 fstab 后千万别直接重启测试。先用mount -a让系统重新读取 fstab 并挂载所有条目如果没有报错说明配置正确。如果 fstab 写错了导致系统启动失败那就要进救援模式了很麻烦。提示用 UUID 代替设备名更稳妥。blkid /dev/sdb1能看到分区的 UUID把它写进 fstab 的第一列即使设备名变化也不会挂载错。4. 完整实操流程与现场记录4.1 场景设定与前期检查假设我们有一台服务器新加了一块 100GB 的数据盘/dev/sdb目标是把它分成一个区格式化为 ext4挂载到/data并设置开机自动挂载。先做前期检查。执行lsblk输出里应该能看到sdb这块盘大小 100G没有挂载点下面也没有子分区。再执行fdisk -l /dev/sdb确认它没有分区表或者分区表是空的。然后用df -h看一下当前挂载情况确认/data目录还不存在或者是个空目录。这几步看起来简单但实际运维中出问题往往就是因为跳过了检查。我见过有人把系统盘当成数据盘分区也见过/data目录下已经有数据却直接挂载覆盖的情况。多花三十秒确认能省掉几小时的恢复时间。4.2 分区操作全过程确认无误后执行fdisk /dev/sdb。在交互界面里依次输入g创建 GPT 分区表n新建分区分区号 1起始和结束扇区都回车用默认p预览分区表确认分区大小是 100Gw写入并退出退出后执行partprobe /dev/sdb再lsblk确认/dev/sdb1已经出现。这一步如果lsblk没显示新分区可能是内核没刷新partprobe就是干这个的。4.3 格式化与参数确认执行mkfs.ext4 -L data -m 1 /dev/sdb1。命令跑完后会输出文件系统信息包括块数、inode 数、日志配置等。重点确认两件事一是没有报错二是文件系统类型确实是 ext4。可以用blkid /dev/sdb1再看一眼输出里应该有TYPEext4和LABELdata。-m 1这个参数把保留块从 5% 降到 1%100GB 的盘能多出大约 4GB 可用空间。对于纯数据盘这个调整很划算。但如果是系统盘建议保持默认因为保留块在磁盘快满时能给 root 留出操作余地。4.4 挂载与 fstab 配置先创建挂载点mkdir -p /data。然后临时挂载mount /dev/sdb1 /data。用df -h确认/data已经挂上容量对得上。接下来配置开机自动挂载。先用blkid /dev/sdb1拿到 UUID假设是a1b2c3d4-...。编辑/etc/fstab加一行UUIDa1b2c3d4-... /data ext4 defaults,noatime 0 2这里我加了noatime选项表示不记录文件的访问时间。对于数据盘来说访问时间基本没用关掉它能减少磁盘写入提升性能。改完保存执行mount -a测试。如果没有输出说明配置正确。再用findmnt /data确认挂载选项里包含了noatime。4.5 验证与收尾最后做一次完整验证。lsblk -f能看到/dev/sdb1的文件系统类型、标签、UUID 和挂载点。df -h /data确认容量和可用空间。往/data里写个测试文件echo test /data/test.txt然后cat /data/test.txt确认读写正常。删除测试文件收工。如果这是一台生产服务器建议在业务低峰期操作并且提前通知相关方。分区和格式化本身很快但挂载点变化可能影响依赖/data的服务需要提前规划好。5. 常见问题与排查技巧实录5.1 分区后 lsblk 看不到新分区这是最常见的问题原因通常是内核没有重新读取分区表。解决办法就是partprobe /dev/sdb或者partx -u /dev/sdb。如果还不行blockdev --rereadpt /dev/sdb也能强制刷新。极端情况下需要重启但生产环境尽量别走到这一步。还有一种可能是分区表写入了但没生效用fdisk -l /dev/sdb确认分区表里确实有分区。如果 fdisk 能看到但 lsblk 看不到那就是内核缓存问题刷新即可。5.2 格式化时报“设备正忙”mkfs报Device or resource busy说明分区正在被使用。用mount | grep sdb1查是否已挂载用lsof /dev/sdb1查是否有进程占用。如果有挂载先umount如果有进程占用找到进程处理掉再操作。还有一种情况是 swap 分区正在使用需要先swapoff。5.3 fstab 写错导致系统启动失败这是最危险的情况。如果 fstab 里的设备或 UUID 写错系统启动时会卡在挂载阶段进入紧急模式。解决办法是在紧急模式下用 root 登录把 fstab 改回正确内容或者把出错的行注释掉然后mount -a测试重启。预防措施就是改完 fstab 一定先mount -a测试别直接重启。另外fstab 里可以用nofail选项表示即使挂载失败也不阻塞启动适合非关键数据盘。5.4 分区对齐问题如果分区时手动指定了起始扇区可能造成不对齐。判断方法是用parted /dev/sdb align-check optimal 1输出aligned就没问题。不对齐的话SSD 性能会下降机械盘也会有额外寻道开销。解决办法是删掉分区重建用默认起始扇区。5.5 扩容分区但不丢数据如果分区后面还有空闲空间可以用growpart /dev/sdb 1扩展分区然后resize2fs /dev/sdb1ext4或xfs_growfs /dataxfs扩展文件系统。这两个操作都可以在线进行不需要卸载。但前提是分区后面确实有连续空闲空间如果空闲空间在分区前面那就没法直接扩。5.6 常见问题速查表问题现象可能原因解决办法lsblk 看不到新分区内核未刷新分区表partprobe 或 partx -umkfs 报设备正忙分区已挂载或被占用umount 或结束占用进程开机卡在挂载阶段fstab 配置错误紧急模式修正 fstabSSD 性能不达预期分区未对齐parted align-check 检查扩容后容量没变只扩了分区没扩文件系统resize2fs 或 xfs_growfs设备名变化导致挂载失败用了 /dev/sdX 而非 UUIDfstab 改用 UUID6. 几个容易被忽略的细节和经验6.1 分区前用 wipefs 清理旧签名如果一块盘之前用过上面可能残留旧的文件系统签名或分区表。直接分区有时会出问题比如mkfs报“已有文件系统”。这时候用wipefs -a /dev/sdb可以清除所有签名让磁盘回到干净状态。这个命令很快但会破坏数据确认清楚再用。6.2 SSD 的 TRIM 和挂载选项SSD 做数据盘时挂载选项里加discard可以启用在线 TRIM但频繁 TRIM 可能影响性能。更推荐的做法是定期执行fstrim -av用定时任务每周跑一次。挂载选项里用noatime减少写入对 SSD 寿命也有好处。6.3 大磁盘用 parted 而非 fdisk超过 2TB 的磁盘老版本 fdisk 会报错或者只能识别部分容量。虽然新版 util-linux 里的 fdisk 已经支持 GPT 和大磁盘但为了保险大磁盘一律用 parted 或 gdisk。parted 的百分比写法在大磁盘上尤其方便不用去算扇区号。6.4 保留块比例的取舍前面提到-m 1能多出可用空间但这不是无脑调的。如果分区是根分区或者存放关键系统文件保留块是磁盘满时的救命稻草建议保持 5%。如果是纯数据盘、日志盘调到 1% 甚至 0 都没问题。判断标准就是这个分区写满会不会导致系统不可用。6.5 用 LVM 还是裸分区如果服务器需要灵活调整分区大小LVM逻辑卷管理比裸分区方便得多。LVM 可以在线扩容、跨盘组合、做快照。但 LVM 多了一层抽象出问题时排查更复杂性能也有轻微损耗。我的建议是系统盘用 LVM数据盘如果容量规划明确就用裸分区如果预期会频繁调整就用 LVM。6.6 分区操作的时间窗口分区和格式化本身很快100GB 的盘格式化也就几秒到几十秒。但如果是大容量机械盘格式化可能耗时较长因为要写入 inode 表和日志。生产环境操作尽量选业务低峰期并且提前做好回滚方案。如果是云主机很多云厂商支持在线扩容云盘扩容后需要在系统内扩展分区和文件系统流程和前面说的一样。我个人在实际操作中的体会是磁盘分区这件事命令本身不难难的是前期确认和后期验证。每次动手前多问自己几句这块盘对吗数据备份了吗挂载点规划好了吗fstab 测试过了吗把这几个问题回答清楚基本就不会出大问题。踩过几次坑之后我现在养成的习惯是任何分区操作都先在测试环境走一遍确认无误再上生产。这个习惯看起来费事但比出事后救火省心得多。