Linux 硬盘分区管理 fdisk 与 parted 避坑手册
2026/9/24 17:41:56 网站建设 项目流程

服务器加盘要分区、要调容量、要开机自动挂上,还要应付「磁盘明明满了却找不到大文件」这类现场。本文讲清 MBR / GPT 两套方案,把fdisk/gdisk/wipefs/parted四个工具与fstab持久化挂载一次配齐,再用三个空间不足的真实场景收尾。文中命令名均标注英文全称(如fdisk= fixed disk),完整清单见文末《附:命令英文全称速查表》。

一、两套分区方案先认清

分区的目的很直接:把系统盘与用户数据隔开,防止业务数据撑满根分区;给应用或用户划定空间上限;某个分区逻辑损坏时不牵连整块盘;swap 也只能建在独立分区上。代价是分区表本身的限制,所以先选方案:

对比项MBR(DOS)GPT
配套固件BIOSUEFI
主分区上限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)644 个表项 × 16 字节;每项含引导标记、CHS 起止、分区类型、起始扇区、扇区数
结束标志2固定值AA55

1.2 GPT:靠冗余和 8 字节寻址

区段内容
LBA0保护性 MBR:前 446 字节放第一阶段引导程序,分区表记录区写标识符0xEE表示这是 GPT 盘;老工具认不出就不敢乱改,等于保护磁盘
LBA1GPT 表头:记录分区表自身位置与大小、备份 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改分区类型 IDa切换可引导标记
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:2105G0part

2.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改分区类型 Codeo新建空 GPT(清掉全部分区
w/q写盘退出 / 不保存退出?打印菜单

新建分区要选类型 Code,按L列出全部(约 60 种),常用的只有这几个:

Code用途Code用途
8300Linux filesystem(默认)8e00Linux LVM
8200Linux swapfd00Linux RAID
ef00EFI System0700Microsoft 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.1

3.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 表下fdiskc键是切换 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新建分区表值可为gptmsdos会清掉整盘数据
mkpart新建分区语法mkpart [part-type name fs-type] start end
print打印分区表可加freealldevices
resizepart改分区结束位置只改分区表边界,不动文件系统
rm/unit删除分区 / 设置默认单位MiB/GiB是精确值,MB/GB会就近取整
set打分区标记bootlvmraidesp

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/iso9660mkfs时保持一致
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)杀掉还开着句柄的进程
小文件占满 inodedf -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找进程。

八、如何彻底擦除硬盘上的数据

rmmkfs都只动元数据,数据块还在盘上。真要处理退役盘:逻辑破坏用 0 覆写整块设备(dd if=/dev/zero of=/dev/sdb,写满整盘、耗时按容量算);物理破坏靠消磁、粉碎,可靠性最高。

📚 参考资料(官方文档 · 中英双语)

  • fdisk(8) 分区工具手册
  • parted(8) 分区工具手册
  • wipefs(8) 签名擦除手册
  • fstab(5) 文件系统表手册

附:命令英文全称速查表

命令 / 缩写英文全称 / 原意作用
fdiskfixeddisk管理 MBR 分区表的经典工具
gdiskGPTdisk管理 GPT 分区表
partedpartitioneditor兼容 MBR / GPT 的分区工具
wipefswipefilesystem signatures查看 / 擦除设备签名
blkidblockid查设备 UUID、类型、分区标签
PARTLABELpartitionlabelGPT 分区名,用gdiskc键改
mkfsmakefilesystem格式化
partprobepartitionprobe通知内核重读分区表
df/dudiskfree /diskusage看剩余空间 / 统计占用
LBALogicalBlockAddressing逻辑块地址,GPT 按它编号
UUIDUniversallyUniqueIdentifier设备唯一标识
MBR/GPTMasterBootRecord /GUIDPartitionTable两套分区方案

总结:先看盘是 MBR 还是 GPT(fdisk -lDisk label typegdisk -lPartition table scan),MBR 盘用fdisk、GPT 盘用gdisk、要脚本化上parted;改完分区记得partprobe,格式化后把 UUID 写进fstab才算真正“挂住”;盘满了用find/du/df -i/lsof分清是大文件、句柄未释放还是 inode 耗尽。最容易翻车的四处:parted改动立即生效没有回头路、resizepart只改分区表不动文件系统、fstab写错直接把系统送进 emergency mode、被进程占着的文件删了也不释放空间。觉得有用的话,点赞收藏,评论区聊聊你被 emergency mode 卡过的经历。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询