Linux 分区结构全解

分区是存储管理的基础层,决定了操作系统如何组织数据、如何引导、以及磁盘空间如何分配。
本章从磁盘物理结构出发,系统讲解 MBR 与 GPT 两种分区表的原理、Linux 标准分区布局、
分区对齐策略,以及 systemd 的 Discoverable Partitions Specification。


分区基础

磁盘物理结构

机械硬盘(HDD)由盘片、磁头、主轴电机组成。每个盘片两面均可存储数据,每面被划分为
数千个同心圆磁道(track),磁道进一步被划分为扇区(sector)。扇区是磁盘 I/O 的最小
物理单元。

固态硬盘(SSD)没有机械部件,数据存储在 NAND 闪存颗粒中。SSD 的页(page)大小通常
,块(block)由多个页组成,典型为
SSD 的写入以页为单位,擦除以块为单位,这一特性直接影响分区对齐策略。

现代磁盘容量增长使传统的 CHS(Cylinder-Head-Sector)寻址方式在 以上
磁盘上失效,取而代之的是 LBA。

逻辑块寻址(LBA)

LBA(Logical Block Addressing)将整个磁盘抽象为一个线性编号的块序列,从
开始。操作系统和分区表只关心 LBA 编号,不再感知物理几何结构。

LBA 与物理扇区的对应关系:

  • 传统磁盘:
  • 4Kn 磁盘:
  • 512e 磁盘:(实际物理扇区

分区表、文件系统都基于 LBA 编号工作。

扇区大小:512B vs 4Kn vs 512e

扇区类型逻辑扇区物理扇区典型设备兼容性
512n旧HDD最佳
512e近年HDD/SSD良好
4Kn新企业级HDD需要OS支持

512e(Advanced Format)通过固件模拟 逻辑扇区以保持向后兼容,但内部
物理扇区为 。若分区未对齐到 边界,一次逻辑写入可能触发
两个物理扇区的读-改-写操作,导致性能下降。

检测磁盘扇区大小:

lsblk -t /dev/sda
cat /sys/block/sda/queue/physical_block_size
cat /sys/block/sda/queue/logical_block_size
sudo hdparm -I /dev/sda | grep "Logical Sector"

MBR 分区表

结构(512 字节)

MBR(Master Boot Record)位于磁盘第一个扇区(LBA 0),共 ,结构如下:

偏移(字节)长度内容
0x000446引导代码(Bootstrap Code)
0x1BE16分区表项 1
0x1CE16分区表项 2
0x1DE16分区表项 3
0x1EE16分区表项 4
0x1FE2签名

每个分区表项 的结构:

偏移长度含义
01引导标志(=活动,=非活动)
13起始 CHS 地址
41分区类型 ID(type ID)
53结束 CHS 地址
84起始 LBA(小端序)
124扇区总数(小端序)

限制

MBR 分区表存在三个根本性限制:

  1. 容量限制:扇区总数字段为 32 位,最大寻址 个扇区。按 /扇区计算,最大磁盘容量为
  2. 主分区数量:分区表仅有 空间,最多容纳 4 个主分区。
  3. 单点故障:MBR 仅存一份,损坏即丢失全部分区信息。

扩展分区(Extended Partition)是对限制 2 的折中方案:将一个主分区标记为扩展分区
(type ID ),在其内部建立 EBR(Extended Boot Record)链表,
每个 EBR 描述一个逻辑分区。扩展分区本身占用一个主分区名额。

MBR type ID 对照表

Type ID文件系统/用途说明
FAT12小容量 FAT
FAT16 <32M早期 DOS
Extended扩展分区(CHS)
FAT16B常规 FAT16
NTFS/exFATWindows 常用
FAT32 (CHS)Windows 常用
FAT32 (LBA)Windows 常用
Extended (LBA)LBA 寻址的扩展分区
Linux swapLinux 交换分区
LinuxLinux 原生分区
Linux ExtendedLinux 扩展分区
LVM逻辑卷管理
Linux RAIDLinux autodetect RAID

MBR 备份与恢复

# 备份 MBR
sudo dd if=/dev/sda of=/backup/mbr.bin bs=512 count=1
 
# 恢复 MBR(仅前 446 字节,保留分区表)
sudo dd if=/backup/mbr.bin of=/dev/sda bs=446 count=1 conv=notrunc
 
# 恢复完整 MBR(包含分区表,危险操作)
sudo dd if=/backup/mbr.bin of=/dev/sda bs=512 count=1

警告:恢复完整 MBR 会覆盖当前分区表,仅在分区表未改变时安全。


GPT 分区表

结构

GPT(GUID Partition Table)是 UEFI 标准的一部分,解决了 MBR 的三大限制。

GPT 磁盘的扇区布局:

LBA内容
0Protective MBR(兼容层)
1GPT 头(Primary Header)
2–33分区项数组(
34–…分区数据区域
LBA -33 至 -2备份分区项数组
LBA -1备份 GPT 头

GPT 头(,位于 LBA 1)的关键字段:

字段说明
Signature固定为 EFI PART
Revision当前版本
Header Size
Header CRC32头部校验和(计算时此字段置零)
My LBA当前头所在的 LBA(
Alternate LBA备份头所在的 LBA
First Usable LBA分区数据起始 LBA
Last Usable LBA分区数据结束 LBA
Disk GUID磁盘唯一标识符
Partition Entry Start LBA分区项数组起始 LBA(
Number of Partition Entries分区项数量(默认
Partition Entry Size每个分区项大小(
Partition Array CRC32所有分区项的校验和

GPT 使用 CRC32 校验和保护头部和分区项数组的完整性。BIOS/固件在启动时校验,
操作系统在挂载时校验。损坏的 CRC32 会导致分区表被拒绝。

GPT type GUID 对照表

GPT 使用 GUID 标识分区类型,而非 MBR 的单字节 type ID。

分区类型GUID
Linux Filesystem
Linux Swap
Linux LVM
Linux RAID
Linux /home
Linux /boot
EFI System Partition (ESP)
BIOS Boot Partition
Microsoft Basic Data
Microsoft Reserved
Windows Recovery

Protective MBR vs Hybrid MBR

Protective MBR(保护性 MBR)是 GPT 磁盘 LBA 0 的标准内容。它创建一个覆盖
整个磁盘的 type ID 分区,使不识别 GPT 的工具不会误操作磁盘。

Hybrid MBR(混合 MBR)是 GPT 磁盘上非标准地写入真实分区表项的做法。其目的是
让 Legacy BIOS 工具或旧操作系统(如 Windows XP)能够访问部分 GPT 分区。

混合 MBR 的风险:

  • 违反 GPT 规范,可能导致数据丢失
  • GPT 和 MBR 分区表可能产生冲突
  • 双重引导场景下容易引发问题

建议:除非有明确的兼容性需求,不要使用混合 MBR。

GPT 备份头(LBA -1)

GPT 在磁盘末尾保留完整的分区项数组和头部备份。当主 GPT 头损坏时,可用备份恢复:

# 使用 sgdisk 恢复 GPT 备份头
sudo sgdisk --load-backup=/dev/sda
 
# 使用 gdisk:进入专家模式后选择 recover
sudo gdisk /dev/sda
# 输入 x 进入专家模式
# 输入 e 从备份头重建主头
# 输入 w 写入

BIOS vs UEFI 引导与分区

BIOS + MBR

传统引导流程:

  1. BIOS POST(加电自检)
  2. BIOS 读取 LBA 0(MBR)的引导代码
  3. 引导代码加载活动分区的 VBR(Volume Boot Record)
  4. VBR 加载操作系统引导程序(如 GRUB stage 2)
  5. 引导程序加载内核和 initramfs

分区要求:

  • 只能使用 MBR 分区表
  • 最多 4 个主分区
  • 最大磁盘容量

BIOS + GPT(BIOS Boot Partition ef02)

GRUB 2 支持在 BIOS 模式下使用 GPT 磁盘,但需要一个特殊的 BIOS Boot Partition
(type GUID ,MBR type )。

BIOS Boot Partition 的作用:

  • 存放 GRUB 的 core.img(阶段 1.5/2 引导映像)
  • 大小通常 足够
  • 因为 MBR 只有 存放引导代码,无法直接指向 GPT 分区
# 创建 BIOS Boot Partition
sudo parted /dev/sda mkpart primary 1MiB 2MiB
sudo sgdisk --typecode=1:EF02 /dev/sda

UEFI + GPT(ESP ef00)

UEFI 引导流程:

  1. UEFI 固件读取 NVRAM 中的启动项
  2. 固件挂载 EFI System Partition(ESP)
  3. 执行 ESP 中的 EFI 应用程序(如 \EFI\ubuntu\grubx64.efi
  4. EFI 应用程序加载操作系统

ESP 要求:

  • 分区类型 GUID:
  • MBR type ID:
  • 文件系统:FAT32(
  • 挂载点:/boot/efi/boot
# 创建 ESP
sudo parted /dev/sda mkpart primary fat32 1MiB 513MiB
sudo sgdisk --typecode=1:EF00 /dev/sda
sudo mkfs.vfat -F 32 /dev/sda1
sudo mkdir -p /boot/efi
sudo mount /dev/sda1 /boot/efi

Secure Boot 对分区的要求

Secure Boot 是 UEFI 规范的安全特性,要求 EFI 二进制文件经过可信密钥签名。

与分区的间接关系:

  • ESP 必须完整可用,不能被未授权修改
  • Shim(第一阶段引导程序)由 Microsoft 签名,可链式加载发行版签名的 GRUB
  • 分区表本身不受 Secure Boot 保护,但 GRUB 会校验内核签名

Linux 分区 anatomy

ESP(/boot/efi 或 /boot)

EFI System Partition 是 UEFI 系统的必需分区。

属性推荐值
大小
文件系统FAT32
挂载点/boot/efi(多数发行版)或 /boot(Arch)
type GUID

ESP 内容示例:

/EFI/
├── BOOT/
│   └── BOOTX64.efi        # 默认引导程序
├── ubuntu/
│   ├── grubx64.efi         # GRUB EFI 二进制
│   └── shimx64.efi         # Shim 签名引导
├── fedora/
│   └── grubx64.efi
└── memtest86+/
    └── memtestx64.efi      # 内存测试工具

/boot(内核+initramfs)

/boot 存放 Linux 内核镜像、initramfs 和引导程序配置。

属性推荐值
大小
文件系统ext4(独立分区时)
是否需要独立分区取决于加密/RAID 方案

独立 /boot 分区的场景:

  • 根分区使用 LUKS 加密(GRUB 需要在解密前读取内核)
  • 使用 LVM 且 GRUB 不支持直接从 LV 引导(旧版 GRUB)
  • BIOS + GPT 需要 BIOS Boot Partition 旁边有可读分区

/(根分区)

根分区包含操作系统核心目录树。

属性推荐值
最小大小(桌面)/ (服务器)
文件系统ext4、btrfs、xfs
挂载选项defaults(通常足够)

现代 Linux 支持从 LVM、LUKS、RAID 等复杂存储栈引导根分区,前提是 initramfs
包含必要的模块。

/home

用户数据分区,与系统分区分离便于独立备份和系统重装。

属性推荐值
大小剩余磁盘空间或按需分配
文件系统ext4、btrfs、xfs
权限(用户私有)

独立 /home 的优势:

  • 系统重装时不丢失用户数据
  • 可使用不同文件系统(如 btrfs 快照)
  • 便于跨发行版共享数据分区

swap(分区 vs 文件、大小策略、hibernation)

Swap 提供虚拟内存扩展和休眠支持。

Swap 分区 vs Swap 文件

对比项Swap 分区Swap 文件
性能略优(无文件系统开销)差异可忽略(现代内核)
灵活性需要调整分区大小可随时增删
Hibernation原生支持需要额外配置
管理工具parted/fdiskddfallocate

大小策略

传统规则:。现代策略:

RAM 大小推荐 Swap说明
最低保障
适度缓冲
可选
或无看 OOM 策略

若需要 hibernation(挂起到磁盘):
其中 为预留量(单位 GiB)。

# 创建 swap 文件
sudo dd if=/dev/zero of=/swapfile bs=1M count=8192 status=progress
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# /etc/fstab:
# /swapfile  none  swap  sw  0  0

/var(日志、包缓存)

/var 包含可变数据:日志、邮件、打印队列、包缓存等。

属性推荐值
大小(通用服务器)
文件系统ext4、xfs
独立分区原因防止日志膨胀耗尽根空间

高日志流量的服务器(如 web 服务器、数据库)应考虑独立 /var 分区或使用
logrotate 控制增长。

/tmp

临时文件存放目录,系统重启后可清空。

属性推荐值
大小 或使用 tmpfs
文件系统tmpfs(内存)或 ext4
挂载选项noexec,nosuid,nodev(安全加固)

systemd 默认将 /tmp 挂载为 tmpfs(占用 RAM),适合内存充足(
的系统。I/O 密集型工作负载可能需要磁盘上的 /tmp

/usr(只读 + 组合挂载)

/usr 包含用户空间程序和库,是系统最大的目录之一。

UsrMerge:现代 Linux 发行版(Fedora、Arch、Debian 12+)将 /bin/sbin
合并到 /usr/bin/usr/sbin,通过符号链接兼容旧路径。

独立 /usr 分区的场景:

  • 嵌入式系统(只读根文件系统 + 可写的 /usr
  • 容器镜像优化

单分区 vs 多分区决策树

系统类型?
├── 桌面/笔记本
│   ├── UEFI?
│   │   ├── 是 → ESP + / + swap(文件)
│   │   └── 否 → / + swap(文件)
│   └── 需要加密? → ESP + /boot + LUKS(/ + swap)
├── 服务器
│   ├── 日志密集? → ESP + / + /var + swap
│   ├── 使用 LVM? → ESP + / + LVM(/var, /home, swap)
│   └── 简单部署 → ESP + / + swap
├── 容器宿主
│   └── ESP + /(btrfs,子卷隔离)+ swap
└── 嵌入式/IoT
    └── 只读 / + 可写 /var(tmpfs 或 overlay)

分区大小策略

/boot:512M-1G

/boot 分区需容纳多个内核版本。每个内核 + initramfs 约
保留 个内核版本, 足够;若使用大内核配置或多个架构,
考虑

# 查看当前 /boot 占用
du -sh /boot
# 查看已安装内核数量
rpm -qa kernel 2>/dev/null || dpkg -l 'linux-image-*' | grep ^ii

swap:RAM 大小策略

根据用途确定 swap 大小:

用途Swap 大小依据
无休眠桌面防止 OOM
休眠笔记本写入全部 RAM 内容
数据库服务器排序/哈希溢出
HPC 计算节点避免 swap 拖慢计算
虚拟化宿主虚拟机内存过量使用

Swappiness 参数控制内核使用 swap 的倾向(,默认 ):

# 查看当前 swappiness
cat /proc/sys/vm/swappiness
# 临时修改
sudo sysctl vm.swappiness=10
# 永久修改
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.d/99-swappiness.conf

/var:日志增长预估

/var/log 的增长速度取决于日志服务和应用。估算公式:

典型值:

  • 系统日志(journald):/天
  • Web 服务器(Apache/Nginx):/天(高流量)
  • 数据库:/天

建议:/var 至少 ,启用 logrotate,高流量服务器独立分区。

/home:用户数据需求

估算 /home 大小:

用户类型典型空间需求
轻度使用(邮件、浏览)
开发者
创意工作(视频、设计)
数据科学家

分区对齐

4K 对齐(Advanced Format)

Advanced Format 磁盘使用 物理扇区。分区起始和结束位置必须是
(即 扇区)的整数倍,否则发生跨扇区写入。

性能影响:

  • 随机写入:未对齐导致 性能下降
  • 顺序写入:影响较小但仍可测量
  • SSD:未对齐增加写放大,降低寿命

parted 1MiB 起始

parted 默认使用 )作为分区起始偏移,
这自动满足 对齐要求,因为

# parted 默认 1MiB 对齐
sudo parted /dev/sda mkpart ext4 1MiB 100%
# 验证对齐
sudo parted /dev/sda align-check optimal 1

性能影响

使用 fio 验证对齐对性能的影响:

# 未对齐的随机写入测试(模拟)
fio --name=unaligned --ioengine=libaio --direct=1 \
    --bs=4k --iodepth=1 --rw=randwrite \
    --filename=/dev/sda --offset=512 --size=1G
 
# 对齐的随机写入测试
fio --name=aligned --ioengine=libaio --direct=1 \
    --bs=4k --iodepth=1 --rw=randwrite \
    --filename=/dev/sda --offset=1048576 --size=1G

Discoverable Partitions Specification

systemd 约定的 GPT type GUID

systemd 定义了一套标准的 GPT 分区类型 GUID,使系统组件能够自动识别分区用途。
这被称为 Discoverable Partitions Specification(DPS)。

分区用途GUID挂载点
Boot Loader Partition/boot/efi
Root Partition (x86-64)/
Root Partition (ARM64)/
Root Partition (IA-64)/
/usr Partition (x86-64)/usr
/home Partition/home
/var Partition/var
/var/tmp/var/tmp
/var/log/var/log
Swap[swap]
Extended Boot Loader/boot

A/B 分区方案

A/B 分区方案(也称 Seamless Updates)主要用于 Android 和嵌入式系统,也适用于
原子更新的 Linux 系统。

基本思路:磁盘上保留两套根分区(A 和 B),一次只激活其中一套。更新时将新系统写入
非活动分区,然后切换引导标记。

磁盘布局:
├── Boot Partition(共享)
├── Slot A: 根分区 + /usr + /var
├── Slot B: 根分区 + /usr + /var
└── 数据分区(共享 /home)

优势:

  • 更新原子性:失败可立即回滚
  • 无需单独的恢复分区
  • 减少用户等待时间

与 systemd-boot 的关系

systemd-boot(formerly gummiboot)是一个轻量级 UEFI 引导程序,原生支持 DPS:

  • 自动发现 ESP 并加载 EFI 可执行文件
  • 自动发现 XBOOTLDR 分区(/boot
  • 读取 BLS(Boot Loader Specification)条目
  • 与 Secure Boot 兼容
# 安装 systemd-boot
sudo bootctl install
 
# 查看引导配置
bootctl status
ls /boot/loader/entries/

BLS 条目示例(/boot/loader/entries/arch.conf):

title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options root=/dev/sda2 rw

参考命令速查

# 查看所有分区和文件系统
lsblk -f
blkid
 
# 查看分区表类型
sudo parted /dev/sda print
 
# 查看 GPT 分区详情
sudo sgdisk -p /dev/sda
 
# 查看 MBR 分区详情
sudo fdisk -l /dev/sda
 
# 检查分区对齐
sudo parted /dev/sda align-check optimal 1
 
# 查看挂载情况
findmnt --real
cat /proc/mounts

总结

分区方案的选择取决于引导方式(BIOS/UEFI)、系统用途(桌面/服务器/嵌入式)、
安全需求(加密/Secure Boot)和运维策略(原子更新/快照)。

核心原则:

  1. UEFI 系统始终使用 GPT,BIOS 系统在 以下可使用 MBR
  2. 所有分区必须 对齐
  3. Swap 大小根据实际用途而非固定公式确定
  4. 独立分区提供隔离性但增加管理复杂度
  5. 遵循 Discoverable Partitions Specification 有利于系统集成