Linux磁盘管理教程:MBR、GPT、fdisk、parted分区实战

新买一块数据盘,df -h 看不到,因为还没分区、没格式化、没挂载。这是运维接手新机器的第一课。分区看似简单,但 MBR/GPT 的区别、fdisk 与 parted 的选择、4K 对齐这些细节,搞错了会导致容量浪费、启动失败甚至数据丢失。这一篇从磁盘命名讲到 MBR/GPT 的取舍,再用 fdisk 和 parted 走完整套分区实战。

一、先搞懂块设备命名

Linux 里磁盘叫「块设备」,命名有规律:

命名 含义
/dev/sda 第一块 SCSI/SATA/USB 盘
/dev/sdb 第二块
/dev/vda 第一块 virtio 盘(KVM 虚拟机)
/dev/nvme0n1 第一块 NVMe SSD
/dev/sda1 sda 的第 1 个分区
/dev/nvme0n1p1 NVMe 的第 1 个分区(多一个 p)

记忆 :sd/vd 后面字母递增(a、b、c),数字是分区号;NVMe 用 nvme<控制器>n<命名空间>p<分区>。

查看系统有哪些盘

bash 复制代码
lsblk
text 复制代码
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda       8:0    0   40G  0 disk
├─sda1    8:1    0    1M  0 part
├─sda2    8:2    0    2G  0 part /boot
└─sda3    8:3    0   38G  0 part /
sdb       8:16   0  100G  0 disk          <-- 未挂载的数据盘
nvme0n1 259:0    0  500G  0 disk
└─nvme0n1p1 259:1 0 500G  0 part /data

lsblk 是查看磁盘和分区关系最直观的命令。sdb 有 disk 而没有 part 和 MOUNTPOINT,说明它还没分区。

二、MBR vs GPT

分区表有两种格式,选错了会有麻烦。

维度 MBR GPT
最大容量 2TB 8ZB(实用无上限)
最大分区数 4 个主分区 128 个
兼容性 极广(老 BIOS) 需 UEFI/新系统
校验 无 有 CRC 校验,更可靠
启动 BIOS + MBR UEFI + GPT
备份分区表 无 有备份

结论:

  • 新系统、大容量盘(> 2TB)→ GPT
  • 老系统、小盘、兼容性要求 → MBR
  • 2026 年了,能 GPT 就 GPT,MBR 的 2TB 和 4 分区限制太坑。

查看分区表类型

bash 复制代码
sudo fdisk -l /dev/sdb
text 复制代码
Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors
Disklabel type: gpt          <-- 分区表类型

Disklabel type 显示 gpt 或 dos(dos 就是 MBR)。

三、fdisk:传统的交互式分区

fdisk 老牌、轻量,从 util-linux 2.23 起已支持 GPT,日常够用。

语法格式

bash 复制代码
sudo fdisk 设备

交互命令

进入 fdisk 后的常用按键:

按键 作用
m 帮助
p 打印分区表
n 新建分区
d 删除分区
t 修改分区类型
w 保存并退出
q 不保存退出
g 创建 GPT 分区表
o 创建 MBR(DOS)分区表

实战:把 /dev/sdb 分成两个分区

bash 复制代码
sudo fdisk /dev/sdb
text 复制代码
Command (m for help): g             # 创建 GPT 分区表
Created a new GPT disklabel.

Command (m for help): n             # 新建分区
Partition number (1-128, default 1): 1
First sector (2048-209715199, default 2048): [回车用默认]
Last sector: +50G                   # 第一个分区 50G

Command (m for help): n             # 再建一个
Partition number: 2
First sector: [回车]
Last sector: [回车用剩余全部]

Command (m for help): p             # 检查
Device     Start       End   Sectors Size Type
/dev/sdb1   2048 104857599 104855552  50G Linux filesystem
/dev/sdb2 104857600 209715166 104857567  50G Linux filesystem

Command (m for help): w             # 保存

关键点:

  • n 时 First sector 用默认的 2048(这是 1MiB 对齐,性能关键)
  • 分区大小用 +50G 或 +500M 指定;不填则用剩余空间
  • w 才真正写入 ,q 是放弃

⚠️ 立即让内核重读分区表

fdisk 保存后,内核可能还没更新:

bash 复制代码
sudo partprobe /dev/sdb
# 或
sudo blockdev --rereadpt /dev/sdb

不重读的话,mkfs 会报「设备不存在」。

