![rEFInd:使用 EFI Stub Loader 时启动速度非常慢](https://linux22.com/image/1150375/rEFInd%EF%BC%9A%E4%BD%BF%E7%94%A8%20EFI%20Stub%20Loader%20%E6%97%B6%E5%90%AF%E5%8A%A8%E9%80%9F%E5%BA%A6%E9%9D%9E%E5%B8%B8%E6%85%A2.png)
最近重新安装后,我发现 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。
切换相当简单,但并非毫无风险——如果您犯了一个错误,您的系统可能无法启动。基本步骤如下:
- 将新的文件系统驱动程序复制到 rEFInd
drivers
或drivers_x64
子目录(/boot/efi/EFI/refind/drivers
或/boot/efi/EFI/refind/drivers_x64
,可能)。从该位置删除旧ext2_x64.efi
文件将使 rEFInd 的加载时间减少一秒左右。 - 卸载 ESP (
/boot/efi
)。 - 备份
/boot
分区。您可以使用zip
、、或其他文件级工具来执行此操作tar
。cp
- 卸载
/boot
。 - 在分区上创建一个新的文件系统
/boot
。 - 键入
sudo blkid /dev/sda{x}
(更改/dev/sda{x}
为分区的标识符/boot
)以了解其新的 UUID 值。 - 编辑
/etc/fstab
以更改分区的 UUID 值和文件系统类型/boot
。 - 键入
sudo mount -a
以挂载新/boot
分区。(它可能会抱怨没有/boot/efi
挂载点。您可以忽略此警告。) - 将备份
/boot
文件恢复到新的/boot
文件系统。
此时,您应该能够重新启动,并且它会更好地工作。但是,一个错误可能会导致系统无法启动。为了降低这种风险,您可以复制至少一个工作内核、initrd 文件和refind_linux.conf
从/boot
到/boot/efi
,并在开始之前测试您从 ESP 启动内核的能力。这将为您提供一种在出现问题时备用的启动方式。如果没有问题,您当然可以在完成后从 ESP 中删除内核。
有关 rEFInd 驱动程序的更多信息,请参阅有关此主题的文档: