新买一块数据盘,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 的注意点
- 默认单位可能是 MB(10^6)而非 MiB(2^20) ,脚本里显式写 MiB/GiB 避免歧义。
parted命令立即生效,没有w确认步骤 。误操作就是真删,rm/mklabel前务必确认。- 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 会导致开机挂载失败进入紧急模式。
七、⚠️ 常见错误
- 对已挂载/在用的盘分区 。会破坏数据甚至导致系统崩溃。分区前确认盘没用:
lsblk、mount | grep sdb。 - 忘了 4K 对齐 。
fdisk默认起始扇区应是 2048(1MiB 对齐),手动填了 63 会严重掉性能。 - MBR 超过 4 个主分区还想建。会失败或需要建扩展分区,不如直接 GPT。
- 分区后不
partprobe。内核没重读,mkfs找不到分区。 - fstab 用设备名 。加盘后
sda/sdb顺序可能变,用 UUID。 - fstab 写错直接重启 。会进不了系统。改完先
mount -a测试。 parted误用rm/mklabel。没有二次确认,操作即生效,数据秒丢。- 对大容量盘用 MBR。超过 2TB 的部分用不了,白白浪费。
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,把「不用停机就能扩容」这个存储神技讲透。