在 Apple 的 EFI 环境中将内核参数传递给 EFI-Stub

Passing kernel parametes to EFI-Stub in Apple's EFI env

大家好。 我试图尽可能缩短 iMac 双启动 OS-X 和 Ubuntu 的启动过程。到目前为止,我设法通过 Apple 的 EFI 引导管理器直接引导 grub(之后 Ubuntu)。我通过将 grub 二进制文件伪装(通过硬链接、别名、文件夹树等)作为 Apple 固件期望的引导 OsX 本身来完成此操作。 (例如:

$>sudo ln EFI/ubuntu/grubx64.efi System/Library/CoreServices/boot.efi

)
现在我试图更进一步,即消除 GRUB。我知道现代 Linux 发行版确实在内核中包含了 EFI 存根,因此,原则上,人们可以直接启动到内核(通过 EFI/UEFI 固件)而不需要(辅助)引导管理器,例如 GRUB2。 (像这样:

$>sudo ln vmlinuz System/Library/CoreSerivces/boot.efi

) Apple 的问题在于它的 "peculiar" EFI 实现。为了让 Linux 内核的 EFI 存根工作,必须能够将参数传递给它(根路径、初始 ram 磁盘等)好吧,这很容易使用辅助引导管理器(GRUB、rEFInd、 ELILO 等。他们确实将命令行字符串传递给 EFI 二进制文件)但这正是我想绕过的。有没有办法将参数传递给由 Apple 的 EFI 固件加载的任意 EFI 二进制文件? (我试过 com.apple.Boot.plist 但无济于事。) 或者,是否有某种方法可以在引导过程中将参数传递给 linux 内核而无需命令行(可能通过某些文本文件)?

宾果!!!! Apple 的 EFI 正在运行,解决方案比预期的要简单。无需复杂的文件夹层次结构。 只需创建一个小的 HFS+ 分区,将 linux 内核 efi 存根(例如 vmlinuz-3.13.0-46-generic.efi.signed)复制到其中,重命名文件使其以 . efi(Apple 的 EFI 拒绝启动任何不以 .efi 扩展名结尾的东西)像 vmlinuz.efi,也复制初始 ram 磁盘(例如 initrd.img-3.13.0-46-通用),可能将其重命名为更简单的名称,如 initrd.img,然后使用 efibootmgr 创建一个新的引导条目,如下所示(假设 X 是您创建 HFS+ 分区的硬盘驱动器,Y 是分​​区本身的编号):

efibootmgr -d /dev/sdX -p Y -c -L "Ubuntu (EFI-Stub)" -l /vmlinuz.efi -u "root=UUID=b0c4efb9-95b0-4e5d-98e1-8beb43f413c2 ro rootflags=subvol=@  quiet splash initrd=\initrd.img"

您还可以选择创建一个图标和一个标签,当您在按住 "alt" 键的同时启动系统时,它们会显示出来。 它工作得很好,也值得付出努力。显示驱动程序由 EFI 直接配置,如果通过 GRUB 启动则显示细节不可见!!!

更新

使用 Ubuntu 版本高达 16.10 不知何故,事情不再有效了。 X 无法检测到 KMS 设置,因此启动失败。幸运的是,有了 Ubuntu 17.04,一切又恢复正常了。 至于内置启动管理器中出现的图标,请按如下操作:

1) 开机进入 OSX.

2) 以您喜欢的任何方式挂载我们的 Linux 引导加载程序(在我们的示例中,vmlinuz.efi)所在的 HFS+ 分区。

3) 从网上抓取一个.icns 格式的Ubuntu 徽标(注意,其大小不得超过 512x512 像素)并将其放在我们的引导加载程序所在的同一文件夹中。 必须命名为 .VolumeIcon.icns

4) 像这样祝福引导装载程序:

sudo bless --folder /Volumes/<MyBootPartitionMountPoint> --file /Volumes/<MyBootPartitionMountPoint>/vmlinuz.efi --label 'Ubuntu 17.10' 

完成。

现在,在启动机器时按住 alt 键将启动内置的 EFI 引导管理器,Apple 旁边有一个漂亮的 Ubuntu 徽标。

最后两件事。

1) 为内置启动管理器设置图标的过程是可选的。用处不大。实际上,如果您尝试通过单击启动管理器屏幕中的 Ubuntu 图标来启动 Ubuntu,将不会读取相关的 EFI 启动变量,因此 Linux 将不会启动。只是很养眼。

2) 重要提示:不要忘记将 root=UUID=blahblah 替换为您的 / Linux 分区的 real UUID。示例代码中的这个只是一个示例。

尽情享受

Raffaele 的解决方案适用于在 MacBookPro12,1 上安装 Debian Buster,但有一个警告:我必须从附加引导参数中删除 rootflags 参数,因此命令变为:

efibootmgr -d /dev/sdX -p Y -c -L "Debian (EFI-Stub)" -l /vmlinuz.efi -u "root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro quiet splash initrd=\initrd.img"