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 加起来也就几百 MB;swap 分区传统建议是内存的 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,之后挂载时可以用LABEL=data代替设备名。这在设备名可能变化的场景下很有用,比如 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再看一眼,输出里应该有TYPE="ext4"和LABEL="data"。-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,加一行:UUID=a1b2c3d4-... /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/sdb1(ext4)或xfs_growfs /data(xfs)扩展文件系统。这两个操作都可以在线进行,不需要卸载。但前提是分区后面确实有连续空闲空间,如果空闲空间在分区前面,那就没法直接扩。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 测试过了吗?把这几个问题回答清楚,基本就不会出大问题。踩过几次坑之后,我现在养成的习惯是,任何分区操作都先在测试环境走一遍,确认无误再上生产。这个习惯看起来费事,但比出事后救火省心得多。
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 加起来也就几百 MB;swap 分区传统建议是内存的 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,之后挂载时可以用LABEL=data代替设备名。这在设备名可能变化的场景下很有用,比如 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再看一眼,输出里应该有TYPE="ext4"和LABEL="data"。-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,加一行:UUID=a1b2c3d4-... /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/sdb1(ext4)或xfs_growfs /data(xfs)扩展文件系统。这两个操作都可以在线进行,不需要卸载。但前提是分区后面确实有连续空闲空间,如果空闲空间在分区前面,那就没法直接扩。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 测试过了吗?把这几个问题回答清楚,基本就不会出大问题。踩过几次坑之后,我现在养成的习惯是,任何分区操作都先在测试环境走一遍,确认无误再上生产。这个习惯看起来费事,但比出事后救火省心得多。