1. 磁盘分区这件事绕不开 fdisk刚接触 Linux 那会儿我最怕的就是分区。装系统时看到“手动分区”四个字就手心冒汗生怕一个回车把整块盘格了。后来在机房干活服务器加硬盘、扩容、迁移数据分区操作成了家常便饭才发现fdisk这个看起来老派的命令其实是最稳、最通用的工具之一。它几乎预装在每一台 Linux 机器上不依赖图形界面SSH 连上去就能干活处理 MBR 和 GPT 两种分区表都不在话下。这篇文章就是把我这些年用fdisk踩过的坑、总结出来的操作流程从头到尾讲清楚。内容包括怎么查看磁盘现状、怎么创建新分区、怎么删除和修改分区、MBR 和 GPT 到底怎么选、分区之后为什么系统不认、以及那些文档里不会写的细节。不管你是刚装完系统的新手还是需要给服务器加盘的运维看完都能直接上手操作。核心命令就一个fdisk但里面的门道值得花时间捋一遍。2. 动手之前先搞懂 MBR 和 GPT 的区别2.1 两种分区表的本质差异很多人上来就问“我该用 MBR 还是 GPT”这个问题没有标准答案但有一个判断逻辑。MBR 是上世纪八十年代的设计分区信息存在磁盘第一个扇区里总共 512 字节其中 446 字节给引导代码剩下 64 字节记录分区表。每个分区表项占 16 字节所以最多只能有 4 个主分区。想超过 4 个怎么办把其中一个主分区做成扩展分区再在里面划逻辑分区。这套机制用了几十年兼容性极好但限制也很明显单块磁盘最大只认 2TB超过的部分直接浪费。GPT 是后来配合 UEFI 引导方式设计的分区表不再挤在那 512 字节里而是用磁盘头尾各一份做冗余备份。它默认支持 128 个分区单盘容量上限大到目前根本用不完。更重要的是GPT 在分区表里带了 CRC 校验主分区表坏了还能用备份恢复这对服务器来说很关键。对比项MBRGPT最大磁盘容量2TB极大约 9.4ZB最大主分区数4 个128 个分区表备份无头尾各一份引导方式BIOSUEFI也可兼容 BIOS校验机制无CRC32 校验适用场景老机器、小容量盘、U盘启动新机器、大容量盘、服务器2.2 怎么判断该用哪种判断逻辑其实很简单。先看你的系统是怎么引导的如果是 UEFI 引导那系统盘必须用 GPT没得选。如果是传统 BIOS 引导两种都能用但要看磁盘容量——超过 2TB 的盘必须用 GPT否则后面的空间用不了。另外还要看操作系统版本很老的系统比如 CentOS 6 以前对 GPT 支持不完整这种情况就老老实实用 MBR。注意一块磁盘上只能有一种分区表不能混用。切换分区表类型会清空整块盘的数据操作前务必确认盘上没有重要数据或者已经做好备份。还有一个容易被忽略的点U盘和移动硬盘。如果你做的启动盘要在多台机器上用MBR 的兼容性更好因为有些老主板不认 GPT 格式的 U 盘。但如果是纯数据盘容量又大GPT 更合适。2.3 分区表损坏了怎么办MBR 的分区表只有一份一旦被覆盖或损坏整块盘的分区信息就丢了。常见的情况是重装系统时误操作把数据盘的分区表给写了。这时候别慌先停止对这块盘的一切写入操作然后用testdisk这类工具尝试扫描恢复。GPT 因为有备份分区表恢复起来相对容易gdisk工具可以自动检测主分区表损坏并从备份恢复。我个人的习惯是对重要数据盘做完分区后用sfdisk -d /dev/sdX partition_backup.txt把分区表备份成文本文件。万一出事直接sfdisk /dev/sdX partition_backup.txt就能还原比重装系统快得多。3. fdisk 核心操作全流程拆解3.1 查看磁盘和分区现状动手之前先摸清家底。lsblk是最直观的命令树状结构一眼就能看出磁盘和分区的从属关系lsblk输出里会列出所有块设备包括磁盘名、大小、挂载点。如果只想看某块盘直接跟上设备名lsblk /dev/sdb另一个常用的是fdisk -l它会列出所有磁盘的分区表类型和分区详情fdisk -l输出里重点关注几个信息Disk /dev/sdb后面的容量、Disklabel type显示的是dos即 MBR还是gpt、以及各个分区的起止扇区和大小。如果只想看单块盘fdisk -l /dev/sdb提示fdisk -l需要 root 权限才能看到完整信息普通用户执行可能只显示部分内容。养成用sudo的习惯。3.2 进入交互界面与常用指令确认好目标磁盘后用fdisk加上设备路径进入交互模式sudo fdisk /dev/sdb进去之后会看到Command (m for help):的提示符。这时候输入m回车会列出所有可用指令。常用的就那么几个我整理成表格方便查阅指令作用使用频率p打印当前分区表极高n新建分区极高d删除分区高t修改分区类型中w保存并退出极高q不保存退出高m显示帮助中g创建新的 GPT 分区表中o创建新的 MBR 分区表中v校验分区表低x进入专家模式低这里要特别强调w和q的区别。w是 write会把所有改动写入磁盘并退出q是 quit直接退出不保存任何改动。很多人改了半天分区最后手滑按了q白忙一场。反过来如果只是想看看分区结构按q退出最安全。3.3 创建新分区的完整步骤假设现在有一块全新的 100GB 磁盘/dev/sdb要分成两个分区一个 30GB 做主分区剩下的做另一个分区。操作流程如下第一步进入 fdisksudo fdisk /dev/sdb第二步查看当前状态确认是空盘Command (m for help): p如果显示Disklabel type: dos且没有任何分区就可以直接操作。如果盘上有旧分区表需要先清理。第三步创建第一个分区Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-209715199, default 2048): 回车 Last sector, sectors or size{K,M,G,T,P} (2048-209715199, default 209715199): 30G这里有几个关键点。First sector默认从 2048 开始这是为了对齐 4K 扇区对 SSD 性能有好处直接回车就行。Last sector可以用30G这种相对大小也可以用绝对扇区号。用30G更直观fdisk 会自动计算结束扇区。第四步创建第二个分区把剩余空间全用上Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p Partition number (2-4, default 2): 2 First sector (62914560-209715199, default 62914560): 回车 Last sector, sectors or size{K,M,G,T,P} (62914560-209715199, default 209715199): 回车最后一个分区直接回车fdisk 会把剩余空间全部分配。第五步检查分区表Command (m for help): p确认两个分区的大小和起止扇区都正确。第六步保存退出Command (m for help): w到这里分区表就写入了但系统还没重新读取。需要执行sudo partprobe /dev/sdb或者sudo partx -u /dev/sdb让内核重新加载分区表。如果提示设备忙可能需要重启但大多数情况下partprobe就够了。3.4 删除分区的正确姿势删除分区比创建简单但风险更高。操作之前一定要确认分区没有被挂载也没有正在运行的进程在使用它。先检查挂载情况mount | grep /dev/sdb如果有输出先卸载sudo umount /dev/sdb1然后进入 fdisksudo fdisk /dev/sdb查看当前分区Command (m for help): p假设要删除第二个分区Command (m for help): d Partition number (1,2, default 2): 2fdisk 会提示分区已删除但此时还没写入磁盘。可以再按p确认一下然后w保存。注意删除分区只是把分区表里的记录抹掉分区里的数据并没有被立即清除。只要没有新数据写入覆盖理论上还有恢复的可能。但一旦保存了分区表并开始写入新数据恢复难度就大了。所以删分区之前该备份的一定要备份。3.5 修改分区类型和调整分区fdisk修改分区类型用t指令。比如要把某个分区标记为 Linux LVM 类型Command (m for help): t Partition number (1,2, default 2): 1 Hex code or alias (type L to list all): 8e输入L可以列出所有类型代码。常见的几个83是 Linux 普通分区8e是 Linux LVM82是 Linux swapef是 EFI 系统分区。至于调整分区大小fdisk本身不支持无损调整。如果只是扩大分区可以删除分区再重建只要起始扇区不变数据不会丢。但缩小分区风险很大建议用resize2fs配合lvm或者专门的工具来做。我个人的经验是生产环境调整分区前一定先做快照或者备份别嫌麻烦。4. 分区之后让系统真正用起来4.1 刷新内核分区表w保存退出后/dev/sdb1、/dev/sdb2这些设备节点不一定马上出现。最稳妥的方式是执行sudo partprobe /dev/sdb这个命令会让内核重新读取分区表。如果partprobe不可用可以用sudo partx -u /dev/sdb或者sudo blockdev --rereadpt /dev/sdb如果都提示设备忙说明有进程正在使用这块盘用lsof /dev/sdb查一下把占用进程停掉再试。4.2 格式化分区分区建好之后还不能直接存文件需要格式化。Linux 下最常用的是ext4服务器上xfs也很常见。格式化的命令是mkfs系列sudo mkfs.ext4 /dev/sdb1如果要格式化成 xfssudo mkfs.xfs /dev/sdb2提示格式化会清空分区上的所有数据执行前务必确认设备名没写错。我见过有人把/dev/sda1写成/dev/sdb1结果把系统盘格了的惨案。建议格式化前先用lsblk再确认一遍。4.3 挂载与开机自动挂载格式化完成后创建挂载点并挂载sudo mkdir -p /data sudo mount /dev/sdb1 /data用df -h确认挂载成功df -h | grep sdb1如果要开机自动挂载需要编辑/etc/fstab。推荐用 UUID 而不是设备名因为设备名可能会变。先查 UUIDsudo blkid /dev/sdb1输出类似/dev/sdb1: UUIDa1b2c3d4-... TYPEext4然后在/etc/fstab里加一行UUIDa1b2c3d4-... /data ext4 defaults 0 2最后用mount -a测试一下配置是否正确sudo mount -a如果没有报错说明 fstab 写对了。这一步很重要fstab 写错会导致系统启动失败进不了系统。5. 常见问题与排查技巧实录5.1 分区表写入后设备节点不出现这是最常见的问题。w保存后lsblk里看不到新分区。原因通常是内核还在用旧的分区表缓存。解决办法按顺序试先partprobe不行就partx -u再不行就blockdev --rereadpt。如果都无效检查是否有进程占用用lsof或fuser查。实在不行重启系统是最简单粗暴但有效的办法。还有一种情况是磁盘本身有问题比如有坏道或者连接不稳定。可以看dmesg的输出dmesg | tail -30如果有 I/O 错误那就要先解决硬件问题。5.2 分区对齐问题老版本的 fdisk 默认从扇区 63 开始这会导致 4K 扇区不对齐影响 SSD 性能。新版本默认从 2048 开始已经对齐了。但如果你手动指定了起始扇区一定要确保是 8 的倍数对于 512 字节逻辑扇区或者 2048 的倍数。检查方法sudo fdisk -l /dev/sdb看Start那一列如果是 2048、4096 这种就是对齐的。如果看到 63、16065 这种说明没对齐建议重新分区。5.3 GPT 分区表被 MBR 工具破坏有时候用老工具操作 GPT 磁盘会把 GPT 的保护 MBR 覆盖掉导致系统认不出分区。这时候用gdisk打开磁盘它会提示发现 GPT 和 MBR 不一致选择使用 GPT 并写入就能恢复。命令sudo gdisk /dev/sdb进去后按w写入gdisk 会自动修复保护 MBR。5.4 常见问题速查表问题现象可能原因解决方法w 保存后看不到新分区内核未刷新partprobe / partx -u / 重启格式化提示设备忙分区被挂载umount 后再格式化开机无法启动fstab 写错进入救援模式注释错误行磁盘容量识别不全MBR 2TB 限制改用 GPT 分区表GPT 磁盘被识别为 MBR保护 MBR 被覆盖用 gdisk 修复分区起止扇区不对齐手动指定了起始扇区重新分区从 2048 开始5.5 几个容易踩的坑第一个坑在已经挂载的分区上直接操作 fdisk。虽然 fdisk 允许你修改分区表但内核不会立即生效而且可能导致数据不一致。正确做法是先卸载再操作。第二个坑用dd或者mkfs时设备名写错。这个前面提过但值得再强调一次。执行破坏性命令前先用lsblk确认设备名再用echo测试一下变量确认无误再执行。第三个坑fstab 里用设备名而不是 UUID。服务器加硬盘或者换插槽后设备名可能从/dev/sdb变成/dev/sdc导致挂载失败。用 UUID 就没这个问题。第四个坑分区类型代码选错。比如把 EFI 分区标成了普通 Linux 分区UEFI 引导会找不到启动文件。建 EFI 分区时类型一定要选ef。6. 一些实战中的个人体会fdisk这个工具看起来简单但真正用好需要理解分区表的结构和内核的设备管理机制。我刚开始用的时候最常犯的错误就是改完分区不刷新内核然后对着lsblk的输出纳闷为什么新分区没出来。后来养成了习惯w保存之后立刻partprobe然后再lsblk确认形成肌肉记忆。另一个体会是关于备份。分区操作是有风险的操作尤其是对生产环境的磁盘。我现在做任何分区改动之前都会先用sfdisk -d把分区表导出备份然后再动手。这个习惯帮我省过好几次事有一次误删了分区直接用备份文件恢复几分钟就搞定了。最后说一个实用技巧如果你不确定分区操作会不会影响数据可以先在一块测试盘或者虚拟机上练手。用虚拟机装个 Linux加几块虚拟磁盘随便折腾。练熟了再到真机上操作心里就有底了。分区这件事理论看再多不如动手做一遍做一遍不如做错一遍记得牢。当然最好还是在测试环境里做错。
