rEFInd & Linux内核EFISTUB在苹果硬件上启动,如何实现?

rEFInd & Linux内核EFISTUB在苹果硬件上启动,如何实现?

好的,接下来是一个稍微复杂一点的话题。我想问一下通过 rEFInd 启动管理器启动干净的 EFISTUB Linux 内核的最简单方法是什么?

最好的方法是使用 Linux 发行版,它本身包含安装选项通过 rEFInd 的 EFISTUB。不幸的是,这不存在。即使是支持 rEFInd 的 Manjaro Linux 安装程序也使用 grubx64.efi 文件(由 rEFInd 加载)来启动 Linux 内核。这真的没有什么意义。(实际上它完全没有意义。)

嗯,在很多情况下,通过 GRUB 进行原生 EFI 启动对于 Apple 硬件来说也很好。但是,有些情况下不是有可能。我特别想到的是所有不以原生 EFI 模式持续公开视频 BIOS 的 Apple 型号。例如,这适用于所有不包含 Intel GPU 但仍具有单独 GPU 芯片的非基于 MXM(早期和后期)的型号。在这样的 Apple 硬件上,视频 BIOS 嵌入在主 EFI 固件中,而不是单独的闪存芯片中(例如 MXM GPU 卡)。添加:事实证明,某些 Apple MXM GPU 卡也存在此问题。

虽然 vBIOS 信息在传统 CSM BIOS 模拟模式(又名 Apple Boot Camp)下始终存在且可访问,但它不在原生 EFI 下。因此,当 Linux 通过 GRUB 在 EFI 中启动时,内核无法访问 vBIOS 信息,也无法继续 KMS(内核模式设置)。在基于 Radeon GPU 的系统上,这会导致一条*Error* No UMS support in Radeon module!消息。来源:iMac11,2 上的 Linux 问题

受“vBIOS 未在 EFI 中公开”影响的 Apple 型号的确认(不完整)列表:

  • iMac4,1 和 iMac5,1 (Radeon X1600)
  • Macmini4,1 (GeForce 320M)
  • iMac11,2(Radeon HD 4670)

解决这个问题的方法是启动裸 Linux核心直接来自 rEFInd。这允许 Linux 内核获取必要的 vBIOS 信息并正确初始化内核模式设置。如果有人需要安装通过 rEFInd 启动的裸 Linux 内核,请查看“可选的进一步步骤“ 在最后。

到目前为止,我计划采取的步骤如下:

  • 在 Mac OS 下准备所需的分区布局。在我的例子中,这将是:sda1(电喷电子稳定控制系统),sda2(Macintosh HD),sda3(苹果恢复高清),sda4(Linux HD) 注意,恢复分区是不是在 Apple 磁盘实用程序中可见。

  • 通过以下方式安装 UbuntuCSM BIOS 仿真(使用 MBR)在分区上sda4. (此示例中未使用额外的启动、交换或数据分区。) 重要的提示, 步骤1 至 3必须执行下述已重新启动。

  • Ubuntu 已安装,EFI 调整已到位,直接从 CD/DVD 安装 rEFInd。此选项在较新的 rEFInd 版本中可用。从官方网站下载相应的映像,将其刻录到 CD/DVD,从中启动并选择“安装”选项。

由于 Apple 特定的 EFI 限制,这个主题变得更加复杂。在常规 UEFI 环境中,此处描述的步骤如何使用 EFI 存根 (efistub) 加载程序引导加载内核?(参见第二个答案)将允许迁移到EFISTUB 内核启动。

但是,基于 Apple EFI 固件的系统需要进行一些额外的修改。另一个限制是 Linux 在第一阶段运行CSM BIOS 模式。因此,步骤“添加启动项”(使用 efibootmgr)无法应用。这必须稍后通过电喷外壳(Linux 之外)。

