苹果EFI env中的存根

美好的一天,每个人。 我试图尽可能缩短iMac双启动OS-X和Ubuntu的启动过程。 到目前为止,我设法通过Apple的EFI启动管理器直接启动grub(以及Ubuntu之后)。 我已经通过伪装(通过硬链接,别名,文件夹的树等)grub二进制文件来实现这一点,这是苹果公司的固件期望用于启动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内核,而无需使用命令行(可能通过某些文本文件)?


答对了!!!! 苹果的EFI正在开展工作,解决方案比预期的更简单。 无需复杂的文件夹层次结构。 只需创建一个小的HFS +分区,将Linux内核efi存根(例如vmlinuz-3.13.0-46-generic.efi.signed)复制到其中,重命名文件以便以.efi结尾(Apple的EFI拒绝启动任何不会以.efi扩展名结尾)像vmlinuz.efi,也可以复制初始内存盘(例如,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启动时不可见的细节!

UPDATE

Ubuntu版本高达16.10无论如何事情不再工作。 X无法检测到KMS设置,因此在启动时失败。 幸运的是,在Ubuntu 17.04中,事情再次发生。 至于内置启动管理器中显示的图标,请按以下步骤操作:

1)启动到OSX。

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

3)从网络上抓取图标形式的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分区的真实UUID。 示例代码中的这一个仅仅是一个例子。

请享用

链接地址: http://www.djcxy.com/p/66801.html

上一篇: Stub in Apple's EFI env

下一篇: In Linux initrd image, ethernet fails to work