UEFI 系统分区的最小大小是多少?

UEFI 系统分区的最小大小是多少?

假设我有一个闪存驱动器,我想让它可启动。假设我还有一个基本的 EFI 文件,它可以完成一些任务。那么,ESP 的最小大小是多少?我读到它是 100MB,但这似乎是专门针对 Windows 的。EFI 分区必须达到一定大小才能被系统识别吗?还是因为现代操作系统使用这么多,所以才推荐 100MB?

答案1

是否只是因为现代操作系统使用量很大就推荐使用 100?

请注意,100 MB 分区大小是最小值。虽然 UEFI 没有设置最小大小的规范,但微软建议操作系统使用 100 MB 大小。

假设我们需要使用 FAT32 文件系统格式化 EFI 分区。FAT32 驱动器的最小分区大小计算如下sector_size x 65527

在高级格式 4K Native 驱动器中,每个扇区有 4 KB。在这种情况下,FAT32 驱动器的最小分区大小计算为4 KB x 65527 = 256 MB. 这就是为什么建议 4K 驱动器的最小大小为 260 MB。

但在高级格式 512e 驱动器中,模拟扇区大小为 512 字节。在这种情况下,FAT32 驱动器的最小分区大小计算为512 bytes x 65527 = 32 MB,小于此分区的最小大小 100 MB。

EFI 分区是否必须达到一定的大小系统才能识别它?

尽管微软建议其操作系统使用 100 MB,但 Linux 论坛建议基于 Linux 的操作系统或任何双重启动或多重启动情况使用更大的内存。

作者gdisk 建议使用 550 MiB。

根据 Arch Linux论坛,为避免某些 EFI 可能出现的问题,ESP 大小至少应为 512 MiB。建议使用 550 MiB,以避免 MiB/MB 混淆并意外创建 FAT16。

因此,EFI 系统分区最常见的大小准则是 100 MB 到 550 MB 之间。其中一个原因是,由于它是驱动器上的第一个分区,因此以后很难调整大小。EFI 分区可能包含语言、字体、BIOS 固件和其他固件相关内容。有些固件/软件安装在 EFI 分区中,而不是数据驱动器中。有些人希望将来能够将东西添加到 ESP 中。

由于以后需要时可能很难扩大大小,而且现在的硬盘容量更大,因此建议为 ESP 设置较大的大小,例如 100 MB 或 550 MB。但一般情况下,它仅使用几千字节的空间。

假设我有一个闪存驱动器,并且我希望它可启动。

虽然从您的陈述中看不清楚,但如果您尝试让您的 pen 驱动器作为 UEFI 兼容驱动器启动,用于 Windows 安装,则无需在 pen 驱动器中创建额外的 ESP。使用鲁弗斯或类似工具,可将其转换为支持 UEFI 的驱动器。但在硬盘驱动器中安装 Windows 时,需要在该驱动器中安装 ESP。

答案2

你可以承受的绝对最小大小涉及使用 fat12 文件系统(因此32 千字节),实际上需要使用一些最小的启动管理器,该管理器包含文件系统驱动程序来读取主分区(以及其中包含的内核),这意味着 grub 或 rEFInd。典型的 grub-install 映像大约为 200KB,这仍然不算太糟。

我已经使用 2MB fat12 ESP 顺利启动了一段时间了,显然这是可以做到的!

我不完全确定使用 512MB 的常见建议来自哪里,但是建筑维基最近被我修改了,以参考 fat12 的可能性。

http://www.rodsbooks.com/linux-uefi/似乎表明至少 fat16 应该可以正常工作,除了混淆 Windows 安装程序,在我看来这其实并不相关。Arch Wiki 似乎是基于这个建议,但我没有足够的勇气完全重写它。

正如我在 Wiki 中提到的,UEFI 规范强制使用 fat12 驱动程序。我听说过“只强制使用可移动驱动器”的说法,这留下了一种可能性,即某个地方的某个人已经或将要编写一个包含这些 fat12 文件系统驱动程序的 UEFI 实现,但以某种方式禁止使用它们来挂载 UEFI 系统分区,但我个人认为这种情况不太可能发生。

答案3

对于 Linux,在终端中运行sudo fdisk -l以找出存储驱动器的扇区大小。

由于 EFI 分区的格式为 FAT32,因此 FAT32 驱动器的最小分区大小计算为sector_size x 65527。对于现代存储,该大小为 512 字节 x 65527 = 32 MiB。EFI 启动管理器可执行文件约为 125 KiB,因此 32 MiB 的最小值对于 EFI 分区大小来说是必要的。还有其他理由要求更大的尺寸,但除非您在这些特殊情况下运行,否则不需要更大的尺寸。

答案4

@Original poster:您想知道 EFI 分区所需的最小大小,但您没有说明您考虑的是什么操作系统。没有单一的要求。阅读互联网上的信息,有些人说“2 mb”(以上),而其他人则建议 TB 级的空间。我建议每个人都写下他们自己系统的最低要求,然后我们就会有一个所有操作系统要求的列表。所以让我回答你关于 Debian 操作系统的问题:

