EFI system partition (简体中文)

From ArchWiki

Tango-preferences-desktop-locale.png本文或本节需要翻译。要贡献翻译,请访问简体中文翻译团队Tango-preferences-desktop-locale.png

附注: 请使用模板的第一个参数进行更详细的指示。(在 Talk:EFI system partition (简体中文)# 中讨论)

EFI 系统分区(也称为 ESP 或者 EFISYS)是一个 FAT32 格式的物理分区 (在硬盘主分区表上,而不是 LVM 或软件 RAID 等等) ,从这里 UEFI 固件启动 UEFI 引导器和应用程序。

它与操作系统无关而是作为 EFI 固件要启动的引导器和应用程序的存储空间,是 UEFI 启动所必须。

推荐使用 GPT 和 UEFI 搭配因为有的 UEFI 固件不支持 UEFI-MBR 启动。

警告: 如果在 UEFI/GPT 系统上配置 双启动,请不要重新格式化 UEFI 分区,因为已有的分区上包含 Windows 启动需要的 .efi 文件。不需要重新创建分区,只需要 #挂载分区.

创建分区

推荐 ESP 大小为 512 MiB, 不过大一点小一点都没问题。

Microsoft 文献注解了 ESP 大小: 对高级格式化 (Advanced Format) 4K 本地驱动器 (每扇区4KB) 来说,由于 FAT32 文件格式的限制,最小为 260 MB。 FAT32 的最小分区大小可由扇区大小 (4KB) x 65527 = 算出 256 MB。高级格式化 512e 驱动器不受此限制影响,因为其虚拟扇区是 512B. 512 bytes x 65527 = 32 MB, 这比 100 MB 最小限制还要小。[1]

GPT 磁盘分区

  • fdisk/gdisk: 创建类型为 EFI System (EFI System (在 fdisk 中) 或 ef00 (在 gdisk 中)的分区。然后运行 mkfs.fat -F32 /dev/<THAT_PARTITION> 格式化为 FAT32 格式。

(或)

  • GNU Parted: 创建一个 FAT32 分区然后在 Parted 中为那个分区设置/激活 boot 参数 (不是 legacy_boot 参数).
注意: 如果你收到消息 WARNING: Not enough clusters for a 32 bit FAT!, 运行 mkfs.fat -s2 -F32 ...-s1 以减小簇大小,否则 UEFI 无法读取分区。

MBR 磁盘分区

fdisk: 使用 fdisk 创建类型为 EFI System 的分区,然后运行 mkfs.fat -F32 /dev/<THAT_PARTITION> 格式化为 FAT32.

挂载分区

为防止 EFISTUB, 内核以及 initramfs 文件应储存在 EFI 系统分区。精简起见,当以 EFISTUB 启动时你可以把 ESP 当做 /boot 分区而不是单独分一个 /boot 分区。 }}

RAID 上的 ESP

将 ESP 包含进 RAID1 组是可行的,但是会有数据污染的危险,创建 ESP 时请三思。 细节见 https://bbs.archlinux.org/viewtopic.php?pid=1398710#p1398710https://bbs.archlinux.org/viewtopic.php?pid=1390741#p1390741.

技巧

Using bind mount

除了直接将 ESP 挂载到 /boot,还可以将 ESP 中的某个目录 bind mount 挂载到 /boot(参考 mount(8)). 用这种方式,pacman 可以直接更新目录,而 ESP 分区上的文件可以按照需要进行放置,这个方式比文件复制要简单的多。

注意: 这种做法需要兼容FAT32的内核和引导。通常来说Arch都没问题, 但是其他发行版可能会有 (namely those that require symlinks in /boot). 讨论帖 在这里.

参考 EFI system partition#Alternative mount points, 将所有文件复制到 ESP 下的某个目录,将 ESP 挂载到 /boot 之外的地方 (例如 /esp)。然后 bind mount 目录:

# mount --bind /esp/EFI/arch/ /boot

这样 /boot 下就有了你需要的文件,编辑 Fstab

/etc/fstab
/esp/EFI/arch /boot none defaults,bind 0 0
警告: 必须使用 root=system_root 内核参数 才能通过此方法启动。

参阅