服务器加盘要分区、要调容量、要开机自动挂上,还要应付「磁盘明明满了却找不到大文件」这类现场。本文讲清 MBR / GPT 两套方案,把
fdisk/gdisk/wipefs/parted四个工具与fstab持久化挂载一次配齐,再用三个空间不足的真实场景收尾。文中命令名均标注英文全称(如fdisk= fixed disk),完整清单见文末《附:命令英文全称速查表》。
一、两套分区方案先认清
分区的目的很直接:把系统盘与用户数据隔开,防止业务数据撑满根分区;给应用或用户划定空间上限;某个分区逻辑损坏时不牵连整块盘;swap 也只能建在独立分区上。代价是分区表本身的限制,所以先选方案:
| 对比项 | MBR(DOS) | GPT |
|---|---|---|
| 配套固件 | BIOS | UEFI |
| 主分区上限 | 4 个(含扩展分区) | 128 个(用到第 120 个以后就无法格式化) |
| 总分区上限 | 4 主 + 扩展内最多 15 个 | 128 个 |
| 单分区 / 单盘上限 | 2 TiB(扇区数用 4 字节记录) | 约 9.4 ZB(扇区数用 8 字节记录,2^64 × 512 B) |
| 分区表备份 | 无 | 盘尾有备份,CRC32 校验 |
1.1 MBR:靠扩展分区突破 4 个上限
主分区表只有 4 个条目,不够用时把其中一个改成扩展分区,再在它内部切逻辑分区——逻辑分区可以格式化,扩展分区本身不能。主分区编号固定 1~4,逻辑分区从 5 开始。
磁盘第一个扇区叫主引导扇区(柱面 0、磁头 0、扇区 1),不属于任何分区,所以格式化分区动不到它。512 字节的构成:
| 区段 | 字节 | 内容 |
|---|---|---|
| 引导程序 | 446 | 启动时把控制权交给分区表里某个操作系统的引导代码 |
| 磁盘分区表项(DPT) | 64 | 4 个表项 × 16 字节;每项含引导标记、CHS 起止、分区类型、起始扇区、扇区数 |
| 结束标志 | 2 | 固定值AA55 |
1.2 GPT:靠冗余和 8 字节寻址
| 区段 | 内容 |
|---|---|
| LBA0 | 保护性 MBR:前 446 字节放第一阶段引导程序,分区表记录区写标识符0xEE表示这是 GPT 盘;老工具认不出就不敢乱改,等于保护磁盘 |
| LBA1 | GPT 表头:记录分区表自身位置与大小、备份 GPT 的位置(盘尾 34 个 LBA)、CRC32 校验码 |
| LBA2~33 | 分区记录区:每个 LBA 放 4 组、共 32 个 LBA,得到 4×32 =128组记录(每组 128 字节) |
| 盘尾 | 备份 GPT(表头与记录区各一份),主表损坏时可恢复 |
二、fdisk:管理 MBR 磁盘
fdisk只能管 MBR 盘,操作绝大部分在交互式界面里完成。
2.1 fdisk 用法速查表
| 写法 | 作用 | 说明(英文原意) |
|---|---|---|
fdisk -l | 列出分区表后退出 | list,最常用 |
fdisk -l /dev/sdb | 只看某块盘 | — |
fdisk /dev/sdb | 进入交互管理 | 改动只在内存,w才落盘 |
fdisk -b 4096 /dev/sdb | 指定扇区大小 | bytes,可选 512/1024/2048/4096 |
fdisk -t gpt /dev/sdb | 只启用某类分区表 | type,决定空盘上自动建哪种表 |
fdisk -o +UUID /dev/sdb | 自定义输出列 | output,可为默认列追加字段 |
2.2 fdisk 交互菜单速查表
敲m随时打印这份菜单:
| 键 | 作用 | 键 | 作用 |
|---|---|---|---|
n | 新建分区 | d | 删除分区 |
p | 打印分区表 | l | 列已知分区类型 |
t | 改分区类型 ID | a | 切换可引导标记 |
w | 写盘并退出 | q | 不保存退出 |
o/g | 新建空 DOS / GPT 分区表 | x | 专家模式 |
记忆点:
fdisk的改动只在内存里,不敲w全部作废;反悔用q。分区表写完lsblk没认出新分区时,执行partprobe通知内核重读(有时要重启)。
2.3 查看、创建与删除分区
[root@zhb-m1 ~]# fdisk -l /dev/sdbDisk /dev/sdb:21.5GB,21474836480bytes,41943040sectors Disk label type: dos# dos 就是 MBRDevice Boot Start End Blocks Id System /dev/sdb12048419430392097049683Linux[root@zhb-m1 ~]# fdisk /dev/sdbCommand(mforhelp): n# 新建分区p primary(0primary,0extended,4free)Select(default p):# 回车,默认主分区Partition number(1-4, default1):# 回车,分区号 1First sector(2048-41943039, default2048):# 回车,从 2048 扇区(1M)起Last sector(2048-41943039, default41943039): +2G Partition1oftypeLinux and of size2GiB issetCommand(mforhelp): w# 写盘[root@zhb-m1 ~]# lsblk /dev/sdb└─sdb18:1702G0part# 删除:进去敲 d(只有一个分区时自动选中它),再 w 保存Command(mforhelp): d Partition1is deleted超过 4 个分区时,第 4 个选扩展分区e吃掉剩余空间,第 5 个起fdisk会自动建逻辑分区:
Select(default e):# 只剩一个空位且要装扩展分区,默认就是 ePartition4oftypeExtended and of size11GiB issetCommand(mforhelp): n All primary partitions areinuse Adding logical partition5# 主分区用完,自动开始建逻辑分区Last sector...:+5G[root@zhb-m1 ~]# lsblk /dev/sdb├─sdb48:2001K0part# 扩展分区只占位,不存数据└─sdb58:2105G0part2.4 脚本化:把交互键喂给 fdisk
把要敲的键按顺序写进文件再重定向进去,就不必守在屏幕前:
[root@zhb-m1 ~]# vim fdisk-create.txt # 依次是 n p 1 2048 +2G p w[root@zhb-m1 ~]# fdisk /dev/sdb < fdisk-create.txt[root@zhb-m1 ~]# lsblk /dev/sdb└─sdb18:1702G0part三、gdisk:管理 GPT 磁盘
gdisk管 GPT 盘,2 TiB 以上的盘基本都走它。键位和fdisk高度相似,只记差异:
| 键 | 作用 | 键 | 作用 |
|---|---|---|---|
n/d | 新建 / 删除分区 | p | 打印分区表 |
i | 查看分区详细信息 | c | 修改分区名称 |
t | 改分区类型 Code | o | 新建空 GPT(清掉全部分区) |
w/q | 写盘退出 / 不保存退出 | ? | 打印菜单 |
新建分区要选类型 Code,按L列出全部(约 60 种),常用的只有这几个:
| Code | 用途 | Code | 用途 |
|---|---|---|---|
8300 | Linux filesystem(默认) | 8e00 | Linux LVM |
8200 | Linux swap | fd00 | Linux RAID |
ef00 | EFI System | 0700 | Microsoft basic data |
[root@zhb-m1 ~]# gdisk -l /dev/sdb # MBR 盘会提示可转 GPTFound invalid GPT and valid MBR;converting MBR to GPTformatinmemory.# 建分区:n → 分区号回车 → 起始扇区回车 → +2G → 类型回车(默认 8300) → w 写盘Command(?forhelp): n Partition number(1-128, default1): Last sector(2048-41943006, default=41943006)or{+-}size{KMGTP}: +2G Hex code or GUID(L to show codes, Enter=8300): Changedtypeof partition to'Linux filesystem'Command(?forhelp): w# 转 GPT 用 o:清掉全部分区建空 GPT(要 Y 确认);看详情 i、删除 d 同理,改名 c 见 3.13.1 改分区名:c 命令
GPT 分区名(PARTLABEL)写在分区表里,与文件系统标签(LABEL)是两回事。
前者属于分区表,后者属于文件系统,lsblk -f能同时看到这两列。改分区名用c:
[root@zhb-m1 ~]# gdisk /dev/sdbCommand(?forhelp): c# c = change partition namePartition number(1-128, default2):2Enter name: data01# 新分区名,最长 36 个字符Command(?forhelp): w# 写盘[root@zhb-m1 ~]# partprobe /dev/sdb # 通知内核重读分区表[root@zhb-m1 ~]# lsblk -o NAME,PARTLABEL /dev/sdbNAME PARTLABEL ├─sdb1 boot └─sdb2 data01⚠️注意:分区名字段是GPT 独有的,MBR 盘没有这一项。在 MBR 表下
fdisk的c键是切换 DOS 兼容标记,改不出分区名;MBR 盘要改分区名得先转成 GPT(会清空全部分区,务必先备份)。文件系统标签(LABEL)另成一套,用xfs_admin -L改,见姊妹篇《Linux 文件系统管理与挂载实战》。
四、wipefs:擦掉分区表签名
wipefs擦的是文件系统 / RAID / 分区表的签名(magic string),不是数据本身。签名一没,blkid就认不出这块盘,磁盘上的内容其实还在。
| 写法 | 作用 | 说明(英文原意) |
|---|---|---|
wipefs /dev/sdb | 只列出可见签名及偏移 | 不带选项不擦除,先看再动手 |
wipefs -a /dev/sdb | 擦除全部签名 | all;整盘设备上只擦分区表,不动分区内容 |
wipefs -a -b /dev/sdb | 擦之前备份签名 | backup,存成wipefs-sdb-<偏移>.bak |
wipefs -t xfs /dev/sdb | 只处理指定类型签名 | types,可逗号分隔多个 |
wipefs -f /dev/sdb | 强制擦除 | force:挂载中也照擦,只在盘已废弃时用 |
[root@zhb-m1 ~]# wipefs /dev/sdb # 先看[root@zhb-m1 ~]# wipefs -a /dev/sdb # 确认无误后清掉,盘回到「未分区」状态⚠️注意:
-f会在文件系统仍被挂载时强行擦除——签名一擦,mount表里的挂载点和/etc/fstab条目就全部对不上,盘等于变成孤儿。wipefs -f只在确定盘已废弃时用,且动手前先-b备份。
五、parted:一个工具管两种方案
parted既能管 MBR(msdos)也能管 GPT,还支持非交互脚本,批量部署最顺手。
5.1 parted 命令行选项速查表
| 写法 | 作用 | 说明(英文原意) |
|---|---|---|
parted -l | 列出所有块设备的分区布局 | list |
parted -s /dev/sdb mkpart ... | 脚本模式,不问任何问题 | script:遇警告自动答 NO(比如缩小分区) |
parted -m /dev/sdb print | 机器可解析输出 | machine,便于脚本切分 |
parted -a optimal /dev/sdb ... | 设置新建分区的对齐方式 | align:none/cylinder/minimal/optimal |
parted -f /dev/sdb ... | 脚本模式下遇异常自动「修复」 | fix:必须与-s连用;-s默认答 NO,加-f才答 fix |
-s与-f是一对方向相反的「自动答题」开关:-s让 parted 不问人、遇警告一律答NO(保守,宁可这一步不做);-f则让它在脚本模式下对异常答fix(激进,自动动分区表)。手工分区时两个都别加,把问题留给 parted 问出来更安全。
5.2 parted 交互命令速查表
| 命令 | 作用 | 说明 |
|---|---|---|
mklabel/mktable | 新建分区表 | 值可为gpt、msdos;会清掉整盘数据 |
mkpart | 新建分区 | 语法mkpart [part-type name fs-type] start end |
print | 打印分区表 | 可加free、all、devices |
resizepart | 改分区结束位置 | 只改分区表边界,不动文件系统 |
rm/unit | 删除分区 / 设置默认单位 | MiB/GiB是精确值,MB/GB会就近取整 |
set | 打分区标记 | boot、lvm、raid、esp等 |
mkpart的参数顺序两种方案不一样:MBR 盘第一个参数是分区类型(primary/logical/extended),GPT 盘第一个参数是分区名,文件系统类型两者都可选。
# 非交互:一条命令干一件事,脚本里最好用[root@zhb-m1 ~]# parted /dev/sdb mklabel msdos # 会警告数据将被销毁,答 y[root@zhb-m1 ~]# parted /dev/sdb unit MiB mkpart primary 1 2049 # 1MiB → 2049MiB = 2GNumber Start End Size Type File system Flags11.00MiB 2049MiB 2048MiB primary xfs[root@zhb-m1 ~]# parted /dev/sdb unit MiB resizepart 1 4097 # 结束位置改到 4G[root@zhb-m1 ~]# parted /dev/sdb rm 1# 换 GPT 只差两处:mklabel gpt,以及 mkpart 首参从分区类型换成分区名[root@zhb-m1 ~]# parted /dev/sdb mklabel gpt[root@zhb-m1 ~]# parted /dev/sdb unit MiB mkpart data01 xfs 1 204911.00MiB 2049MiB 2048MiB xfs data01交互式就是把同样的命令一行行敲,mkpart会依次追问分区类型 / 文件系统类型 / 起始 / 结束(GPT 盘追问的是分区名)。
⚠️注意:
parted的改动立刻生效,没有fdisk那种「保存 / 放弃」的中间态,敲下mklabel那一下就相当于把分区表清零。生产机上改分区前务必先确认盘符。
⚠️注意:
resizepart改大的是分区表边界,分区里的文件系统不会跟着变大——还要再跑一次xfs_growfs /data01(XFS)或resize2fs /dev/sdb1(ext4)才能用上多出来的空间。
六、fstab:让挂载活过重启
手工mount只在本次开机有效;要开机自动挂,写进/etc/fstab。每行 6 个字段,空格分隔。
| 字段 | 含义 | 怎么填 |
|---|---|---|
| 1 设备 | 要挂的东西 | 推荐用UUID="..."(blkid查),设备名可能漂移 |
| 2 挂载点 | 挂到哪个目录 | 目录必须先存在,否则启动挂不上 |
| 3 文件系统类型 | xfs/ext4/iso9660… | 与mkfs时保持一致 |
| 4 挂载选项 | 逗号分隔 | 一般写defaults;要只读写ro |
| 5 dump 备份 | dump是否备份它 | 现在基本用不到,写0 |
| 6 fsck 顺序 | 开机检查顺序 | XFS 写0(XFS 不用 fsck 查状态);ext4 根分区写1、其他 ext4 写2 |
# 1. 分区 + 格式化[root@zhb-m1 ~]# parted /dev/sdb mklabel gpt[root@zhb-m1 ~]# parted /dev/sdb unit MiB mkpart data01 xfs 1 2049[root@zhb-m1 ~]# mkfs.xfs /dev/sdb1mkfs.xfs: /dev/sdb1 appears to contain an existing filesystem(xfs). mkfs.xfs: Use the-foption to force overwrite.# 已有文件系统要加 -f 强制覆盖[root@zhb-m1 ~]# mkfs.xfs -f /dev/sdb1# 2. 查 UUID、建挂载点、写 fstab,然后立刻试挂[root@zhb-m1 ~]# blkid /dev/sdb1/dev/sdb1:UUID="f5c35f10-0274-45af-b044-73694989fe01"TYPE="xfs"PARTLABEL="data01"[root@zhb-m1 ~]# mkdir /data01[root@zhb-m1 ~]# vim /etc/fstabUUID="f5c35f10-0274-45af-b044-73694989fe01"/data01 xfs defaults00[root@zhb-m1 ~]# mount /data01[root@zhb-m1 ~]# df -h /data01/dev/sdb12.0G 33M2.0G2% /data01# 3. reboot 之后再 df -h /data01,输出与第 2 步一致即说明持久化生效[root@zhb-m1 ~]# reboot[root@zhb-m1 ~]# df -h /data01/dev/sdb12.0G 33M2.0G2% /data01取消持久化挂载:把/etc/fstab里对应那一行删掉即可。
⚠️注意:
fstab写错(UUID 打错、挂载点不存在、类型写错)会让系统启动时卡在 emergency mode。改完一定先手工mount /data01试挂一次,确认不报错再重启。
七、综合案例:文件系统空间不足
df报警说满,但成因有三种,定位手段各不相同。
| 情况 | 现象与原因 | 定位命令 | 处置 |
|---|---|---|---|
| 大文件占用 | df满,目录里能找到大文件 | find /myapp-1/ -size +100M,或按占用排序du -s逐层下钻 | 确认后rm删掉 |
| 删了文件空间不释放 | 文件已删,df依旧 100% | lsof配合 grep 找(deleted) | 杀掉还开着句柄的进程 |
| 小文件占满 inode | df -h还有空闲,写入却报「设备上没有空间」 | df -hi看 IUsed% | 删小文件,或先合并再删 |
# 情况1:大文件——df 满,find 立刻揪出来[root@zhb-m1 ~]# df -h /myapp-1//dev/sdb12.0G2.0G 436K100% /myapp-1[root@zhb-m1 ~]# find /myapp-1/ -size +100M/myapp-1/etc/bigfile[root@zhb-m1 ~]# rm -f /myapp-1/etc/bigfile # 删完立刻回到 4%/dev/sdb12.0G 77M2.0G4% /myapp-1# 情况2:删了不释放——tail -f 还占着这个文件的句柄[root@zhb-m1 ~]# lsof | grep delete | grep /myapp-1tail1654root 3r REG8,172061565952444/myapp-1/etc/bigfile(deleted)[root@zhb-m1 ~]# kill 1654/dev/sdb12.0G 72M2.0G4% /myapp-1# 情况3:inode 被 65536 个小文件吃光(先切个小分区格式化成 ext4 复现)[root@zhb-m1 ~]# parted /dev/sdb unit MiB mkpart data02 ext4 2049 3073[root@zhb-m1 ~]# mkfs.ext4 /dev/sdb2 && mount /dev/sdb2 /myapp-2[root@zhb-m1 ~]# touch /myapp-2/file-{00001..65530}touch: 无法创建"/myapp-2/file-65526":设备上没有空间[root@zhb-m1 ~]# df -hi /myapp-2 # 空间还有,inode 用光了/dev/sdb2 64K 64K0100% /myapp-2[root@zhb-m1 ~]# rm -f /myapp-2/file-0*⚠️注意:要清空一个正在被写入的大文件(比如还在
tail -f的日志),先用重定向把内容清空(> 文件名)再删文件,否则rm之后空间不会立刻回来,还得靠lsof找进程。
八、如何彻底擦除硬盘上的数据
rm和mkfs都只动元数据,数据块还在盘上。真要处理退役盘:逻辑破坏用 0 覆写整块设备(dd if=/dev/zero of=/dev/sdb,写满整盘、耗时按容量算);物理破坏靠消磁、粉碎,可靠性最高。
📚 参考资料(官方文档 · 中英双语)
- fdisk(8) 分区工具手册
- parted(8) 分区工具手册
- wipefs(8) 签名擦除手册
- fstab(5) 文件系统表手册
附:命令英文全称速查表
| 命令 / 缩写 | 英文全称 / 原意 | 作用 |
|---|---|---|
fdisk | fixeddisk | 管理 MBR 分区表的经典工具 |
gdisk | GPTdisk | 管理 GPT 分区表 |
parted | partitioneditor | 兼容 MBR / GPT 的分区工具 |
wipefs | wipefilesystem signatures | 查看 / 擦除设备签名 |
blkid | blockid | 查设备 UUID、类型、分区标签 |
PARTLABEL | partitionlabel | GPT 分区名,用gdisk的c键改 |
mkfs | makefilesystem | 格式化 |
partprobe | partitionprobe | 通知内核重读分区表 |
df/du | diskfree /diskusage | 看剩余空间 / 统计占用 |
LBA | LogicalBlockAddressing | 逻辑块地址,GPT 按它编号 |
UUID | UniversallyUniqueIdentifier | 设备唯一标识 |
MBR/GPT | MasterBootRecord /GUIDPartitionTable | 两套分区方案 |
总结:先看盘是 MBR 还是 GPT(
fdisk -l的Disk label type、gdisk -l的Partition table scan),MBR 盘用fdisk、GPT 盘用gdisk、要脚本化上parted;改完分区记得partprobe,格式化后把 UUID 写进fstab才算真正“挂住”;盘满了用find/du/df -i/lsof分清是大文件、句柄未释放还是 inode 耗尽。最容易翻车的四处:parted改动立即生效没有回头路、resizepart只改分区表不动文件系统、fstab写错直接把系统送进 emergency mode、被进程占着的文件删了也不释放空间。觉得有用的话,点赞收藏,评论区聊聊你被 emergency mode 卡过的经历。