uname -r

5.10.0-6-amd64

uname -a

Linux localhost 5.10.0-6-amd64 #1 SMP Debian 5.10.28-1 (2021-04-09) x86_64 GNU/Linux

和 Windows 10:

ver

Microsoft Windows [Version 10.0.19042.804]

现在,在安装 Debian 时,我想知道 EFI 分区所需的大小。这就是我找到这个页面的方式,但这里提供的信息没有帮助。所以我想,5mb 够了吗?事实证明 Debian 安装程序的最低要求是 35mb。

请注意,如果您先使用 fdisk 对 EFI 分区进行分区,然后尝试安装 Debian,它将拒绝并显示一条神秘的错误消息:

The attempt to mount a file system with type vfat in SCSII (0,0,0), partition #1 (sda) at /boot/efi failed.

如果您比较 fdisk 和 Debian 安装程序设置的标志(如果您允许它进行分区):

fdisk -> "B K"

Debian -> "B f"

重新选择 Debian 安装程序中的 EFI 分区来修复标志。愚蠢的 Debian。

此外,在 Hyper-V 中使用 fdisk 时,无法显示分区十六进制代码列表,因为增强模式 (VmConnect) 不起作用,SSH 未安装,因此 fdisk 输出的十六进制代码列表一闪而过,而且无法向上滚动 VmConnect 窗口。在 VMWare Workstation 中,可以通过 SHIFT+PageUp 来实现,但我不知道如何在 Hyper-V 中做到这一点,事实上,甚至没有人提出这个问题!所以我终于发现,EFI 分区在 fdisk 中是“1”。

无论如何,Debian 安装程序所需的空间量真的需要吗?安装 Debian 后,我检查了实际所需的空间:

mount /dev/sda1 /mnt

cd /mnt

du -hs

/efi/debian
    -rwx------ 1 root root    1K 27. Apr 00:11 BOOTX64.CSV
    -rwx------ 1 root root 1180K 27. Apr 00:11 fbx64.efi
    -rwx------ 1 root root    1K 27. Apr 00:11 grub.cfg
    -rwx------ 1 root root 1634K 27. Apr 00:11 grubx64.efi
    -rwx------ 1 root root 1233K 27. Apr 00:11 mmx64.efi
    -rwx------ 1 root root 1292K 27. Apr 00:11 shimx64.efi

5,3M

5.3M!你竟然还敢说 550MB、1GB、10TB,还有什么出价吗?!有些人会说,grub 引导加载程序位于 EFI 分区,其他人则说“update-initramfs”会写入此分区,这就是为什么需要这么多空间。胡说八道,全是胡说八道!

但是,唉,损害已经造成了,现在我必须处理它。

mount /dev/sda1 /mnt

cp -r /mnt/EFI /work

umount /dev/sda1

blkid

/dev/sda1: UUID="6995-68F6" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="a7196942-ec1b-e64a-9182-009a28d2cc44"

gdisk /dev/sda
d 1
n 1
+5466KB
EF00
w

umount /dev/sda1

mkfs.fat /dev/sda1

mount /dev/sda1 /mnt

mv /work/EFI /mnt

umount /dev/sda1

修复 PARTUUID:

partprobe /dev/sda

blkid

gdisk /dev/sda

x
c (1) -> set the old PARTUUID (a7196942-ec1b-e64a-9182-009a28d2cc44 in my example)

修复 fstab 中的 UUID:

nano /etc/fstab -> set the new UUID

为什么是“mkfs.fat”(上面),而不是“mkfs.fat -F32”?原因如下:

https://github.com/dosfstools/dosfstools/blob/master/src/mkfs.fat.c

According to Microsoft FAT specification (fatgen103.doc) disk with 65525 clusters (or more) is FAT32

define MIN_CLUST_32 65525

diskpart 也将拒绝格式化为 fat32:

format fs=fat32 quick

Volume too small

因此,节省了 30mb 的空间,但尚未分配。如何分配?运行 fdisk,删除 ext4 分区并重新创建它(包括未分配的空间(dn,所有默认值))会导致系统无法启动。在网上,他们会告诉你,在分区之前用未分配的空间扩展分区是不可能的,需要将原始空间移动到硬盘的末尾,然后扩展。如何将未分配的空间移动到末尾?不知道。试过 fdisk、gdisk、parted、MS diskpart。找不到。所以我最终下载了“gparted-live-1.2.0-1-amd64.iso”。gParted 能够用未分配的空间扩展 ext4 分区,但它在硬盘末尾留下了 1mb 的空间。在网上,他们会告诉你,这是按照规范完成的。真的吗?有趣的是,fdisk 不会将这一兆字节留在最后,微软的 diskpart 在扩展分区时也不会这样做。网上有人说,“它只有 1 兆字节,你不想违反规范来保存它。”我会保存这一可怜的兆字节,即使我必须践踏那里的所有规范!别担心,可怜的被忽视的兆字节,我会拯救你的!

