Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

5个月前关闭。



Improve this question




大家好
我正在尝试尽可能缩短iMac双启动OS-X和Ubuntu的启动过程。到目前为止,我设法通过Apple的EFI启动管理器直接启动了grub(之后又启动了Ubuntu)。我已经通过伪装(通过硬链接(hard link),别名,文件夹的树等)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 16.10之前的版本中,某种方式不再起作用。 X无法检测到KMS设置,因此启动失败。幸运的是,使用Ubuntu 17.04,事情又恢复了。
至于内置引导管理器中显示的图标,请执行以下操作:

1)启动OSX。

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

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

4)祝福这样的 bootstrap :
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。示例代码中的这一示例只是一个示例。

请享用

10-06 07:49