linux-将内核参数传递给Apple的EFI env中的EFI-Stub

大家好
我正在尝试尽可能缩短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

)
苹果公司的问题在于它是“特殊的” 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拒绝启动任何不以vmlinuz.efi结尾的.efi扩展名结尾,也复制初始ram磁盘(例如initrd.img-3.13.0-46-generic),可能将其重命名为更简单的名称,例如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版本高达10.10的情况下,某些事情不再起作用. X无法检测到KMS设置,因此启动失败.幸运的是,在Ubuntu 17.04中,一切又恢复了.
至于内置引导管理器中显示的图标,请执行以下操作:

1)启动OSX.

2)以您喜欢的任何一种方式将HFS分区挂载到Linux引导加载程序(在我们的示例中为vmlinuz.efi)所在的位置.

3)从网络上获取.icns格式的Ubuntu徽标(注意,其大小不得超过512×512 px),并将其放在引导加载程序所在的文件夹中.它必须命名为.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无法启动.这只是漂亮的Eye Candy.

2)重要:不要忘记用/ Linux分区的真实UUID替换root = UUID = blahblah.示例代码中的这一示例只是一个示例.

请享用

上一篇:暗影精灵4双系统


下一篇:关于b360 i58500黑苹果efi