rEFInd:使用 EFI Stub Loader 时启动速度非常慢

rEFInd:使用 EFI Stub Loader 时启动速度非常慢

最近重新安装后,我发现 rEFInd 出现了一个非常奇怪的问题:虽然它在我的 /boot 分区上检测到了 GRUB 和 vmlinuz,但使用后者极其慢的。

具体来说,在选择“从 191 MiB ext2 卷启动 vmlinuz-4.8.0-53-generic”后,我立即看到一个黑屏,其中显示以下文字:

Starting vmlinuz-4.8.0-53-generic
Using load options 'root=UUID=6641e1e2-6829-49cc-bf88-85ba5eefbff8 ro quiet splash nomodeset vt.handoff=7 initrd=\initrd.img-4.8.0-53-generic'

等待大约一分钟后(!),Linux 正常启动(而且相当快)。

另一方面,如果我选择 GRUB,我将进入 GRUB 启动菜单,在选择默认选项后,Linux 立即开始启动。

这可能是什么原因呢?

我的设置包括一个 SSD(其中安装了 Linux 和 Windows)和一个 HDD(其中安装了 /home),其中有一个 ext2 /boot 分区和 EFI 分区(最初由 Windows 创建),安装在 /boot/efi 上。这是我的 /etc/fstab:

UUID=6641e1e2-6829-49cc-bf88-85ba5eefbff8 /               ext4    errors=remount-ro 0       1
UUID=3c804805-c41e-4b9d-af02-118b98858ae4 /boot           ext2    defaults        0       2
UUID=8EA5-5319  /boot/efi       vfat    umask=0077      0       1
UUID=bf088ec8-140d-4829-8de7-deb1d375b0e5 /home           ext4    defaults        0       2
UUID=E2A8CA84A8CA5727 /mnt/Windows    ntfs    defaults,umask=007,gid=46 0       0
UUID=3fb0b28d-87d8-4162-b469-1c157a4d00b0 none            swap    sw              0       0

答案1

我是 rEFInd 的维护者。

这是文件系统驱动程序问题。由于我不完全理解的原因,rEFInd 的某些文件系统驱动程序(尤其是ext2_x64.efi驱动程序)在某些计算机上运行缓慢。几年前,我在驱动程序代码中添加了一个粗糙的预读缓存,这很有帮助——在 VirtualBox 下,速度从大约 3 分钟的加载时间提高到几十秒,如果我没记错的话。不过,即使有了这个缓存,有些计算机仍然会出现问题。

解决方案是更改为另一个文件系统。rEFInd 的 ext4fs 驱动程序比其 ext2/3fs 驱动程序快得多,而 Btrfs 和 ReiserFS 驱动程序则更快。(请注意,ext4fs 驱动程序可以读取 ext2fs,但这种方式几乎不会提高速度;它需要读取实际的 ext4 文件系统才能提高速度。)在最坏的情况下,您可以使用 FAT,它不需要特殊的驱动程序(它内置于所有 EFI 中);或者在 Mac 上,您可以使用 HFS+。(rEFInd 还附带一个 HFS+ 驱动程序,因此原则上即使在非 Mac PC 上也可以使用 HFS+,但这样做几乎没有意义。)不过,不建议在标准 Linux 文件系统之外移动。Ubuntu 依赖符号链接进行一些(但不是全部)内核更新,因此 FAT 不是一个好选择;尽管 HFS+ 应该可以工作,但它并未得到 Ubuntu 的官方支持。甚至 Ubuntu 安装程序中也没有 ReiserFS 选项,所以我会在 Ubuntu 中避免使用它。剩下的就是 ext4fs 和 Btrfs。

切换相当简单,但并非毫无风险——如果您犯了一个错误,您的系统可能无法启动。基本步骤如下:

  1. 将新的文件系统驱动程序复制到 rEFInddriversdrivers_x64子目录(/boot/efi/EFI/refind/drivers/boot/efi/EFI/refind/drivers_x64,可能)。从该位置删除旧ext2_x64.efi文件将使 rEFInd 的加载时间减少一秒左右。
  2. 卸载 ESP ( /boot/efi)。
  3. 备份/boot分区。您可以使用zip、、或其他文件级工具来执行此操作tarcp
  4. 卸载/boot
  5. 在分区上创建一个新的文件系统/boot
  6. 键入sudo blkid /dev/sda{x}(更改/dev/sda{x}为分区的标识符/boot)以了解其新的 UUID 值。
  7. 编辑/etc/fstab以更改分区的 UUID 值和文件系统类型/boot
  8. 键入sudo mount -a以挂载新/boot分区。(它可能会抱怨没有/boot/efi挂载点。您可以忽略此警告。)
  9. 将备份/boot文件恢复到新的/boot文件系统。

此时,您应该能够重新启动,并且它会更好地工作。但是,一个错误可能会导致系统无法启动。为了降低这种风险,您可以复制至少一个工作内核、initrd 文件和refind_linux.conf/boot/boot/efi,并在开始之前测试您从 ESP 启动内核的能力。这将为您提供一种在出现问题时备用的启动方式。如果没有问题,您当然可以在完成后从 ESP 中删除内核。

有关 rEFInd 驱动程序的更多信息,请参阅有关此主题的文档:

http://www.rodsbooks.com/refind/drivers.html

相关内容