您好,我遇到了一个大问题,因为您看到当我使用efibootmgr
它创建启动项时,它只会在 EFI 启动菜单中生成一个无法启动的日文字符,这非常糟糕。
另一方面,当我在 EFI shell 中使用 bcfg 时,它工作正常。使用的 efibootmgr 命令是:efibootmgr -c -d /dev/nvme0n1 -p 1 -l /EFI/refind/refind_x64.efi -L "rEFInd"
而 bcfg 命令是:bcfg boot add 3 fs0:\EFI\refind\refind_x64.efi "rEFInd"
当我这样做时,bcfg boot dump -v
efibootmgr 和 bcfg 条目之间的区别如下:
DevPath
对于 bcfg 所做的条目是,而PciRoot(0x0)/Pci.....\EFI\refind\refind_x64.efi
对于 efiboomgr 所做的条目只是说VenHw(99E275E7-75AO-4B37)
您是否知道如何让 efibootmgr 工作?或者,我需要在命令调用中使用什么选项才能使用 bcfg 指定内核参数?
答案1
如果efibootmgr
正在创建一个像您描述的那样的条目(VenHw(99E275E7-75AO-4B37)
),那么这听起来像是efibootmgr
固件中的一个错误。也就是说,考虑一下efibootmgr
您指定的命令:
efibootmgr -c -d /dev/nvme0n1 -p 1 -l /EFI/refind/refind_x64.efi -L "rEFInd"
这件事有两点不寻常:
- 磁盘设备-- Linux 中的大多数磁盘设备的名称形式为
/dev/sd?
,其中?
是从上到下的字母a
。某些设备(例如某些 SSD 卡)的文件名采用其他形式,例如/dev/mmcblk0
(这是从内存中获取的,可能不太正确)。我不记得曾经见过像 这样的设备名称/dev/nvme0n1
。这并不是说它是错误的,但至少它是不寻常的,你应该仔细检查一下。我会特别小心不要包含分区号——这就是 选项-p
的用途efibootmgr
。 - 文件规范-- 的旧版本
efibootmgr
要求使用 EFI 语法指定文件 -- 即使用反斜杠 (\
) 而不是斜杠 (/
) 分隔目录条目。由于 Linux shell 通常以独特的方式处理反斜杠,因此这还要求引用整个路径名或将反斜杠加倍,因此您需要指定-l \\EFI\\refind\\refind_x64.efi
或-l "\EFI\refind\refind_x64.efi
。我听说 的最新版本efibootmgr
将接受更传统的 Unix/Linux 形式并在内部进行“翻译”,但我不知道该功能的具体添加时间,而且您还没有说明您使用的是哪个版本的 Ubuntu。因此,我建议您使用加倍或引用的反斜杠,而不是斜杠。
当然,从实际情况来看,如果你通过 获得了一个有效的条目bcfg
,那么就不需要对 做任何其他事情了efibootmgr
。我猜你问这个问题是因为它应该工作,并且因为您希望能够从 Ubuntu 执行此类维护。
答案2
我遇到了完全相同的问题。尝试使用 nvme 磁盘通过 efibootmgr 创建启动项。它没有启动,并且 bios 中的启动菜单只显示该条目的日文(或中文?)字符。从另一个操作系统检查启动项显示新创建的条目为 VenHw 类型。
但是问题是分区号不正确。我的根分区和其他一些分区位于加密的 lvm 卷中。因此,我为 efibootmgr 指定了该加密分区,而不是应该指定的 /boot 分区。这可能不是您的情况,但我还是写了这篇文章,以防其他人因为同样的原因遇到这个问题。仔细检查您的分区号和 efibootmgr 的其他参数。
答案3
您需要编辑 refind.conf 文件并将路径改回 PciRoot。记下设备的完整描述,以便您可以将其输入到 conf 文件中。只需确保选择正确的 PciRoot 即可;)