四、parted:支持 GPT 的现代工具

parted 功能更强,支持大于 2TB 的盘、非交互式脚本化操作,适合自动化。

语法格式

bash 复制代码
sudo parted [设备] [命令]

常用命令

命令 作用
print 显示分区表
mklabel gpt 创建 GPT 分区表
mklabel msdos 创建 MBR
mkpart 新建分区
rm N 删除第 N 个分区
resizepart 调整分区大小
set N flag 设置标志

非交互式创建分区(脚本友好)

bash 复制代码
# 创建 GPT 分区表
sudo parted -s /dev/sdb mklabel gpt

# 创建两个分区(注意用 MiB/GiB,避免对齐问题)
sudo parted -s /dev/sdb mkpart primary 1MiB 50GiB
sudo parted -s /dev/sdb mkpart primary 50GiB 100GiB

# 查看
sudo parted -s /dev/sdb print
text 复制代码
Number  Start   End     Size    File system  Name     Flags
 1      1049kB  53.7GB  53.7GB  ext4         primary
 2      53.7GB  107GB   53.7GB               primary

⚠️ parted 的注意点

  1. 默认单位可能是 MB(10^6)而非 MiB(2^20) ,脚本里显式写 MiB/GiB 避免歧义。
  2. parted 命令立即生效,没有 w 确认步骤 。误操作就是真删,rm/mklabel 前务必确认。
  3. parted 有时不提示就改磁盘,交互模式下谨慎。

五、gdisk:GPT 专用工具

gdisk 是 fdisk 的 GPT 加强版,操作方式几乎一样(n/d/p/w),但专门处理 GPT,支持更多分区和类型。

bash 复制代码
sudo apt install gdisk -y
sudo gdisk /dev/sdb

如果磁盘是 GPT 而你想用 fdisk 却提示不支持(老版本),用 gdisk 最稳。

六、分区后的下一步:格式化与挂载

分区只是第一步,完整流程是「分区 → 格式化 → 挂载」:

bash 复制代码
# 1. 分区(上文已完成)
# 2. 格式化(建立文件系统)
sudo mkfs.ext4 /dev/sdb1
# 或 XFS
sudo mkfs.xfs /dev/sdb2

# 3. 创建挂载点
sudo mkdir -p /data

# 4. 挂载
sudo mount /dev/sdb1 /data

# 5. 验证
df -h /data

# 6. 写入 /etc/fstab 实现开机自动挂载
echo "UUID=$(blkid -s UUID -o value /dev/sdb1) /data ext4 defaults 0 2" | sudo tee -a /etc/fstab

# 7. 测试 fstab(重要!)
sudo mount -a

⚠️ fstab 里用 UUID 而不是 /dev/sdb1:设备名可能变(插拔、加盘),UUID 稳定。写错 fstab 会导致开机挂载失败进入紧急模式。

七、⚠️ 常见错误

  1. 对已挂载/在用的盘分区 。会破坏数据甚至导致系统崩溃。分区前确认盘没用:lsblk、mount | grep sdb。
  2. 忘了 4K 对齐 。fdisk 默认起始扇区应是 2048(1MiB 对齐),手动填了 63 会严重掉性能。
  3. MBR 超过 4 个主分区还想建。会失败或需要建扩展分区,不如直接 GPT。
  4. 分区后不 partprobe 。内核没重读,mkfs 找不到分区。
  5. fstab 用设备名 。加盘后 sda/sdb 顺序可能变,用 UUID。
  6. fstab 写错直接重启 。会进不了系统。改完先 mount -a 测试。
  7. parted 误用 rm/mklabel。没有二次确认,操作即生效,数据秒丢。
  8. 对大容量盘用 MBR。超过 2TB 的部分用不了,白白浪费。
  9. mkfs 选错文件系统。XFS 不能缩小、ext4 不能在线扩容某些场景,要按用途选(见第 26 篇)。

八、原理探究:分区表与磁盘寻址

扇区与寻址

磁盘的最小读写单位是扇区(sector) 。传统是 512 字节,现代(4Kn)是 4096 字节。物理扇区 是硬件能力,逻辑扇区是操作系统看到的(可能通过 512e 模拟)。

为什么要 4K 对齐? 如果逻辑扇区是 512B、但物理扇区是 4KB,当分区起点没对齐到 4KB 边界时,一个逻辑写会跨越两个物理扇区,导致读-改-写,性能腰斩。所以分区起始扇区取 2048(× 512B = 1MiB),天然对齐。

查看磁盘的对齐信息:

bash 复制代码
sudo fdisk -l /dev/sdb | grep -i sector

MBR 的结构

MBR 在磁盘第一个扇区(512 字节):

text 复制代码
偏移 0    446 字节:引导代码(bootloader)
偏移 446  64 字节:4 个分区表项(每个 16 字节)= 最多 4 个主分区
偏移 510  2 字节:55 AA(魔数)

这就解释了 MBR 的两个限制:

  • 最多 4 个主分区:分区表项只有 4 个
  • 最大 2TB:分区表用 32 位记录扇区数,2^32 × 512B = 2TB

要突破 4 分区,用的是「扩展分区 + 逻辑分区」的技巧(把第 4 个表项拆成链式结构),但限制和复杂度都不友好,不如 GPT。

GPT 的结构

GPT 用 LBA0 保护性 MBR(防老工具误改)+ 分区头 + 分区表:

  • 分区表项 128 个(远超 MBR)
  • 每个表项用 64 位记录扇区范围 → 支持 8ZB
  • 分区表有备份(磁盘头尾各一份),损坏可恢复
  • 用 GUID 标识分区类型,比 MBR 的十六进制类型码更规范

这也是为什么 GPT 更可靠 :备份分区表 + CRC32 校验,即使主分区表损坏,也能用 gdisk/testdisk 从备份恢复。

分区、文件系统、挂载的关系

text 复制代码
物理磁盘 /dev/sdb
   └─ 分区表(MBR/GPT)
        └─ 分区 /dev/sdb1(一段连续的扇区范围)
             └─ 文件系统(ext4/XFS,管理文件)
                  └─ 挂载到目录 /data(让用户通过目录访问)

分区只是「切蛋糕」,文件系统是「蛋糕的配方」,挂载是「把蛋糕摆上桌」。 三者缺一不可。理解了这层,df、lsblk、mount、fstab 的关系就全通了。

九、磁盘分区速查表

bash 复制代码
# 查看磁盘和分区
lsblk
sudo fdisk -l
sudo parted -s /dev/sdb print

# fdisk 交互式分区
sudo fdisk /dev/sdb         # g(GPT) → n(新建) → w(保存)

# parted 脚本式分区
sudo parted -s /dev/sdb mklabel gpt
sudo parted -s /dev/sdb mkpart primary 1MiB 50GiB

# 重读分区表
sudo partprobe /dev/sdb

# 格式化
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.xfs /dev/sdb2

# 挂载
sudo mkdir /data && sudo mount /dev/sdb1 /data

# 持久化(用 UUID)
blkid /dev/sdb1
echo "UUID=xxx /data ext4 defaults 0 2" | sudo tee -a /etc/fstab
sudo mount -a

一句话收尾:大容量和现代系统一律用 GPT,fdisk 够日常、parted 适合脚本、gdisk 专攻 GPT ;牢记「分区 → 格式化 → 挂载」三步走,以及「fstab 用 UUID、改完先 mount -a 测试」两条铁律。下一篇讲 LVM,把「不用停机就能扩容」这个存储神技讲透。

相关推荐
j7~1 小时前
【Linux网络加餐】《HTTP 会话保持:Cookie 与 Session 原理及实验验证》---详解
linux·网络·网络协议·http·cookie·session
我是小灰灰吖1 小时前
Ubuntu 22.04 为程序添加桌面启动图标(.desktop 完整实践)
linux·ubuntu
Linux运维技术栈1 小时前
CVE-2026-91403 高危漏洞预警:Java JSSE 信任链被攻破 全场景修复方案与Linux系统级彻底清理实操
java·linux·安全·jdk·信任链
SHENGWEI胜为1 小时前
服务器 IP 地址冲突如何排查?从 DHCP 租约到 ARP 缓存定位故障
服务器·tcp/ip·缓存
H.莓飛1 小时前
【数据结构】快速排序专题
linux·服务器·c语言·数据结构·visual studio
箓维1 小时前
网络基础(2)IP和MAC的区别与报文封装
linux·网络
小HANN1 小时前
(索引 + SQL 优化):《MySQL 底层探秘②:B + 树索引与 Explain 实战,根治线上慢 SQL》
linux·运维·服务器·经验分享
wtblszn1 小时前
活性炭吸附塔组态监控运维系统方案
运维
lisanmengmeng1 小时前
pushgateway
linux·运维·服务器·网络