硬盘分区
概念
分区格式
- MBR (Master Boot Record)
- MBR 数据存储在硬盘的第一个扇区 (512 字节)。数据结构:启动代码 (Bootstrap Code Area, 446 字节) + 分区表 (Partition Table, 64 字节) + 结束标志 (Boot Signature, 2 字节,值为
0x55AA
)。- Bootstrap code area 内部结构可能不同,具体见 Sector layout。
- 每个分区表记录项为 16 字节,因此最多设置 4 个分区。每个分区空间最大 2T 大小,分区的起始位置不能大于 2 TB。
- 意味着一块 2T 以上的硬盘,不适合用 MBR 分区格式。
- 分区表划分为主分区和扩展分区。
- 主分区最多 4 个分区,至少要有 1 个。
- 扩展分区最多 1 个,最少 0 个分区。扩展分区不能直接使用,必须划分为 N 个逻辑分区。
- 逻辑分区最多 N 个分区,最少 0 个分区。所有逻辑分区加起来就是一个扩展分区。
- MBR 数据存储在硬盘的第一个扇区 (512 字节)。数据结构:启动代码 (Bootstrap Code Area, 446 字节) + 分区表 (Partition Table, 64 字节) + 结束标志 (Boot Signature, 2 字节,值为
- GPT (GUID Partition Table)
- 没有分区数量和大小的限制
- 兼容 MBR。第一扇区被称为“保护 MBR”。阻止不能识别 GPT 的磁盘工具试图对硬盘进行分区或格式化等操作。
- 数据结构:
- 硬盘头部:保护 MBR + GPT Partition Header + 分区表
- 硬盘尾部是备份区:分区表 + GPT Partition Header
命令
- 查看硬盘信息:
fdisk -l
- 查看分区信息:
lsblk
MBR 分区
# 对硬盘 /dev/sda 进行 MBR 分区
fdisk /dev/sda
GPT 分区
# 对硬盘 /dev/sda 进行 GPT 分区
parted /dev/sda
# 磁盘标签格式设为 gpt
(parted) mklabel gpt
# 查分区
(parted) print
(parted) mkpart
# 分别回答: p1 回车 0% 1GiB
(parted) mkpart
# 分别回答: p2 回车 1GiB 100%
GPT 扇区要兼容 MBR 扇区,当分区设置 0%
会预留空间,START 位置会偏移 2048 扇区。
Device Start End Sectors Size Type
/dev/sdb1 2048 859834367 859832320 410G Linux filesystem
对于大多数磁盘而言,留给元数据和文件系统结构的空间通常是 2048 个扇区,每个扇区大小为 512 字节,即 1MiB 左右。因此,在使用 parted 命令进行分区时,即使指定了起始位置为 0%,实际上操作系统也会将该分区的起始位置设置为第 2048 个扇区(或者更靠后的某个扇区),以避免影响磁盘的元数据和文件系统结构。
EFI 分区格式化成 Fat32 文件系统 mkfs.fat -F 32 /dev/<partition>
。
4K 对齐
因为 block 是文件系统读写硬盘的基本单位。block 的大小通常是 4KiB,即由连续八个扇区 (sector) 组成。
当 4K 对齐时,磁盘读写时不需要操作额外的扇区,可以充分发挥磁盘的读写性能。而不对齐就会造成磁盘读写性能的下降。
MBR 备份与恢复
先使用 fdisk -l
确定 MBR 位置。
# MBR 大小 512 字节,所以 bs=512,count=1
# 备份整个 MBR
dd if=/dev/sda of=/root/backup-sda.mbr bs=512 count=1
# 恢复整个 MBR
dd if=/root/backup-sda.mbr of=/dev/sda bs=512 count=1
# 仅恢复 bootstrap code(这通常用于恢复到不一样大小的硬盘的场景)
dd if=/root/backup-sda.mbr of=/dev/sda bs=446 count=1
# 仅恢复分区表
dd if=/root/backup-sda.mbr of=/dev/sda bs=512 skip=446 count=66
也可以用 sfdisk
来恢复和备份分区表
# 备份分区表到人类可读的文本文件
sfdisk -d /dev/sda > /root/backup-sda.sfdisk
# 恢复分区表
sfdisk /dev/sda < /root/backup-sda.sfdisk
GPT 备份与恢复
调整保留空间 (reserved blocks)
保留空间的意义是万一磁盘满了,可以为 root 用户修复问题保留一定的硬盘空间。系统盘建议设置保留空间,数据盘建议不保留。
# 用 ext4 文件系统对分区进行格式化。`-m 5` 代表保留 5% 的保留空间。
mkfs.ext4 -m 5 /dev/sda1
# 对于非系统盘,通常不用保留分区。
# -L 打标签用于辨别对应哪块硬盘,标签名最大长度 16 bytes
mkfs.ext4 -m 0 -L WD /dev/sda2
在格式化后也可以调整保留空间。
# 把保留空间设为 0
tune2fs -r 0 /dev/sda1
# 或者设为 1%
tune2fs -m 1 /dev/sde1
# 查看某个分区的保留空间
tune2fs -l /dev/sda1 | grep 'Reserved'
/boot 分区支持的文件系统有限
不支持 btrfs 和 lvm。建议用 ext4。
MBR 与 GPT
MBR 最多只有 4 个分区。分区大小不能超过 2 TB。GPT 没有这些限制。