以下步骤描述了如何建立从库存 Apple EFI 固件启动的常规 EFISTUB。

  1. 当 Ubuntu 完全安装后,将 efi esp 分区挂载在/boot/esp。(请注意,常规 EFI 启动 Ubuntu 安装使用 中的挂载点/boot/efi。因此,如果挂载点不同,则必须调整以下命令。)由于 Ubuntu 在我们的例子中是通过 CSM BIOS 模拟安装的,因此ubuntuESP 上缺少目录。必须先创建它:

    mkdir /boot/esp/EFI/ubuntu
    
  2. sudo nano /etc/kernel/postinst.d/zz-update-efistub创建一个包含以下内容的新文件:

    #!/bin/sh
    rm /boot/esp/EFI/ubuntu/*
    cp /vmlinuz /vmlinuz.efi
    cp /vmlinuz* /initrd.img /boot/esp/EFI/ubuntu/
    rm /boot/esp/EFI/ubuntu/vmlinuz.old
    

    这称为钩子。它将同步 ESP 内核相关文件到根分区。使用以下命令使其可执行:

    sudo chmod +x /etc/kernel/postinst.d/zz-update-efistub
    sudo /etc/kernel/postinst.d/zz-update-efistub
    

    vmlinuz.efi较旧的 Apple EFI 固件版本需要内核加载器。在这些版本中,普通文件vmlinuz不会被识别为可启动文件。

  3. 如上所述,无法建立启动项,因为 Linux 未处于 UEFI 模式。这必须作为最后一步来完成电喷外壳不过,稍后可以使用以下命令在 Linux 以原生 EFI 运行时调整启动项。

    sudo efibootmgr -c -d /dev/sda -p 1 -L "Ubuntu (efistub)" -l /EFI/ubuntu/vmlinuz.efi -u "root=/dev/sda4 rw initrd=/EFI/ubuntu/initrd.img quiet splash"
    

    此处的示例语法正确。否则,必须根据使用的分区布局更改参数-d和。EFI ESP 为 ,而分区为。-p/dev/sda1root=sda4

最后,重启,安装重新索引从 CD 启动并启动电喷外壳。最后一步是在原装 Apple EFI 引导加载程序中建立引导项。当仅使用 rEFInd 作为引导加载程序时,这不是绝对必要的。但是,在该示例中,命令将是:

vmlinuz.efi root=/dev/sda4 ro initrd=\EFI\ubuntu\initrd.img

关于 rEFInd,这导致现在的配置是 vmlinuz.efi存在启动选项。第一个位于 esp 分区中sda1,可以直接从 Apple 原装 EFI 加载程序加载。另一个位于根分区sda4(或其boot文件夹中)。第二个vmlinuz.efi可以从 rEFInd 加载,但不能从原装 Apple 加载程序加载。相反,rEFInd 似乎无法在没有有关根分区的其他信息的情况下加载第一个 vmlinuz.efi 文件。(启动过程将挂起并显示 BusyBox shell。)

可选的进一步步骤,仅在受限的“vBIOS 未在 EFI 中公开”系统上是必要的:

正如开头提到的,有时只需要启动裸 Linux 内核(没有“vmlinuz 加载器”)直接从 rEFInd 中加载,以避免诸如“vBIOS 未在 EFI 中暴露”之类的棘手问题。在这种情况下,内核还必须具有 efi 扩展。这需要一个手动调节因为内核名称会随着每次内核更新而改变。语法可能如下所示:

sudo cp /boot/vmlinuz-5.4.0-65-generic /boot/vmlinuz-5.4.0-65-generic.efi

在某些情况下,可能需要删除先前生成的vmlinuz.efi文件。但我建议先尝试一下,不要删除它。

sudo rm /boot/vmlinuz.efi

最后,如果一切按预期工作,则esp可以使用以下命令自动挂载分区fstab。(这是钩子自动更新内核加载器文件所必需的。)

/dev/sda1   /boot/esp   vfat   rw,auto,user,uid=1000,gid=1000,utf8   0   0

或者

/dev/sda1   /boot/efi   vfat   rw,auto,user,uid=1000,gid=1000,utf8   0   0

欢迎提出所有进一步改进的建议!;-)

图片: 在此处输入图片描述

在此处输入图片描述

答案1

下面是一个稍微简单一点的实现方法EFISTUB从 rEFInd 启动裸 Linux 内核

较新的 (K)Ubuntu 版本包含一个不太引人注意的 EFI 启动选项,称为安全图形。这背后是或多或少为人所知的nomodesetGRUB 参数。在过去,此选项主要导致引导到 CLI 命令提示符,没有可用的图形用户界面 (X-Server)。然而,在 EFI 环境下,该选项允许使用基本的“UEFI 分辨率”引导 X。这些似乎是沿着 UEFI 定义的共和党(图形输出协议)规范。(https://wiki.osdev.org/GOP)在某种程度上,安全图形该选项对应于较新 Windows 版本中的“Microsoft Basic Display Driver”。

长话短说,这个不错的小选项甚至可以在非常受限制的“vBIOS 未在 EFI 中公开”的系统上启用最小的 X“紧急启动”。:-) 我还没有在 iMac11,2 上测试过这个,但我可以确认这个在包含 Radeon HD 4850 GPU 的 iMac11,1 上运行良好。

无论如何,这个很棒的选项有可能再次简化此处描述的主题。安装步骤如下:

  • 在 Mac OS 下准备所需的分区布局。如上所述,在我的例子中,这将是:sda1(电喷电子稳定控制系统),sda2(Macintosh HD),sda3(苹果恢复高清),sda4(Linux HD) 注意,恢复分区是不是在 Apple 磁盘实用程序中可见。

  • 现在安装 Ubuntu,选择EFI(安全图形)选项,目标分区是sda4又称为“Linux HD”。(在这种情况下,不使用任何额外的启动、交换或数据分区。) 请考虑, 步骤1 至 3应执行下述已重新启动。

  • 安装 K(U)buntu 后,直接从 CD/DVD 安装 rEFInd。此选项在较新的 rEFInd 版本中可用。从官方网站下载相应的映像,将其刻录到 CD/DVD,从中启动并选择“安装”选项。

笔记,如果有人只需要安装裸 Linux 内核启动,可以跳过以下步骤(暂时)。请先查看“可选的进一步步骤“。

因为 (K)Ubuntu 运行在 EFI 模式下,所以我们可以直接配置其他与 EFI 相关的启动内容,无需任何额外步骤。此处的示例使用常规 EFI 路径语法。

以下步骤描述了如何建立从库存 Apple EFI 固件启动的常规 EFISTUB。

  1. 当 Ubuntu 完全安装后,efi esp 分区应该存在并安装在/boot/efi。 (如上所述,这是因为 Ubuntu 在 EFI 模式下运行。)

  2. sudo nano /etc/kernel/postinst.d/zz-update-efistub创建一个包含以下内容的新文件:

    #!/bin/sh
    rm /boot/efi/EFI/ubuntu/*
    cp /boot/vmlinuz /boot/vmlinuz.efi
    cp /boot/vmlinuz* /boot/initrd.img /boot/efi/EFI/ubuntu/
    rm /boot/efi/EFI/ubuntu/vmlinuz.old
    

    此钩子将同步 ESP 内核相关文件到根分区的文件。使用以下命令使其可执行:

    sudo chmod +x /etc/kernel/postinst.d/zz-update-efistub
    sudo /etc/kernel/postinst.d/zz-update-efistub
    

    vmlinuz.efi较旧的 Apple EFI 固件版本需要内核加载器。在这些版本中,普通文件vmlinuz不会被识别为可启动文件。

  3. 由于 Linux 在 EFI 模式下运行,因此现在可以建立常规 EFISTUB 启动项。

    sudo efibootmgr -c -d /dev/sda -p 1 -L "Ubuntu (efistub)" -l /EFI/ubuntu/vmlinuz.efi -u "root=/dev/sda4 rw initrd=/EFI/ubuntu/initrd.img quiet splash"
    

    此外,此示例的语法是正确的。否则,必须根据使用的分区布局更改参数-d和。EFI ESP 为 ,而分区为。-p/dev/sda1root=sda4

作为最后(可选)步骤,完全删除 GRUB 和 Shim 是有意义的。更新:不幸的是,(K)Ubuntu 会一次又一次地自动安装这两个软件包。如果你真的想摆脱它们,那么你需要黑名单手动卸载 GRUB 和 Shim 软件包。以下命令将卸载这两个软件包以及相应的配置:

sudo apt remove --purge grub-common
sudo apt remove --purge shim

恭喜,常规 EFISTUB 内核启动(包括 rEFInd)现已完全配置!

要验证启动顺序,请sudo efibootmgr -v在 CLI 中输入。在我的情况下,“Ubuntu (efistub)”是条目“Boot0002”。它应该设置为第一个,在任何其他条目之前。这可以在 CLI 中完成,例如使用sudo efibootmgr -o 0002,0000,0001。但请注意,Mac OS 有时会将启动顺序重新设置为其默认顺序。因此最安全的选择是安装 rEFInd永久如前所述。这将绕过所有通用的 Apple EFI 和 GRUB 启动原则。作为紧急启动选项,如果安装的 rEFInd 失败,还可以使用 rEFInd CD 或 USB 闪存驱动器。

重新启动并检查一切是否按预期运行。:-D

可选的进一步步骤,仅在受限的情况下才需要“vBIOS 未在 EFI 中公开”系统:

建立一个裸 Linux 内核启动直接从 rEFInd 启动,需要以下命令。了解这一点非常重要,因为这需要持续手动调节因为内核和内核名称会随着每次内核更新而改变。因此请先检查当前内核版本!;-)

sudo cp /boot/vmlinuz-5.4.0-72-generic /boot/vmlinuz-5.4.0-72-generic.efi

在某些情况下,可能需要删除之前生成的vmlinuz.efi文件。但我建议先尝试一下,不要删除它。

sudo rm /boot/vmlinuz.efi

最后一步,建议安装 rEFInd PPA。这将自动将 rEFInd 更新到最新版本。对于 (K)Ubuntu,这可以通过 Roderick W. Smith 的官方 rEFInd PPA 轻松完成:

sudo apt-add-repository ppa:rodsmith/refind
sudo apt-get update
sudo apt-get install refind

或者也可以跳过此步骤并始终从 CD 启动 rEFInd。

就是这样!重启 Mac 并在 rEFInd 中选择 Linux 内核(带有 efi 扩展)。K(u)buntu 现在应该也可以在 EFI 下不公开 vBIOS 的系统上正常启动。

顺便说一句,fstab 中不需要自动挂载条目(esp 分区)。这已经配置好了,因为 (K)Ubuntu 从一开始就以 EFI 模式安装。

答案2

不,如果您尝试从磁盘(.img)运行某些内容,则应该使用选项结构的路径。

\options "root=/dev/ram0其中屏幕格式也可以使用〜video=1366x768 UVESA_MODE=1366x768"

此外,您没有提到重要的磁盘格式。

在标准模式(解压)下,您的屏幕截图上应该写上以下内容......

Boot boot\vmlinuz-5.8.0-50-generic from 24 GiB ext4 volume

其他轴不应采用 ext4 格式,并且您应该为轴指定选项或 .efi 文件。

开机画面

相关内容