EFI 系统分区(ESP)简介
EFI 系统分区(EFI System Partition,缩写 ESP)是 UEFI 启动体系的核心组件,存放操作系统和固件的引导程序文件,是计算机正常启动的必要条件。
目录
1. 什么是 EFI 分区
EFI 系统分区是磁盘上一个特殊的 FAT32 格式分区,由 UEFI 固件直接读取。当计算机启动时,UEFI 固件会:
ESP 是 UEFI 启动模式下的唯一合法引导入口,无论安装多少个操作系统,通常全盘只需一个 ESP,各系统将自己的引导文件存入 ESP 下各自的子目录,通过 NVRAM 条目注册引导项,互不干扰。
2. ESP 的技术规格
| | |
|---|
| | |
| | 512 MB ~ 1 GB |
| | |
| C12A7328-F81F-11D2-BA4B-00A0C93EC93B | |
| 0xEF | |
| | /boot/efi |
| | |
为什么必须是 FAT32? UEFI 规范明确规定固件必须能够读取 FAT32 文件系统,因此所有符合规范的 UEFI 固件天然支持 FAT32,这保证了跨平台兼容性。ESP 中不应存放其他文件系统格式。
3. ESP 的目录结构
ESP 内部采用标准化的目录布局:
/boot/efi/ (ESP 挂载点,以下为 ESP 内部结构)├── EFI/│ ├── BOOT/│ │ └── BOOTX64.EFI ← 默认回退引导文件(Fallback)│ ├── debian/│ │ ├── grubx64.efi ← Debian GRUB 引导程序│ │ ├── shimx64.efi ← Secure Boot shim(可选)│ │ └── grub.cfg ← GRUB 配置(部分发行版)│ ├── ubuntu/│ │ ├── grubx64.efi│ │ └── shimx64.efi│ ├── Microsoft/│ │ └── Boot/│ │ ├── bootmgfw.efi ← Windows 引导管理器│ │ └── BCD ← Windows 启动配置数据库│ └── fedora/│ ├── shim.efi│ └── grubx64.efi└── shellx64.efi ← UEFI Shell(可选)
目录说明
| |
|---|
EFI/BOOT/BOOTX64.EFI | Fallback 引导路径:当 NVRAM 中没有有效启动项时,固件自动寻找此文件。可移动介质(U 盘)通常使用此路径。 |
EFI/<发行商>/ | |
EFI/Microsoft/Boot/bootmgfw.efi | Windows 引导管理器,由 Windows 安装程序创建 |
EFI/debian/grubx64.efi | |
EFI/debian/shimx64.efi | 支持 Secure Boot 的 shim 引导器,由微软签名 |
4. ESP 的 GUID 标识
在 GPT 分区表中,ESP 通过特定 GUID 标识:
分区类型 GUID:C12A7328-F81F-11D2-BA4B-00A0C93EC93B
此 GUID 固定不变,是 UEFI 规范规定的标准值。UEFI 固件通过扫描 GPT 分区表,寻找含有此 GUID 的分区来定位 ESP。
属性标志:ESP 分区条目的属性位中,Bit 2 通常被设置(表示「必要分区」),防止工具意外删除。
5. 各操作系统在 ESP 中的引导文件
5.1 Windows
| | |
|---|
bootmgfw.efi | EFI\Microsoft\Boot\ | |
bootmgr.efi | EFI\Microsoft\Boot\ | |
BCD | EFI\Microsoft\Boot\ | 启动配置数据库(Boot Configuration Data) |
memtest.efi | EFI\Microsoft\Boot\ | |
Windows 11 安装时自动在 ESP 中创建以上文件,并在 NVRAM 中注册启动项。
5.2 Debian / Ubuntu(GRUB + shim)
| | |
|---|
shimx64.efi | EFI/debian/ | |
grubx64.efi | EFI/debian/ | |
mmx64.efi | EFI/debian/ | |
grub.cfg | EFI/debian/ | 指向 /boot/grub/grub.cfg 的引导配置 |
安装时由 grub-install 命令自动部署。
5.3 Fedora / RHEL
EFI/fedora/├── shim.efi ← Secure Boot shim├── shimx64.efi ← 同上(软链接)├── grubx64.efi ← GRUB└── grub.cfg ← 指向 /boot/grub2/grub.cfg
5.4 Arch Linux
Arch 可使用多种引导方式,常见布局:
EFI/└── arch/ └── vmlinuz-linux ← 内核(直接 EFISTUB 启动) └── initramfs-linux.img ← (也可以用 systemd-boot 或 GRUB)
5.5 macOS
EFI/├── APPLE/│ └── EXTENSIONS/│ └── Firmware.scap ← 固件更新包└── BOOT/ └── BOOTX64.EFI ← 用于 Boot Camp 场景
6. Linux 中挂载与管理 ESP
6.1 查找 ESP
# 方法一:通过分区类型查找sudo fdisk -l | grep -i "EFI System"# 方法二:通过 blkidsudo blkid | grep -i vfat# 方法三:通过 partedsudo parted -l | grep -i "esp\|EFI"# 方法四:通过 lsblklsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,PARTTYPE
6.2 挂载 ESP
# 创建挂载点(若不存在)sudo mkdir -p /boot/efi# 挂载 ESP(替换 /dev/sda1 为实际设备)sudo mount /dev/sda1 /boot/efi# 验证挂载df -h /boot/efils /boot/efi/EFI/
6.3 配置自动挂载(/etc/fstab)
# 获取 ESP 的 UUIDsudo blkid /dev/sda1
在 /etc/fstab 中添加:
UUID=XXXX-XXXX /boot/efi vfat umask=0077,shortname=winnt 0 2
6.4 查看 ESP 中的引导文件
# 列出 ESP 内容ls -lhR /boot/efi/EFI/# 查看 NVRAM 启动项sudo efibootmgr -v# 示例输出:# BootCurrent: 0001# BootOrder: 0001,0002,0000# Boot0000* Windows Boot Manager HD(1,GPT,...)/File(\EFI\Microsoft\Boot\bootmgfw.efi)# Boot0001* debian HD(1,GPT,...)/File(\EFI\debian\shimx64.efi)# Boot0002* UEFI: USB Drive ...
6.5 手动注册 UEFI 启动项
# 注册 Debian GRUB 引导项sudo efibootmgr \ --create \ --disk /dev/sda \ --part 1 \ --label "Debian" \ --loader '\EFI\debian\shimx64.efi'# 修改启动顺序(0001 优先)sudo efibootmgr -o 0001,0000,0002# 删除指定启动项sudo efibootmgr -b 0003 -B
6.6 重新安装 GRUB 到 ESP
# 确保 ESP 已挂载到 /boot/efisudo grub-install --target=x86_64-efi \ --efi-directory=/boot/efi \ --bootloader-id=debian \ --recheck# 更新 GRUB 配置sudo update-grub
7. 多系统共用 ESP
在多操作系统环境中,所有系统共享同一个 ESP,无需为每个系统单独创建 EFI 分区。
7.1 共存原则
- 每个系统在
EFI/ 下创建独立子目录(如 EFI/debian/、EFI/Microsoft/) - GRUB 通常接管 UEFI 启动菜单,通过
os-prober 探测其他系统
7.2 双系统安装注意事项
⚠️ 安装 Linux 时绝对不要格式化已有 ESP!
# 安装 Debian 时,在分区步骤中:# 1. 选中已有的 EFI 分区(通常是 /dev/sda1,100-512 MB 的 FAT32 分区)# 2. 设置挂载点为 /boot/efi# 3. 确保"格式化"选项为 否(No)# 4. 继续安装
格式化 ESP 会删除 Windows 等已有系统的引导文件,导致无法启动。
7.3 ESP 空间不足时的处理
若 ESP 空间太小(如 Windows 默认创建的 100 MB),多个 Linux 发行版共存时可能空间不足:
# 方法一:清理旧内核的 EFI 文件sudo ls /boot/efi/EFI/sudo apt autoremove # 清理旧内核包,GRUB 会自动清理对应 EFI 文件# 方法二:调整 ESP 大小(需使用 GParted,有风险,建议先备份)
8. ESP 的备份与恢复
8.1 备份整个 ESP
# 备份 ESP 为 tar 压缩包sudo tar -czvf /root/esp-backup.tar.gz -C /boot/efi .# 或直接 dd 备份分区镜像sudo dd if=/dev/sda1 of=/root/esp-backup.img bs=4M status=progress
8.2 恢复 ESP
# 从 tar 恢复(ESP 已挂载到 /boot/efi)sudo tar -xzvf /root/esp-backup.tar.gz -C /boot/efi# 或从 dd 镜像恢复(注意目标分区大小需 ≥ 源镜像)sudo dd if=/root/esp-backup.img of=/dev/sda1 bs=4M status=progress
8.3 重建损坏的 ESP
若 ESP 文件系统损坏但分区结构完好:
# 检查文件系统错误sudo fsck.fat -v /dev/sda1# 修复 FAT32 错误sudo fsck.fat -a /dev/sda1# 若需重建文件系统(会清空数据!务必先备份)sudo mkfs.fat -F32 /dev/sda1# 然后重新安装 GRUB 和 Windows 引导文件
9. 常见问题与排查
| | |
|---|
EFI variables are not supported | | 确认以 UEFI 模式启动;检查 /sys/firmware/efi 是否存在 |
| | 进入 UEFI Shell,手动运行 \EFI\debian\grubx64.efi;然后用 efibootmgr 重新注册 |
| | sudo fsck.fat -a /dev/sda1 |
| | 用 Windows 安装盘修复引导:bootrec /fixboot;或手动拷回 bootmgfw.efi |
grub-install: error: failed to get canonical path | | |
| | 安装时使用不同 --bootloader-id,如 debian、ubuntu、arch |
| .efi | 安装 shim-signed;或在固件中关闭 Secure Boot |
| | 使用独立 ESP(Linux 安装时创建新的 1 GB ESP);或清理旧内核文件 |