所以我欺骗了 gParted,呵呵。我将未分配的空间移到了磁盘末尾,没有分配它。然后我关闭了 gParted,改用 fdisk 来扩展 ext4 分区,它为它分配了所有空间,包括可怜的兆字节:

fdisk /dev/sda

F
    Start   End     Sectors Size
    14336   73727   59392   29M

d 2
n 2 14336

fdisk -l

Device     Start      End  Sectors  Size Type
/dev/sda1   2048    12979    10932  5,3M EFI System
/dev/sda2  14336 20971486 20957151   10G Linux filesystem

关于 Windows。MS 说,100 MB efi + 16 mb msr。当然,臭名昭著的复制粘贴者总是不加检查地复制粘贴信息,并将这些错误信息传播到互联网上。但这个空间量真的有必要吗?让我们看看 EFI 分区中有什么:

 Verzeichnis von B:\efi\boot

    1.558.344 bootx64.efi

Verzeichnis von B:\efi\microsoft\boot

    28.672 bcd

Verzeichnis von B:\efi\microsoft\boot\fonts

    48.992 wgl4_boot.ttf

Anzahl der angezeigten Dateien:
           3 Datei(en), 1.636.008 Bytes

我专门为你打印了这份清单,我知道那里面有什么,因为我自己把文件放在那里,当时我正在用 dism 将 Windows 映像恢复到 EFI 机器(该映像是由 dism 在 MBR 机器上创建的)。几乎不可能找出哪些文件是真正需要的。通过反复试验,我发现,你只需要上面的 3 个文件

diskpart

select disk 0

select partition 1

assign letter b

mkdir b:\efi
mkdir b:\efi\boot
mkdir b:\efi\microsoft
mkdir b:\efi\microsoft\boot
mkdir b:\efi\microsoft\boot\fonts

copy c:\windows\boot\efi\bootmgfw.efi b:\efi\boot\bootx64.efi

copy c:\windows\boot\fonts\wgl4_boot.ttf b:\efi\microsoft\boot\fonts

bcd存储你要自己创建,这里就不细说了,然后:

copy X:\bcd b:\efi\microsoft\boot

所以是 1.636.008!微软说的是 116mb?而这些信息被复制粘贴到了整个互联网上。我一开始是按照那些说明操作的,我是个白痴,但现在我想看看微软要求的大小是否真的需要(比如让 Windows 无法启动):

dism /Capture-Image /ImageFile:c:\copy\efi.wim /CaptureDir:b:\ /Name:efi /Compress:fast

diskpart

select disk 0

select partition 0

delete partition override
    efi killed

select partition 1

delete partition override
    msr killed

create partition efi size=2

format fs=fat quick

assign letter b

dism /Apply-Image /ImageFile:c:\copy\efi.wim /Index:1 /ApplyDir:b:\

祈祷吧,我要重启了!休斯顿,报告 Windows 火箭成功发射!……休斯顿,报告 Windows 启动和账户登录成功!休斯顿,微软是一群该死的骗子!

因此我们节省了 114 mb,但该空间尚未分配。

磁盘分区?

哈哈哈!

磁盘管理控制台

哈哈哈哈哈哈!

然后呢?我猜又是 gParted。使用 Linux 程序来处理 NTFS 分区并不是一个好主意,但让我们试试吧。所以我将未分配的空间移到了硬盘的末尾。成功了。再次从 DVD 重新启动 Windows(在我的情况下是带有已安装 ISO 的虚拟 DVD,因为我是在 Hyper-V 中执行此操作),然后:

diskpart

select disk 0

select partition 1

extend

完毕。

list partition

Partition ###  Typ               Größe    Offset
-------------  ----------------  -------  -------
Partition 1    System            2048 KB  1024 KB
Partition 2    Primär              39 GB  3072 KB

select partition 1

detail partition

Volume ###  Bst  Bezeichnung  DS     Typ         Größe    Status     Info
----------  ---  -----------  -----  ----------  -------  ---------  --------
* Volume 1                      FAT    Partition   2048 KB  Fehlerfre  System

但是,如果您想通过 Linux 工具删除 EFI 和 MSR 分区,该怎么办?我不知道为什么,但这样做会导致 Windows 系统无法启动。我向 gdisk/fdisk/parted 传递了与 diskpart 完全相同的参数,但所有这些工具都会破坏某些东西!在 diskpart 中删除 MSR 分区:

select partition 1

delete partition override

重新启动,Windows 启动。

gdisk 中也有同样的事情!:

gdisk /dev/sda

d (select msr partition)
w

重启后,我看到了该死的 Hyper-V 徽标,它一直在那里,系统无法启动。原因是什么?

相关内容