
磁盘分区这活儿说难不难说简单也绝对不简单。玩Linux这些年从当年拿fdisk瞎折腾的小白到后来在线上环境动分区表手心冒汗的老油条我踩过的坑和见过的事故够写一部血泪史。很多时候服务器上一个误操作数据就跟你say goodbye了而这个误操作往往就发生在分区和格式化这一步。这篇文章就用我自己的实操经验把fdisk、parted、mkfs这三板斧彻底讲透。我会结合大量实战场景把每一步的原理、参数计算、避坑技巧都交代清楚不是那种抄文档的复读机而是真正能让你照着做、做完能放心重启的那种。无论你是刚接触Linux的初学者还是已经负责运维、准备要在生产环境动刀的工程师这篇文章都能给你一套完整的、逻辑自洽的操作心法。读完你会发现磁盘分区不光是敲几条命令那么简单它背后是一套关于数据安全、系统稳定性和性能权衡的哲学。1. 工具选型与总体设计思路先搞清楚你手里的牌很多人上来就敲fdisk /dev/sdb这是典型的思路不清。分区之前必须先明确你的需求磁盘多大机器是BIOS引导还是UEFI引导未来要不要扩容这直接决定了你该用哪个工具、建什么分区表。1.1 为什么首选 parted 而不是老牌 fdiskfdisk确实是老牌工具在MBR时代它就是事实标准。但它的能力边界非常明显对于超过2TB的磁盘MBR分区表根本玩不转。MBR的分区表项只有64字节最多记录4个主分区每个分区起始扇区用32位来记录最大寻址范围就是2TiB左右。这是硬限制不是软件能绕过去的。所以我的原则很简单2TB以下、BIOS引导的老机器用fdisk简单直接。2TB以上、UEFI引导的新机器用parted它专门为GPT设计。需要非交互式脚本化操作用parted的-s模式也就是parted -s /dev/sdb ...这种写法可以写进脚本里在无人值守的裸机安装场景非常常见。甚至在GPT分区场景下我更推荐你优先考虑gdisk也就是fdisk的GPT版本它对分区的操作更安全、提示也更友好。不过parted的优势在于一个工具通吃MBR和GPT而且很多自动化脚本比如Kickstart、Cloud-init的分区阶段都依赖它。所以我的建议是都学fdisk 保底parted 为主力gdisk 作为交叉验证。1.2 GPT 与 MBR 的抉择不是越新越好先说结论GPT是当前的标准除非你有老系统兼容性的病否则新盘一律GPT。但MBR也绝不是一无是处。在很小型的嵌入式设备、要求极度精简的场景下MBR的简单结构反而是一种优势。另一个常见误区是UEFI必须配GPTBIOS必须配MBR。实际上很多现代主板虽然支持UEFI但同时提供CSM兼容性支持模块可以引导MBR磁盘上的传统系统。反过来也有部分比较妖的系统能支持从GPT磁盘上的特定分区用BIOS方式引导但代价是需要一个特殊的BIOS引导分区BIOS Boot Partitionparted里把这个分区类型叫bios_grub。为什么要特意说这个因为我在装双系统的时候踩过这个坑。当时一块2TB的硬盘想装Windows和Linux双系统。Windows要求UEFIGPT而我想保留一个老的Linux发行版引导方式结果系统死活不引导。后来才搞明白GPT磁盘上创建了分区但忘了留一个bios_grub分区GRUB没有落脚的安放点。所以纯UEFI机器GPT必留一个efi类型分区通常100MB~512MB。传统BIOS机器但磁盘大于2TBGPT需要留bios_grub分区通常1MB来放置GRUB的第二阶段。传统BIOS机器且磁盘小于2TBMBR一切照旧。这张表整理一下就是我每次做事之前必看的东西场景分区表类型引导方式必须预留分区现代UEFI大容量GPTUEFIEFI System Partition老BIOS大容量GPTBIOS/CSMBIOS Boot Partition老BIOS小容量MBRBIOS无GRUB直接写入MBR区域1.3 精心规划布局先画图再动刀我发现很多新人最大的问题不是不会敲命令而是从不规划直接上手对一块硬盘进行连环parted操作。分区不可怕可怕的是你连分区表恢复都没做过就上了生产机器。在动手之前我建议你至少花10分钟回答以下问题这块盘是做什么用的系统盘还是数据盘要分几个区每个区挂载到哪个目录数据增长速度快不快未来有没有扩容需求是定长分区fixed size还是LVM逻辑卷这些问题的答案直接决定了分区表长什么样。比如数据盘我一般只有一个大分区挂到/data下。系统盘则是标准的/boot、/、swap、/home这种布局如果是桌面系统或者干脆就/boot加一个根分区加swap服务器场景减少不必要I/O提升故障恢复速度。如果未来有扩容的需求我强烈建议你不是在裸设备上做分区而是把整块盘做成LVM PV然后再从中切LV。别嫌麻烦等到哪一天数据快满了你就能体会到LVM的妙处——直接在线扩大逻辑卷完全不需要停机迁移数据。这和直接分区定死大小的方案是两种截然不同的运维哲学后者省事前者省心。2. 动手前的震场准备与安全措施不战而屈人之兵进入实操之前还有一道必备工序确认你正在操作的盘确实是你要操作的那块。这里出过一次事故阴影至今难以散去所以请务必不要跳过这一步。2.1 设备识别与确认盘身份的硬核检查在Linux下设备名并不总是稳定的尤其是如今各种虚拟机、云盘、NVMe设备混在一起。/dev/sda和/dev/sdb的顺序不能保证永远不变。这也是为什么很多生产环境坚持使用UUID挂载的原因。对待一块新盘我会先用这些命令把它的底细摸清楚# 查看所有块设备重点关注磁盘大小和挂载点 lsblk # 查看设备详细信息确认厂商、序列号、大小 fdisk -l /dev/sdb # 查看所有磁盘的型号与序列号防止串盘 ls -l /dev/disk/by-id/这里重点说lsblk的输出它会把设备树状列出来关系一目了然。如果sdb下面没有任何分区说明是块干净的盘可以放心操作。如果已经有分区而且被显示为挂载在某目录下绝对不要直接对它分区。我见过太多人拿着fdisk -l显示的大容量磁盘名字结果是对着系统盘进行操作然后整个系统崩溃的。另外一个小技巧新盘拿到手建议直接用wipefs -a /dev/sdb清掉所有已有的分区表和文件系统签名。尤其是在云平台上购买的临时盘、或者从别人手里接过来的二手盘上面很可能残留着奇怪的分区信息这会导致后续操作出现各种灵异事件。# 直接清除分区间签名相当于把盘重置为出厂状态 wipefs -a /dev/sdb注意这条命令会抹掉盘上所有数据做之前务必确认是空盘我一般是对新购入的整块盘执行这个。2.2 备份的关键认知不止是文件备份还有分区表备份很多指导文档都会说操作前备份数据但极少人会告诉你分区表也要备份。我们日常理解的备份是把文件拷贝出去而分区表是描述磁盘布局的元数据它一旦损坏系统就不知道该从哪个扇区开始读写文件系统。在操作前我会顺手导出当前分区表作为事故后的还原依据# 对于GPT分区表 sgdisk --backup/root/gpt_backup_sdb /dev/sdb # 对于MBR分区表 dd if/dev/sdb of/root/mbr_backup_sdb bs512 count1前者导出的是完整的GPT分区表包括备份分区表后者是MBR包含了引导代码和分区表项。别看这些文件小几KB真到了要救命的时候这就是唯一的稻草。另外如果是系统盘我更倾向于用sfdisk -d /dev/sda /root/partition_layout.dump这种形式它导出的不是二进制而是可读的文本描述后续用sfdisk /dev/sda partition_layout.dump就能恢复布局。2.3 防止误操作的最后一道保险确认没有进程占用分区之前需要对磁盘上的文件系统进行卸载。我用的是组合拳# 卸载所有相关分区 umount /dev/sdb* # 查询正在使用该分区的进程如果有就得先kill掉 lsof /dev/sdb1 fuser -v /dev/sdb1如果出现target is busy或者Device or resource busy的提示说明有程序正在使用这块盘。绝对不要强行卸载或者直接分区那样很可能引起内核I/O错误轻则报错重则导致整个系统卡死。更稳妥的做法是找到进程并优雅退出等待I/O完成后再操作。另外记得检查一下swap是否用在这个盘上# 查看swap分区对应的设备 swapon --show # 如果在这个盘上先关闭swap swapoff /dev/sdb1这一步忘掉的代价很惨重我有一次在给一块带swap的盘重新分区时没有先swapoff结果整个操作过程中虽然命令执行成功了但一重启系统就彻底起不来了。3. fdisk 实操精要经典MBR分区的完整打法前期的盘确认和备份都做完了现在正式进入实操阶段。先拿经典场景开刀给一块1TB的SATA盘/dev/sdb做MBR分区规划一个500GB的数据分区剩下的空间留着不用。3.1 进入 fdisk 交互界面与核心指令熟记启动方式并不复杂直接指定设备进入交互模式fdisk /dev/sdb进去之后提示符会变成Command (m for help):。新手最容易卡壳的就是不知道按什么键。我把最常用的几个命令总结一下p打印分区表。每次操作前都按一次防止看错。n新建分区。d删除分区。t修改分区类型ID。w写入分区表并退出。q不保存退出。x进入专家模式非特殊情况别用。在这个交互界面里所有的修改都不会立刻生效系统会等你在最后输入w时才会一次性提交。这也是fdisk最友好的地方误操作了不按w直接q就全身而退。3.2 分区的扇区对齐问题为什么你该关心起始扇区新建分区时fdisk会问你起始扇区和结束扇区。默认值通常是2048这个数字不是随便定的。老式硬盘Advanced Format4096字节扇区物理盘允许逻辑扇区也是512字节但物理读写的最小单位是4096字节。为了性能分区起始要跟物理扇区对齐。2048这个数字恰好是4K对齐的2048 × 512 1048576 字节 1024 KiB正好是1024K的整数倍所以它天然满足对齐要求。分区不对齐的结果是什么读写性能断崖式下跌尤其是随机读写有时候甚至能掉70%的IOPS。这在SSD和NVMe设备上表现得尤其明显。所以记住新盘分区起始扇区不要手动改成1直接回车使用默认值2048。示例操作序列直接照着来Command (m for help): n Partition type p primary e extended Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-1953525167, default 2048): Using default value 2048 Last sector, sectors or size{K,M,G} (2048-1953525167, default 1953525167): 500G Partition 1 of type Linux and of size 500 GiB is set这里500G是一个非常实用的语法不用去计算该输入多少扇区数直接给大小就行。fdisk会自动换算成扇区数。如果想分成整块盘直接回车表示默认使用剩余全部空间。3.3 调整分区类型从 Linux 到 Linux LVM如果是普通的文件系统分区默认的0x83Linux类型就够了不需要改。但如果这块盘要作为LVM物理卷或者你是为了后续使用软RAIDmdadm那就得把分区类型改成对应的值。Command (m for help): t Selected partition 1 Hex code (type L to list all codes): 8e Changed type of partition Linux to Linux LVM8E是LVM的十六进制代码如果你要用作软RAID就是fd。顺带说一句如果你忘了准确代码t之后输入L可以列出所有类型的列表不用去死记。全部设置好后先按p检查一下无误再按w写入。写入完成后分区表会在内核中重新被读取通常就能看到新的/dev/sdb1了。3.4 fdisk 的老毛病“Partition table entries are not in disk order”用fdisk操作一块已经有多个分区的磁盘时偶尔会碰到提示Partition table entries are not in disk order。这听起来像是什么致命错误其实没那么严重。它说明你创建的分区编号和它在磁盘上的物理顺序不一致比如先分了一个sdb2再分sdb1。虽然大多数情况下Linux能正常识别这种分区表但某些老旧的操作系统或引导程序可能就识别不了导致某些分区不可用。修复方式很简单在fdisk交互界面里按x进入专家模式然后按ffix它会把分区编号按物理顺序重新整理一遍。整理完按w写回即可。4. parted 进阶玩法轻松驾驭 GPT 与超大容量磁盘现在把眼光放到2TB以上、现代UEFI服务器的主流场景。这里的主角是parted。它和fdisk的最大区别是parted的修改基本是即时生效的如果你误操作了没有按q不保存这个救命的选项。所以用 parted 必须格外谨慎每一步都得想清楚了再执行。4.1 初始化分区表mklabel 的正确姿势拿到一块8TB的新盘直接进入交互模式进行初始化parted /dev/sdb GNU Parted 3.2 Using /dev/sdb Welcome to GNU Parted! Type help to view a list of commands. (parted) mklabel gptmklabel gpt就是将整个磁盘的分区表格式改为GPT。这里务必想清楚mklabel会清空整块盘上所有的分区表信息包括已存在的分区和数据。如果盘上已有旧数据这里会直接抹掉所有痕迹。如果搞不清自己是MBR还是GPT可以用print命令查看(parted) print Model: ATA WDC WD80EFZX-68 (scsi) Disk /dev/sdb: 8001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags:注意Sector size (logical/physical): 512B/4096B这一行逻辑扇区512字节物理扇区4096字节物理对齐是4K。在做分区的时候如果不注意对齐又会引发跌性能的问题。4.2 实战创建 GPT 分区mkpart 语法详解现在规划一个8TB数据盘分两个区一个1TB的分区一个7TB的分区多余的空间留出来做备份区域。在parted提示符下操作(parted) mkpart primary 0% 12% (parted) mkpart primary 12% 100%这里我用了百分比而不是扇区数或具体大小。好处很明显不用去推算磁盘总扇区数parted自动换算。而这里的primary是GPT时代的分区类型名实际上在GPT里所有分区都是主分区没有逻辑分区和扩展分区的概念但parted为了语法统一还是要求你填一个。如果我想指定具体大小呢比如明确要1TB和一个剩余全部可以这样(parted) mkpart primary ext4 1MiB 1001GiB这个1MiB起始位置其实是刻意为之。它要求分区从1MiB处开始这样物理对齐4K扇区不会有任何偏斜。而且用MiB而不是MB是因为MB是百万字节十进制MiB是1048576字节二进制硬盘厂商标注的1TB在二进制下是不到1TiB的用MB会引发混乱。4.3 对齐验证必杀技align-check 的实际意义分区创建完之后务必做一次对齐检查这是硬性要求(parted) align-check optimal 1 1 aligned (parted) align-check optimal 2 2 alignedoptimal是让parted检查分区起始位置是否与设备的I/O最优边界最典型的就是物理扇区和RAID stripe大小对齐。只要是返回aligned就说明分区起始位置是对的可以放心使用。如果报错not aligned应该立刻删除该分区重建而不是将错就错。部分资料会建议你用align-check minimal这个只验证与物理扇区大小对齐要求更低。我习惯只用optimal标准严一点总没坏处。操作完成输入quit退出然后可以用partprobe或udevadm settle让内核重设备文件。# 通知内核重新读取分区表不需要重启机器 partprobe /dev/sdb顺便说一句如果你是在虚拟化环境中创建新盘partprobe往往还不够需要echo 1 /sys/block/sdb/device/rescan或者干脆重新扫描SCSI总线新盘由虚拟机管理平台挂载上来时经常需要扫描才能出现。4.4 parted 的终极形态非交互脚本化操作我得坦白说虽然上面展示的是交互式操作但在生产环境里我几乎不用交互模式而是直接用 bash 脚本处理。除了效率高、可复制更重要的是能避免手滑输错。parted -s /dev/sdb mklabel gpt parted -s /dev/sdb mkpart primary ext4 1MiB 100%-s代表脚本模式script完全不需要人工干预。而在脚本模式里mkpart primary ext4 1MiB 100%这里的ext4其实不是必须的它只是给分区打一个文件系统类型的标签在GPT分区表里它对应的PARTLABEL不影响最终实际使用什么文件系统。这种写法在实际部署中非常有用比人肉敲交互命令稳得多。而且它可以串联到批量部署工具Ansible、Puppet里实现全自动装机。5. mkfs 格式化把分区变成可用的文件系统分区表只是划分了边界真正的数据能往里放还得靠mkfs在分区上创建文件系统。这一步选错了文件系统类型后续想改等于数据全没了再重新来过所以必须提前想清楚。5.1 文件系统三巨头ext4、xfs、btrfs怎么选讲mkfs之前先解决选型问题。这是所有新人在格式化前都会卡住的一个问题。文件系统适用场景最大单文件最大卷ext4通用场景兼容性最好16TiB1EiBxfs大规模数据、视频流媒体8EiB8EiBbtrfs需要快照、压缩、校验和的高级用户16EiB16EiB我的经验之谈绝不出错的选择是 ext4。它稳定了十几年几乎所有Linux发行版都原生支持作为根文件系统、数据文件系统都适用。如果不知道怎么选选ext4准没错。xfs 的优点是高扩展性它可以扩展到极大的容量8EiB适合大量大文件的场景比如视频素材、数据库文件。btrfs 功能最丰富支持写时复制、快照、自我修复但也因为复杂偶尔会有一些新特性导致的坑不会折腾的话还是少碰为妙。绝不推荐把数据盘格式化成 swap或者vfat类型当作长期数据盘使用除非你有特殊的跨平台需求。5.2 mkfs.ext4 实操参数块大小与 inode 密度的学问假设刚才用 parted 创建了一个 2TB 的分区/dev/sdb1现在把它格式化成 ext4mkfs.ext4 /dev/sdb1直接这样格式化使用的是mkfs.ext4的默认参数通常适用大多数场景。但如果你了解背后的含义就能做更有针对性的优化。块大小block size默认是4096字节4K。这是文件系统分配空间的最小单位。一个大分区16TB用4K块没问题但如果有大量小文件比如几KB的配置文件、日志碎片4K块会造成一定的空间浪费。调小块大小到1024字节能省空间但会碎片化严重降低大文件顺序读写的效率。除非特殊场景否则请保持4K默认。inode 密度决定了文件系统最多能创建多少文件和目录。默认每16KB空间一个inode也就是说一个2TB分区约能创建1.3亿个文件。这绝对够用了。但如果你知道自己要存几千万个小文件就得考虑用-i 8192调高一点inode密度。# 指定块大小1KB该场景更适合大量小文件 mkfs.ext4 -b 1024 -i 8192 /dev/sdb1如果这将是系统盘别忘了在格式化时给根分区加-L卷标便于后续写fstab时按卷标挂载。mkfs.ext4 -L ROOT /dev/sda2mkfs.ext4执行完毕后会输出一个Superblock backups stored on blocks:的列表这是超级块备份的位置出故障时能用e2fsck -b指定备份块进行修复。建议截图或记下来尤其是对一些重要的文件系统。5.3 mkfs.xfs 实操要点大文件系统的性能偏好在红帽系RHEL/CentOS/Fedora系统里xfs 已经是默认文件系统。格式化命令大同小异mkfs.xfs /dev/sdb1xfs 有一些独特的点它不支持缩小shrink操作只能扩展。所以给xfs分区定初始大小时宁可小一点留出扩展空间也别一步到位巨大无比否则以后想缩是不可能的。它有reflink 特性支持文件共享物理块做快照、克隆时非常高效。格式化时也支持-L指定卷标。初始化完成后紧接着就是挂载了。我的习惯是mkdir -p /data mount /dev/sdb1 /data # 查看挂载情况和文件系统详情 df -hT /data如果希望开机自动挂载务必使用UUID而不是设备名。要获取UUID用blkidblkid /dev/sdb1然后把它写入/etc/fstab# 形如 UUIDxxxx-xxxx /data ext4 defaults 0 0这里可以说一个坑开机自动挂载这步如果写错服务器可能会起不来因为fsck挂载失败或挂载顺序错误。所以我每次写完fstab都会先执行mount -a测试下配置没报错再重启。5.4 struct 的万能补充mkfs 生产环境需要不要-E lazy_itable_init看到这个标题你可能没太大感觉但我真是被它坑过。当在机械硬盘上格式化大分区时如果直接执行mkfs.ext4系统会在背后执行一次很慢的inode表初始化。1TB的盘有时候要等好几分钟。实际上在云环境和虚拟机上这一步完全可以延后。# 延迟inode表初始化立即返回后台慢慢补 mkfs.ext4 -E lazy_itable_init1,lazy_journal_init1 /dev/sdb1这样格式化完系统立即就能用初始化的工作会在后台缓慢进行。对于追求更换数据盘效率的运维人员来说这是一个几乎没有副作用、却能让操作快好几倍的参数。当然在物理机的老式机械盘上我反而不太用这个参数因为如果初始化没做完的时候突然断电等开机时文件系统检查会很麻烦。6. 常见问题与真实故障排查实录分区、格式化看着就几条命令但实际工作中遇到的问题千奇百怪。我把这些年踩过的一些典型的坑整理成速查表并附上我的排查思路。6.1 分区表已写入但系统就是看不到新分区这是最适合新手的热身问题。你执行完parted或fdisk结果lsblk列表里就是没有新分区出现。这时不用慌也不需要重启虽然重启一定有效但生产环境不现实。排查顺序如下确认分区表确实写入了。fdisk -l /dev/sdb或gdisk -l /dev/sdb能看到分区信息。通知内核重读分区表。用partprobe /dev/sdb或udevadm settle。如果上面还没出现可能是内核持有旧分区表缓存用blockdev --rereadpt /dev/sdb强制刷新。还是不行多半是设备在虚拟机里没有触发SCSI重新扫描去/sys/class/scsi_device/找对应设备执行echo 1 /sys/class/scsi_device/2:0:0:0/device/rescan。这个过程中最忌讳的事就是看着没反应又去执行一遍mkfs因为此时内核还在用旧的分区表mkfs可能直接从磁盘开头开始写把整个分区表结构都破坏掉。6.2 删除分区时提示 target is busy想删掉一个分区结果系统提示target is busy。这个问题的本质是分区正被系统进程使用。我总结的排查处理流程# 1. 查看挂载情况 mount | grep sdb1 # 如果有挂载卸载 umount /sdb1 # 2. 检查是否有进程占用 lsof /sdb1 fuser -v /sdb1 # 如果有进程先停掉进程 # 3. 如果分区是swap记得swapoff swapoff /dev/sdb1如果在lsof和fuser里都看不到进程但还是提示 busy那就用df看看是不是有LVM正在使用它df -h lvs pvs如果分区被某个LVM卷组纳入那它自然会被占用。需要先lvremove和vgremove处理干净。6.3 mkfs 执行报错无法打开设备 /dev/sdb1报错信息类似这样mkfs.ext4: Device /dev/sdb1 not found这种问题95%的概率是分区根本没有成功创建。可能的原因很多比如GPT分区表没有备份区、parted脚本模式没加-s导致被参数打断或者设备名写错了。我的排查思路是先把lsblk输出拉出来看看/dev/sdb1是否存在。如果压根没有用parted -s /dev/sdb print看分区表内容。如果分区表显示分区存在但/dev/sdb1不出现大概率是内核重读失败用partprobe或blockdev --rereadpt再来一遍。如果实在查不出可以用ls -l /dev/sdb*来对比看待创建时间和权限偶尔会遇到udev的权限规则问题比如容器环境里udev没有正常创建设备节点。6.4 挂载时报错wrong fs type, bad option, bad superblock这个报错是最经典的文件系统问题之一。在你挂载一个分区时系统提示mount: /data: wrong fs type, bad option, bad superblock on /dev/sdb1, missing codepage or helper program, or other error.如果是第一次挂载新分区就出这个错最有可能是格式化没有成功或者格式化的目标写错了。我先教你看superblock# 检查文件系统类型 blkid /dev/sdb1如果blkid完全没输出大概率是文件系统没建成功。再检查下你是用 root 身份执行的mkfs吗用普通用户去执行mkfs只会收到权限错误。还有另一种情况是ext4分区损坏超级块丢失。可以尝试e2fsck -f -y /dev/sdb1修复。这里-y是自动回答 yes属于一键修复。修复完再挂载。如果是因为分区类型标记不对比如提前把分区类型设成了 LVM但里面建了 ext4mount 一般也不受影响因为mount检测的是分区上的文件系统签名而不是分区表类型。所以大部分时候你可以不用纠结这个。6.5 使用 parted 时出现 “Error: Partition(s) on /dev/sdb are being used” 是怎么回事有些版本或特定场景下parted会检查磁盘上的挂载状态。如果在系统还在使用这些分区时执行parted /dev/sdb会遇到类似的报错阻断操作。处理办法和上面“target is busy”一样释放所有分区占用。这里我特别强调一下顺序先卸载文件系统再关闭swap再注销LVM。有一种特殊情况是root 分区无法卸载因为根目录正在使用。如果你是想给根分区扩大容量那就不能在线做需要进入救援模式或使用系统盘启动然后在Live环境里操作。这些年在生产环境里因为在线扩容根分区失败的案例已经够我写第二篇血泪史了。6.6 开机自检失败找不到根文件系统这是所有故障里最让人后背发凉的。系统启动后报错ALERT! /dev/sda2 does not exist. Dropping to a shell!这通常发生在修改了分区表或者调整了根分区大小但/etc/fstab里还是用旧的设备名进行挂载的情况。为什么推荐用UUID而不推荐设备名就是因为在系统启动过程中内核扫描磁盘的顺序和速度都是不固定的设备名可能发生变化。用 UUID 就不会受这种影响。另外如果错误发生在修改了GPT分区表之后还要检查分区表是否真的完整。GPT分区表在磁盘头部和尾部各有一份如果磁盘头部的坏了部分系统会尝试读取备份但也可能直接失败。这时候可以用gdisk的专家模式eload backup恢复备份分区表。修复思路进入救援模式或者用Live系统启动挂载根分区然后打开/etc/fstab把里面所有分区都改成 UUID 形式。# 查看当前分区的UUID blkid /dev/sda2 # 然后编辑 /etc/fstab nano /mnt/sysimage/etc/fstab把UUIDxxxx替换到对应行上保存重启。这个我建议所有人都提前做一遍不要等到故障时才想起来。7. 个人心得与长期维护建议环境管理员的自我修养磁盘分区这活儿除了会敲命令更关键的是建立一套自己的安全操作清单。我在这行干了十多年见过太多因为分区操作失误把整个机房搞到瘫痪的事故。让我总结几条长期有效的经验。7.1 永远保持可恢复性的理念不管是被迫扩盘的运维还是帮人装系统的技术宅操作之前一定要留下恢复点。这个不仅仅是备份分区表也包括了解怎么从故障里恢复。比如如果你没有用LVM而是直接分区那要考虑的问题是如果分区表丢失怎么恢复用testdisk可以扫描找回分区但这个过程非常痛苦。与其到时候求神拜佛不如在平时操作时用parted -s /dev/sdb print把当前分区状态存成文本。用sgdisk --backup备份GPT分区表。重要的分区用dumpe2fs -h保存超级块信息。只要这些信息在手即使分区表被清空我也有八成把握用gdisk的专家模式一步步重建回来。7.2 参数记忆要灵活命令语法在不同发行版上的差异不同Linux发行版的fdisk/parted版本会有细微差异。比如早年CentOS 6上的parted版本比较老mkpart指定的单位用%可能不支持但现代版本都可以。所以万一在某台老机器上操作失败不要上来就骂工具先看看版本fdisk -v parted --version新版 fdisk 其实已经支持对 GPT 磁盘进行操作了但行为上和gdisk还是有一点区别的。我的建议是如果一个工具在交互过程中出现让你犹豫的提示先退出选另一个更熟悉的工具来做。而不是硬着头皮往下走。7.3 用 systemd 的无人值守机制做自动化操作的安全性如果你管理的服务器有成百上千台人肉敲命令是不可能的。用前面提到的parted -s脚本配合PXE或云初始化cloud-init就能实现批量部署。这里给一个简单模板帮你在新机器干净盘上自动完成GPT布局格式化#!/bin/bash DISK/dev/sdb parted -s $DISK mklabel gpt parted -s $DISK mkpart primary ext4 1MiB 100% mkfs.ext4 -q -F -L data $DISK1 mkdir -p /data echo UUID$(blkid -s UUID -o value $DISK1) /data ext4 defaults 0 0 /etc/fstab mount -a这里我为什么把盘写死为/dev/sdb这不是一个好习惯更稳的是通过lsblk -d -o NAME,SIZE,MODEL来按大小和型号匹配到正确的盘符再赋给变量。写死盘符悲剧地看在物理机上可能因为插槽顺序变了导致操作错误。所以这几行仅供个人学习参考生产环境一定要做设备识别校验。7.4 最后的检查清单离开机房前的必须动作分区格式化完成后我不会立刻收工而是会花两分钟做一遍 回读验证# 1. 分区信息 parted -s /dev/sdb print # 2. 文件系统UUID blkid # 3. 挂载测试 mount -a df -hT # 4. 写入测试新建个文件看是否能读写 dd if/dev/zero of/data/test.bin bs1M count100 # 5. 删除测试文件 rm -f /data/test.bin这些命令看着简单但能确保分区表、文件系统和挂载配置三者完全正确。很多人分区格式化完就直接交付了结果第二天发现系统起不来或者数据写不进去这种基础检查能帮你提前规避后果。磁盘分区、格式化是我在Linux学习和运维之路上打的地基。它不像服务部署那样能立刻看到炫酷的Web页面也不像脚本编写那样能马上体会到自动化带来的爽感。但它就好比盖房子时的钢筋骨架表面看不见却决定了房子能盖多高、能不能抗震。我至今都记得自己在服务器上因为mkfs打错盘符把整整两T的数据一夜送走的那种无力感。所以这篇文章中我把所有我经历过的、能想到的避坑方法都写了出来。希望初入行的读者能少走一些弯路也希望有一定经验的朋友能从我的这些血泪经验里获得一点新启发。最后再分享一个我自己养成的小习惯每次操作完分区我都会顺手把当前的分区表状态输出到/root/disk-partition-$(date %F).backup文件里并把它上传到存储服务器。这变成了我给所有服务器做初始化和维护时的固定动作。未来的某一天当灾难降临你会感谢曾经的自己留下了这份不起眼的纪录。