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

时间:2015-03-03 22:06:09

标签: linux macos kernel boot efi

大家好,大家好。 我试图尽可能缩短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的问题在于它是“特殊的”EFI实现。为了使Linux内核的EFI存根工作,必须能够将参数传递给它(根路径,初始ram磁盘等)。这很容易使用辅助启动管理器(GRUB,rEFInd,ELILO等)来完成。它们确实将命令行字符串传递给EFI二进制文件)但这正是我想要绕过的。有没有办法将参数传递给Apple的EFI固件加载的任意EFI二进制文件? (我尝试过使用com.apple.Boot.plist,但无济于事。) 或者,有没有办法在启动过程中将参数传递给linux内核而不使用命令行(可能是通过一些文本文件)?

2 个答案:

答案 0 :(得分:3)

宾果!!!! 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-generic),可能重命名它更简单,比如initrd.img,然后使用efibootmgr创建一个这样的新启动项(假设X是你创建HFS + partiotion的硬盘,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,事情再次发生。 至于显示在内置启动管理器中的Icon,请执行以下操作:

1)启动到OSX。

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

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)为内置启动管理器设置Icon的过程实际上是可选的。使用不多。实际上,如果您尝试通过单击引导管理器屏幕中的Ubuntu图标来引导Ubuntu,则不会读取相关的EFI引导变量,因此Linux无法启动。它只是一个漂亮的Eye Candy。

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

享受

答案 1 :(得分:0)

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"