EFI 系统分区详解
1. 概述
1.1 定义与本质
EFI 系统分区(EFI System Partition,ESP)是由 UEFI 规范定义的一种独立于操作系统的分区,用于存储 UEFI 固件启动所需的引导加载程序、应用程序及驱动程序。该分区是 UEFI 启动机制的必要组成部分。
从规范角度而言,ESP 的本质特征并非源于其物理位置或分区序号,而是取决于固件是否将其识别为启动目标。一个分区被视作 ESP 的充要条件为:
- 磁盘采用 GUID 分区表(GUID Partition Table,GPT),且该分区的类型 GUID 为
C12A7328-F81F-11D2-BA4B-00A0C93EC93B(gdisk 类型码EF00,fdisk 别名uefi)。 - 文件系统为 UEFI 规范所支持的 FAT 变体(FAT12、FAT16 或 FAT32)。
- 固件在启动过程中主动扫描并识别该分区。
因此,ESP 并非因其 GPT GUID 或标签而 inherently 特殊,这些属性仅是固件在需要定位启动介质时使用的识别凭证。即便在磁盘上创建多个具有 ESP GUID 的分区,固件亦无义务扫描全部候选分区,且不对选择哪一个作出保证。
1.2 规范要求与文件系统
UEFI 规范要求固件必须支持 FAT12、FAT16 和 FAT32 文件系统。尽管合规厂商可扩展支持其他文件系统(例如 Apple Mac 固件对 HFS+ 的支持),但为保证跨平台兼容性,ESP 应格式化为 FAT32。对于容量小于 32 MiB 的分区,可采用 FAT16 或 FAT12;例如,2 MiB 的 ESP 仅支持 FAT12。
格式化应使用 mkfs.fat(源自 dosfstools 软件包)。若收到警告 WARNING: Number of clusters for 32 bit FAT is less than suggested minimum,且无法扩大分区时,可通过 -s 2 或 -s 1 减小簇大小,否则分区可能无法被某些 UEFI 实现读取。
1.3 容量规划
建议将 ESP 容量设置为 1 GiB,以确保容纳多个内核、统一内核映像(Unified Kernel Image)、引导加载程序、固件更新文件及其他操作系统或 OEM 文件。若存在疑虑,4 GiB 足以覆盖绝大多数场景。特定用例如下:
| 场景 | 建议容量 |
|---|---|
常规单系统,不将 ESP 挂载至 /boot |
至少 100 MiB |
将 ESP 挂载至 /boot,仅安装单个内核 |
至少 400 MiB |
| 与 Windows 双启动,512 B 逻辑扇区 | 至少 200 MiB(Microsoft 部署指南) |
| 与 Windows 双启动,4 KiB 逻辑扇区(Advanced Format 4Kn) | 至少 300 MiB |
| 使用 Btrfs 快照引导(如 Limine + Snapper)或 ESP 上的 Archiso | 至少 8 GiB |
为确保可格式化为 FAT32,在 512 B 扇区磁盘上应至少为 36 MiB,在 4 KiB 扇区磁盘上应至少为 260 MiB。若上述情形均不适用,分区最小可为 2 MiB,但此时仅能容纳引导加载程序本身。
2. 启动机制
2.1 UEFI 启动变量
在正常运行条件下,系统启动时固件首先检索 NVRAM 中的 BootOrder 变量。该变量为一个 16 位无符号整数列表,以十六进制大写形式表示,例如:
BootOrder: 0001, 001A, 0003
固件按序迭代该列表。对于每个条目(如 0001),固件查找同名的 Boot#### 变量(如 Boot0001)。若变量存在,则读取其内容;若不存在,则继续处理下一项。
Boot#### 变量的内容通常包含:
- 一个人类可读的标签(Label);
- 一条设备路径(Device Path),用于描述定位启动目标所需的硬件拓扑与逻辑位置;
- 可选的启动参数,传递给被加载的程序。
2.2 设备路径
设备路径(Device Path)是一个序列化的节点链,每个节点对应系统拓扑中的一个层级。典型的设备路径示例如下:
ACPI(a0341d0,0)PCI(1f,2)SATA(0,0,0)HD(1,800,64000,12029cda-8961-470d-82ba-aeb17dba91a5)File(\EFI\fedora\shim.efi)
各节点的含义为:
ACPI(a0341d0,0):ACPI 命名空间中的设备,通常对应 PCI Express Root Port;PCI(1f,2):PCI 总线上的设备与功能号;SATA(0,0,0):SATA 控制器端口、端口乘数器及 LUN;HD(1,800,64000,12029cda-8961-470d-82ba-aeb17dba91a5):硬盘分区节点,包含分区号、起始 LBA、大小(以扇区计)及分区 GUID;File(\EFI\fedora\shim.efi):目标文件路径,使用反斜杠作为分隔符(UEFI 环境约定)。
设备路径中的 HD() 节点所包含的分区 GUID 仅需与分区表中的 GUID 匹配,不要求该 GUID 必须是 ESP 的专用 GUID。换言之,固件通过设备路径定位分区时,并不检验该分区是否为严格意义上的 ESP;唯一的硬性要求是文件系统必须为 FAT,因为这是固件保证能够识别的唯一文件系统。
固件按顺序初始化设备路径中涉及的每个外设。部分设备(如 ACPI 表、PCI Root Hub)通常已提前初始化,而 SATA 控制器及其下游设备则可能需要在此阶段完成初始化。初始化完成后,固件检查磁盘是否存在匹配 HD() 描述的分区。若找到且包含 FAT 文件系统,则进一步查找 File() 指定的路径。若任一环节失败,固件转向 BootOrder 的下一项,重复上述流程。
2.3 正常启动流程
正常启动的完整流程可归纳如下:
- 固件读取 NVRAM 中的
BootOrder; - 按序读取每个
Boot####变量; - 解析变量中的设备路径;
- 初始化设备路径中尚未就绪的外设;
- 匹配
HD()节点指定的分区; - 验证分区文件系统为 FAT;
- 加载
File()节点指定的 EFI 应用程序; - 将控制权移交至该应用程序。
若设备路径仅包含 HD() 与 File() 节点而未指定完整的总线拓扑,UEFI 规范允许固件以任意顺序初始化所有外设,直至定位到匹配的分区。此种简化路径在常见实现中广泛存在。
2.4 默认启动行为与回退机制
当 BootOrder 遍历完毕且未找到有效启动项时,固件进入默认启动行为(Default Boot Behavior)。此时固件执行以下步骤:
- 初始化所有可发现的外设;
- 优先扫描可移动介质 (如光学介质、U 盘)。对每个可移动设备,查找具有 ESP GUID 及 FAT 文件系统的分区,并尝试加载
\EFI\BOOT\BOOTX64.EFI(文件名依架构而定,如BOOTIA32.EFI、BOOTAA64.EFI等)。 - 若无可移动介质可启动,或启动的应用程序返回错误,则继续扫描直至穷尽。
- 若仍无有效启动源,转而扫描固定介质 (如内置硬盘),以相同方式查找 ESP 并尝试启动
\EFI\BOOT\BOOTX64.EFI。
此机制使得操作系统安装介质或 Live 镜像无需预写 NVRAM 变量即可启动。对于已安装系统,若 NVRAM 启动项损坏或磁盘被迁移至新机器,该回退路径提供了自动修复的可能性。
2.4.1 fallback.efi 与启动项重建
在采用 shim 的发行版(如 Fedora)中,\EFI\BOOT\BOOTX64.EFI 实为 shim 的副本,但其行为因启动路径不同而有所差异。当 shim 检测到自身是从 \EFI\BOOT 被加载时,会检查同目录下是否存在 fallback.efi。若存在,则将其作为普通 UEFI 应用程序执行。
fallback.efi 的设计目的在于重建损坏的 BootOrder 或 Boot#### 变量。其工作流程如下:
- 查询固件,确定
fallback.efi自身所在的磁盘; - 遍历该磁盘
\EFI目录下除BOOT外的所有子目录; - 在每个子目录中查找名为
BOOT.CSV的文件; - 解析
BOOT.CSV(UCS-2 编码的逗号分隔值文件),为每个有效条目创建新的Boot####变量,并将其追加至BootOrder。
以 Fedora 为例,\EFI\fedora\BOOT.CSV 的内容格式为:
shim.efi,Fedora,,This is the boot entry for Fedora
fallback.efi 将据此创建一个标签为 "Fedora" 的启动项,其设备路径指向该磁盘上的 \EFI\fedora\shim.efi。处理完所有 CSV 文件后,fallback.efi 启动所添加的第一个选项。下次启动时,BootOrder 已恢复,系统将按正常流程启动。
3. 分区创建与格式化
3.1 分区表类型选择
强烈建议使用 GPT 而非 MBR。原因如下:
- 部分固件不支持 UEFI/MBR 启动,且 Windows 安装程序不生成此类配置;
bootctl(systemd-boot 安装工具)不支持将引导程序安装至 MBR 磁盘;- GPT 在分区数量、容量及数据完整性方面均优于 MBR。
警告:ESP 必须是磁盘主分区表中的物理分区,不可置于 LVM、软件 RAID(除特定 RAID1 配置外)或其他虚拟化层之上。
3.2 GPT 磁盘上的创建
GPT 磁盘通过分区类型 GUID C12A7328-F81F-11D2-BA4B-00A0C93EC93B 标识 ESP。可选用以下工具之一:
fdisk(util-linux ≥ 2.23):
bash
fdisk /dev/sdX
# n → 新建分区
# t → 更改分区类型,输入 uefi
gdisk:
bash
gdisk /dev/sdX
# n → 新建分区
# Hex code or GUID: EF00
GNU Parted:
bash
parted /dev/sdX
# mkpart primary fat32 1MiB 261MiB
# set 1 esp on
esp 标志在 GPT 磁盘上会自动同时设置 boot 标志;UEFI 启动仅识别 esp,无需单独设置 boot。
3.3 MBR 磁盘上的创建
尽管不推荐,MBR 磁盘亦可通过分区类型 ID 0xEF(fdisk 中显示为 EFI (FAT-12/16/32))创建 ESP。操作方法:
fdisk:
bash
fdisk /dev/sdX
# n → 新建主分区
# t → 更改分区类型为 EF
GNU Parted:
bash
parted /dev/sdX
# mkpart primary fat32 1MiB 261MiB
# set 1 esp on
3.4 文件系统格式化
创建分区后,必须显式格式化。ESP 应格式化为 FAT32:
bash
mkfs.fat -F 32 /dev/sdXY
对于小于 32 MiB 的分区,若无法使用 FAT32,则降级为 FAT16 或 FAT12:
bash
# 例如 2 MiB 分区
mkfs.fat -F 12 /dev/sdXY
3.5 分区起始对齐
磁盘 LBA 0 至 LBA 33 属于 GPT 元数据保留区域,不可用于用户数据分区:
| LBA 范围 | 内容 |
|---|---|
| LBA 0 | 保护性 MBR(Protective MBR) |
| LBA 1 | GPT 主头部(Primary GPT Header) |
| LBA 2--33 | GPT 分区表项数组(最多 128 个条目) |
现代磁盘(尤其是采用 4 KiB 物理块的 SSD 及高级格式化机械硬盘)要求分区起始位置为物理块大小的整数倍,以避免跨块读写导致的性能下降。1 MiB(即 512 B 逻辑扇区下的 LBA 2048,或 4 KiB 逻辑扇区下的 LBA 256)已成为工业标准对齐边界。因此,建议将 ESP 起始位置设为 1 MiB,结束位置按所需容量计算(如 261 MiB 对应实际容量 260 MiB)。
| 起始位置 | 可行性 | 说明 |
|---|---|---|
| LBA 0 | 不可行 | 覆盖 GPT 保护性 MBR 及主头部 |
| LBA 34 | 可行但不推荐 | GPT 分区表后第一个可用扇区,未对齐 1 MiB 边界 |
| LBA 2048(1 MiB) | 推荐 | 工业通用对齐边界,适配 4 KiB 物理块磁盘 |
4. 挂载与文件组织
4.1 典型挂载方案
ESP 的挂载点选择直接影响系统维护复杂度与安全性。三种典型方案如下:
方案一:挂载至 /boot
- 简化维护:
/boot是微码更新工具及mkinitcpio等生成内核映像的默认路径,直接挂载至此可避免手动复制文件。 - 兼容性:确保所有引导加载程序均可访问内核与 initramfs,因为并非所有引导加载程序均支持从其他卷加载文件。
- 缺点:FAT 文件系统不支持文件权限与扩展属性,全局权限在挂载时统一设置;增加 ESP 空间需求;内核与 initramfs 暴露于可引导驱动器或其他操作系统的潜在操作(双系统环境下);无法加密
/boot;根卷快照(Btrfs、ZFS、LVM 等)不包含/boot内容,回滚至旧内核快照可能导致无法启动。
方案二:挂载至 /efi,并额外将扩展引导加载程序分区(XBOOTLDR)挂载至 /boot
- 适用于 ESP 过小且不易扩容的场景(如 Windows 之后安装 Linux 进行双启动)。
- 至少得到 systemd-boot 支持。
- 保留
/boot的 Linux 文件系统特性,同时分离 UEFI 文件与操作系统文件。
方案三:挂载至 /efi
- 仅 GRUB 与 rEFInd 支持此方案。
- 实现操作系统文件与 UEFI 文件的完全分离。
- 保留
/boot的权限与扩展属性。 - 允许按需单独挂载 ESP。
- 配合系统加密时,可仅保留必要文件不加密,而
/boot保持受保护状态。
注 :/efi 为历史上 /boot/efi 的替代挂载点。该目录默认不存在,需手动创建。
4.2 多系统共享与目录结构
单个 ESP 可同时服务于多个操作系统。UEFI 固件通过 NVRAM 启动项或 \EFI\BOOT\BOOTX64.EFI 回退路径选择具体加载的 .efi 文件。多系统共存的典型目录布局如下:
ESP/
├── EFI/
│ ├── BOOT/
│ │ └── BOOTX64.EFI # 默认回退引导程序
│ ├── fedora/
│ │ ├── shim.efi
│ │ ├── grubx64.efi
│ │ └── BOOT.CSV
│ ├── arch/
│ │ └── grubx64.efi
│ └── Microsoft/
│ └── Boot/
│ └── bootmgfw.efi
├── loader/ # systemd-boot 配置
│ ├── entries/
│ │ ├── arch.conf
│ │ └── windows.conf
│ └── loader.conf
└── installs/ # 多 Linux 内核存放(自定义方案)
├── arch/
│ ├── vmlinuz-linux
│ ├── initramfs-linux.img
│ └── intel-ucode.img
└── tiny/
├── vmlinuz-linux
└── initramfs-linux.img
当使用 systemd-boot 管理多 Linux 安装时,由于各系统的内核与 initramfs 默认均输出至 /boot,直接共享一个 /boot 会导致文件名冲突。解决方案是在 ESP 上为每个系统建立独立子目录(如 /mnt/efi/installs/${system-name}),并通过 bind mount 将其映射到各系统的 /boot:
bash
# /etc/fstab
/mnt/efi/installs/arch /boot none defaults,bind 0 0
此机制使得各系统的包管理器(如 pacman)可直接更新 /boot 下的文件,而实际写入位置为 ESP 上的独立子目录。对应的 systemd-boot 条目配置如下:
ini
title Arch Linux
linux /installs/arch/vmlinuz-linux
initrd /installs/arch/intel-ucode.img
initrd /installs/arch/initramfs-linux.img
options root=PARTUUID=xxxxx-xxxxx rw
对于无法直接由 systemd-boot 引导的系统(如采用 ZFS 根且需支持 boot environment 的 FreeBSD),可通过链式加载(chainloading)实现:在 systemd-boot 条目中指向 FreeBSD 的 boot1.efi,由后者继续完成 FreeBSD 的启动流程。
4.3 内核同步机制
若 ESP 未挂载至 /boot,则必须在每次内核或 initramfs 更新后,将文件同步至 ESP。以下列出几种自动化机制:
4.3.1 绑定挂载(Bind Mount)
将 ESP 上的特定子目录绑定挂载至 /boot,使包管理器直接更新 ESP 上的文件:
bash
mount --bind esp/EFI/arch /boot
持久化配置(/etc/fstab):
esp/EFI/arch /boot none defaults,bind 0 0
注意 :此方案要求内核与引导加载程序均支持 FAT32。某些发行版若需在 /boot 中建立符号链接,则可能不兼容。
4.3.2 systemd 路径单元
利用 systemd 的路径检测功能,在 /boot/initramfs-linux-fallback.img 变更时触发同步服务:
ini
# /etc/systemd/system/efistub-update.path
[Unit]
Description=Copy EFISTUB Kernel to EFI system partition
[Path]
PathChanged=/boot/initramfs-linux-fallback.img
[Install]
WantedBy=multi-user.target
WantedBy=system-update.target
ini
# /etc/systemd/system/efistub-update.service
[Unit]
Description=Copy EFISTUB Kernel to EFI system partition
[Service]
Type=oneshot
ExecStart=/usr/bin/cp -af /boot/vmlinuz-linux esp/EFI/arch/
ExecStart=/usr/bin/cp -af /boot/initramfs-linux.img esp/EFI/arch/
ExecStart=/usr/bin/cp -af /boot/initramfs-linux-fallback.img esp/EFI/arch/
启用并启动 efistub-update.path。
4.3.3 mkinitcpio 预设
编辑 /etc/mkinitcpio.d/linux.preset,直接指定输出路径至 ESP:
bash
ESP_DIR="esp/EFI/arch"
ALL_kver="${ESP_DIR}/vmlinuz-linux"
PRESETS=('default' 'fallback')
default_image="${ESP_DIR}/initramfs-linux.img"
fallback_image="${ESP_DIR}/initramfs-linux-fallback.img"
4.3.4 mkinitcpio 后置钩子
创建可执行脚本 /etc/initcpio/post/copy-kernel-and-initramfs:
bash
#!/usr/bin/env bash
kernel="$1"
initramfs="$2"
target_dir="esp/EFI/arch"
files_to_copy=()
for file in "$kernel" "$initramfs"; do
if [[ -n "$file" ]] && ! cmp -s -- "$file" "${target_dir}/${file##*/}"; then
files_to_copy+=("$file")
fi
done
(( ! ${#files_to_copy[@]} )) && exit 0
cp -af -- "${files_to_copy[@]}" "${target_dir}/"
4.3.5 pacman 钩子
创建钩子文件 /etc/pacman.d/hooks/999-kernel-efi-copy.hook:
ini
[Trigger]
Type = Path
Operation = Install
Operation = Upgrade
Target = usr/lib/modules/*/vmlinuz
Target = usr/lib/initcpio/*
Target = boot/*-ucode.img
[Action]
Description = Copying linux and initramfs to EFI directory...
When = PostTransaction
Exec = /usr/local/bin/kernel-efi-copy.sh
对应脚本 /usr/local/bin/kernel-efi-copy.sh:
bash
#!/bin/sh
ESP_DIR="esp/EFI/arch"
for file in /boot/vmlinuz*; do
cp -af "$file" "$ESP_DIR/$(basename "$file").efi" || exit 1
done
for file in /boot/initramfs*; do
cp -af "$file" "$ESP_DIR/" || exit 1
done
[ -e /boot/intel-ucode.img ] && cp -af /boot/intel-ucode.img "$ESP_DIR/"
[ -e /boot/amd-ucode.img ] && cp -af /boot/amd-ucode.img "$ESP_DIR/"
exit 0
5. 高级管理
5.1 分区扩容与替换
当预装系统(如 Windows)创建的 ESP 过小(常见为 100 MiB)时,可能需要替换为更大的分区。
5.1.1 释放空间并新建分区
在 Windows 中,通过 diskmgmt.msc 压缩 C 盘(如释放 4 GiB),然后在 Linux 环境下执行以下操作:
-
备份原 ESP 内容:
bashcp -a esp /esp_backup -
卸载原 ESP,并停止相关 systemd 挂载单元:
bashumount esp systemctl stop esp.mount esp.automount -
记录原分区的 UUID 与 PARTUUID:
bashblkid /dev/sdXY -
使用 sgdisk 删除旧分区并新建(复用旧 PARTUUID 与 PARTLABEL):
bashsgdisk --delete=Y /dev/sdX sgdisk --align-end --largest-new=0 --typecode=0:ef00 \ --change-name=0:'EFI system partition' \ --partition-guid=0:YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY /dev/sdX -
通知内核重新读取分区表:
bashpartprobe /dev/sdX -
格式化为 FAT32 并复用旧 UUID(移除连字符):
bashmkfs.fat -F 32 -i XXXXXXXX /dev/sdXY -
挂载新分区并恢复数据:
bashmount /dev/sdXY esp cp -a /esp_backup/. esp/
5.1.2 牺牲相邻交换分区扩容
若 ESP 后紧邻交换分区,可删除交换分区以扩大 ESP:
- 停用并移除交换分区;
- 使用 fdisk 删除交换分区,然后扩大 ESP 分区至最大可用空间;
- 由于
fatresize及 libparted 对 FAT 卷的大小调整支持有限,通常需备份文件、创建新文件系统后恢复数据; - 记录并复用原 UUID;
- 通过交换文件替代被删除的交换分区。
5.2 软件 RAID1 配置
将 ESP 纳入 RAID1 阵列存在数据损坏风险,且需特殊处理。若必须实施,应使用 --metadata 1.0 将 RAID 元数据保留于分区末尾,避免固件无法读取:
bash
mdadm --create --verbose --level=1 --metadata=1.0 \
--raid-devices=2 /dev/md/ESP /dev/sdaX /dev/sdbY
更安全的替代方案是手动维护:在主 ESP 更新后,将其内容复制至另一磁盘的次要 ESP,并通过 efibootmgr 为次要 ESP 手动添加启动项。此方案避免了 RAID 的固件兼容性问题,但仅在单操作系统环境下有效。
5.3 休眠与多系统挂载策略
在多启动系统(包括 Windows 双启动)中,若希望在主系统休眠时启动至另一系统,严禁同时挂载同一 ESP,否则极易导致数据损坏与 I/O 错误。
缓解策略包括:
-
独立 ESP:为每个系统分配物理上独立的 ESP(位于不同磁盘)。大多数 UEFI 固件支持此配置,但硬件支持与易用性存在差异。
-
自动挂载 :利用 systemd 自动挂载机制,仅在需要时挂载 ESP,并设置空闲超时(
x-systemd.idle-timeout=)。注意 :除非 ESP 挂载至/boot,否则不可在内核升级期间依赖自动挂载;此外,必须确保系统在自动卸载 ESP 之后才进入休眠。 -
休眠前卸载 :将 ESP 挂载至
/efi,并在系统休眠前卸载,恢复后重新挂载。可创建 systemd 服务实现自动化:ini# /etc/systemd/system/efi-remount-on-hibernate.service [Unit] Description=Unmount and remount EFI system partition on hibernation Before=hibernate.target hybrid-sleep.target suspend-then-hibernate.target StopWhenUnneeded=yes [Service] Type=oneshot RemainAfterExit=yes ExecCondition=/usr/bin/systemctl is-active --quiet efi.mount ExecStart=/usr/bin/systemctl stop efi.mount ExecStop=/usr/bin/systemctl start efi.mount [Install] WantedBy=hibernate.target hybrid-sleep.target suspend-then-hibernate.target由于
efi.mount默认被local-fs.target依赖,停止它可能导致副作用。需在/etc/fstab中为/efi添加以下挂载选项:x-systemd.wanted-by=local-fs.target,x-systemd.after=local-fs-pre.target,x-systemd.before=local-fs.target
6. 工程实践与兼容性
6.1 固件实现差异
尽管 UEFI 规范未对 ESP 的物理位置作强制限定,但工程实践中需考虑以下限制:
- LBA 寻址边界 :2015 年后的主流 PC 采用 64 位 LBA,整块磁盘均可访问;但部分老旧固件及工控/服务器平台仍使用 32 位 LBA,最大寻址范围为 2 32 − 1 2^{32} - 1 232−1 个扇区。在 512 B 扇区条件下,该上限对应 2 TiB。ESP 的全部扇区必须位于此边界以内,否则固件无法读取。
- 扫描范围:极少数 OEM 固件虽声称符合 UEFI 规范,但实现存在缺陷,仅扫描磁盘靠前的若干分区条目,导致位于磁盘中后部的 ESP 无法被识别。此现象属于固件实现缺陷,而非规范限制。
6.2 操作系统安装器行为
- Windows 安装程序 :默认强制将 ESP 创建于磁盘靠前位置。若手动在磁盘中部或尾部新建 ESP,安装程序通常拒绝将其识别为安装目标,但手动执行
bcdboot修复引导后仍可正常使用。 - Linux 安装器 :大多数可识别任意位置的 ESP,但部分自动化脚本默认写死
/dev/sda1,需手动指定 ESP 设备路径。
6.3 常见故障排除
固件无法识别 EFI 目录 :若 FAT 文件系统被赋予了卷名(文件系统标签),切勿 将其命名为 EFI。某些固件会因卷名与目录名匹配而触发错误,导致无法识别 EFI 目录。
NVRAM 启动项失效 :NVRAM 中的启动项记录的是磁盘 GUID 与分区 GUID ,而非 LBA 位置。因此,仅移动分区的物理位置、分区本身未被删除时,启动项仍然有效;但若删除后重建 ESP,分区 GUID 改变,NVRAM 条目即告失效,需通过 efibootmgr 或 bcdboot 重新建立。
附录:常用 GPT 分区类型 GUID 对照
| 分区名称 | GPT 类型 GUID | gdisk 代码 | fdisk 别名 | 文件系统 | 功能说明 |
|---|---|---|---|---|---|
| EFI System Partition | C12A7328-F81F-11D2-BA4B-00A0C93EC93B |
EF00 |
uefi |
FAT32 | UEFI 固件识别的系统启动分区,存放引导加载程序及启动配置 |
| BIOS Boot Partition | 21686148-6449-6E6F-744E-656564454649 |
EF02 |
--- | 无 | 用于 BIOS(Legacy)模式下 GPT 磁盘启动,GRUB 2 嵌入 core.img |
| Microsoft Reserved | E3C9E316-0B5C-4DB8-817D-F92DF00215AE |
0C01 |
msr |
无 | Windows 专属保留分区,Linux 系统不需要 |
| Linux Filesystem | 0FC63DAF-8483-4772-8E79-3D69D8477DE4 |
8300 |
linux |
ext4 / xfs / btrfs 等 | Linux 根分区或普通数据分区 |
| Linux Extended Boot | BC13C2FF-59E6-4262-A352-B275FD6F7172 |
EA00 |
--- | ext4 / xfs 等 | systemd 自动发现规范定义的扩展启动分区 |
| Linux LVM | E6D6D379-F507-44C2-A23C-238F2A3DF928 |
8E00 |
lvm |
LVM PV | Linux LVM 物理卷 |
| Linux RAID | A19D880F-05FC-4D3B-A006-743F0F84911E |
FD00 |
raid |
mdadm | Linux 软件 RAID 成员 |
| Linux Swap | 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F |
8200 |
swap |
swap | Linux 交换分区 |
| Windows Recovery | DE94BBA4-06D1-4D40-A16A-BFD50179D6AC |
2700 |
--- | NTFS | Windows 恢复环境(Windows RE)分区 |
附录:Windows 环境下 ESP 操作命令
diskpart
batch
diskpart
list disk
select disk X
create partition efi size=260
format quick fs=fat32 label="System"
assign letter=S
exit
bcdboot C:\Windows /s S: /f UEFI
PowerShell
powershell
New-Partition -DiskNumber 0 -Size 260MB -GptType "EFI" |
Format-Volume -FileSystem FAT32 -NewFileSystemLabel "System"
注意 :Windows 内置磁盘管理(diskmgmt.msc)不提供直接创建 ESP 的功能,其"新建简单卷"向导仅能创建基本数据分区。
附录:Linux 环境下 ESP 创建工具对照
| 工具 | 设置 GPT 类型方式 | 适用场景 |
|---|---|---|
gdisk |
新建分区时输入 EF00 |
交互式手动分区 |
fdisk(util-linux ≥ 2.23) |
t 命令后输入别名 uefi |
交互式手动分区 |
parted / gparted |
set esp on 或图形界面勾选 "esp" |
脚本自动化或图形界面 |
sgdisk |
--new 配合 --typecode |
非交互式脚本 |
附录:parted 分区起始不用 0,选用 1MiB 的原因
bash
(parted) mkpart primary fat32 1MiB 261MiB
不能将 0MiB 作为起始地址,该限制由多重技术因素决定。
1. 磁盘 0 号位置不属于用户数据区域
磁盘 LBA0(第 0 号扇区)存放 保护性 MBR(Protective MBR),用于防止旧版 MBR 工具误识别或误改写 GPT 磁盘。
GPT 磁盘结构如下:
- LBA0:保护性 MBR
- LBA1:GPT 头部(GPT Header)
- LBA2--LBA33:GPT 分区表项数组,最多容纳 128 个分区条目
LBA0--LBA33 属于 GPT 元数据区域,不可分配给用户分区 。
若强行令分区从 0 开始,将直接覆盖 GPT 头部与分区表,导致分区表损坏。
2. 1MiB 是现代磁盘的标准对齐边界
现代 HDD 与 SSD 的物理块(Physical Block)或物理页大小已不限于传统 512 B:
- 多数设备物理块大小为 4 KiB(4096 B,即 4K 扇区磁盘)
- 1 MiB = 1024 KiB = 256 × 4 KiB
1MiB 换算为扇区数:
- 512 B 逻辑扇区:1 MiB = 2048 扇区
- 4 KiB 逻辑扇区:1 MiB = 256 扇区
LBA 2048(即 1 MiB 处)与磁盘起始之间预留了 LBA0--LBA2047:
- LBA0--LBA33:保护性 MBR、GPT 头部、分区表
- LBA34--LBA2047:空闲间隙
分区自 LBA 2048(1 MiB)起始,可确保分区起始偏移量为物理块大小的整数倍,读写操作不会出现跨物理块访问,从而避免 SSD 与机械硬盘的性能下降。
该做法即通常所称的 1 MiB 分区对齐。Linux 安装器与 parted 在新建分区时默认采用此偏移量。
3. 可否使用 34s(34 扇区)紧贴 GPT 表头?
parted 支持以扇区为单位(后缀 s)。理论上可写:
bash
mkpart primary fat32 34s 261MiB
LBA 34 是 GPT 分区表结束后的第一个空闲扇区,但实际中极少采用,原因如下:
- 对齐问题:34s 的起始位置未对齐 1 MiB 边界,在 4 KiB 物理块磁盘上将导致分区未对齐,造成性能损失。
- 兼容性:保留 LBA34--LBA2047 的空闲区域,可为部分固件、BIOS 私有数据或硬件隐藏元数据提供兼容空间。
4. 误区澄清:1MiB 并非分区开销
1MiB 仅表示分区起始点,ESP 分区的实际可用容量为:
261 MiB − 1 MiB = 260 MiB 261\,\text{MiB} - 1\,\text{MiB} = 260\,\text{MiB} 261MiB−1MiB=260MiB
5. 与 MBR 磁盘的对照
MBR 磁盘的 LBA0 存放 MBR 引导代码。传统工具常从第 63 扇区开始分区(受遗留 CHS 几何结构限制),该偏移量已不适用于现代磁盘。GPT 磁盘则直接采用 1 MiB(2048 扇区)作为通用起始偏移。
总结
- LBA0--LBA33 存放保护性 MBR、GPT 头部及分区表,不可用于用户分区。
- 1 MiB(LBA 2048)是工业界通用的对齐边界,适配 4 KiB 物理块磁盘,保障 I/O 性能。
- 虽然可从 LBA 34 紧贴 GPT 表头开始分区,但会破坏对齐要求,通常不予采纳。
- 因此,EFI 分区起始应写为
1MiB,而非0MiB。
补充:在 parted 中若输入
0作为起始位置,工具将自动发出警告并修正起始偏移,不会将分区实际置于 0 位置。
Reference
- 什么是 EFI 系统分区? - 知乎
https://zhuanlan.zhihu.com/p/262069479 - 主板 BIOS 的两种启动模式,传统模式 (Legacy) 和 UEFI 模式介绍-黑苹果动力
https://www.mfpud.com/topics/1149/ - ESP(EFI System Partition,EFI 系统分区)完整解构 - suv789 - 博客园
https://www.cnblogs.com/suv789/p/17503721.html - EFI 系统分区 - ArchWiki - Arch Linux 教程
https://wiki.archlinux.org.cn/title/EFI_system_partition