如何让 grub 菜单显示在 MacBook 上?

Bro*_*eph 9 grub2 macbook grub-efi 19.10

我已经在我的 MacBook(2010 年中又名 Macbook7,1)上安装了 Ubuntu 19.10 作为唯一的操作系统。现在我的系统正在运行,但它有一些问题。其中一个问题是,无论我做什么,我似乎都无法让 GRUB 显示菜单。现在,这就是我的/etc/default/grub文件包含的内容:

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX=""
GRUB_GFXMODE=auto
Run Code Online (Sandbox Code Playgroud)

当我的计算机启动时,我看到一个不闪烁的_符号大约 5 秒钟,然后我看到您在 Ubuntu 启动时看到的正常内核输出。如果我在显示ESC时按下该键_,则无法继续启动并且屏幕会卡住,直到我通过按住电源按钮强行关闭系统。

我注意到的一个线索是,从 USB 安装程序启动时,grub 菜单工作得非常好。我查看grub.cfg了 USB 安装程序上的 ,它有这条线,/boot/grub/grub.cfg在我的 Ubuntu 安装中似乎没有:insmod efi_gop

因此,鉴于此信息,我该如何配置 GRUB 以显示菜单?

Yur*_*ira 12

简答

解决方法适用于我 2009 年年中运行 64 位 XUbuntu 20.04 的 13" Apple Macbook Pro:

  1. 创建*Ubuntu(即Ubuntu、XUbuntu、KUbuntu...)发行版的LiveCD以防万一
  2. 删除shim*.efi位于/boot/efi/EFI/ubuntu/
  3. 使用 APT 清除(即完全卸载)系统中的shim DEB 包(shimshim-signed)。
  4. 删除grub位于的文件夹/boot
  5. 再次安装 GRUB(即使用诸如 之类的命令执行“全新”或“干净”的 GRUB 安装grub-install /dev/sda ; grub-install --recheck)。
  6. 将 GRUB 的默认设置修复/etc/default/grub[1]激活 GRUB 的控制台模式[2] 强制GRUB 在这种控制台模式下显示其菜单 3 秒。您可以通过基本上设置GRUB_TIMEOUT_STYLE=menu,GRUB_TIMEOUT=3GRUB_TERMINAL=console/etc/default/grub.
  7. 运行,sudo update-grub以便将这些固定的默认设置应用于“全新”的 GRUB 安装。
  8. 运行efibootmgr以确保ubuntu(即grubia32.efigrubx64.efi,创建并存储在/boot/efi/EFI/ubuntu)仍然是默认的 EFI 引导加载程序选项。
  9. 重新启动系统。
  10. 出现问题时从 LiveCD 启动。

(非常)长答案:如何执行上述程序

  1. 创建 LIVECD。

    有多种方法可以创建 LiveCD。在我看来,最基本的包括下载 *Ubuntu LiveCD.iso文件(例如ubuntu-20.04-amd64.iso),然后使用UNetbootin将其刻录到 U 盘(闪存驱动器)或(如果您可以访问 Linux shell 终端,例如bash)使用dd将此类.iso文件刻录到任何外部媒体(U 盘、可写 CD-ROM 等)中。这个问题答案提供了一套非常详细的程序。

  2. 删除垫片 EFI 文件。

    一旦你创建了你的 LiveCD 并测试它以确保它在你碰巧需要它时可以工作,打开一个 shell 终端模拟窗口(CtrlAltT是它的快捷方式,但你也可以从应用程序面板/菜单中运行它或右键单击桌面中的空闲区域,然后选择终端选项)然后sudo su在终端中运行,这样您就成为了root用户。从现在开始,成为root将使您不必使用sudo每个 shell 命令。成为root 后,删除可能位于的shim*.efi文件(例如shimia32.efi对于 32 位系统,shimx64.efi对于 64 位系统)/boot/efi/EFI/ubuntu。假设shim .efi文件确实位于/boot/efi/EFI/ubuntu,可以通过在终端中运行以下命令来删除它:

     rm /boot/efi/EFI/ubuntu/shim*.efi
    
    Run Code Online (Sandbox Code Playgroud)
    • 如果未挂载 EFI 分区,该命令mount /boot/efi可能会挂载它。如果这样的命令没有挂载它,请运行lsblk -o NAME,FSTYPE,MOUNTPOINT,PARTLABEL |grep -i efi以找到您的 EFI 分区(例如/dev/sda1)然后挂载它(例如mount /dev/sda1 /boot/efi)。如果/boot/efi挂载点不存在,请使用命令创建它,mkdir -p /boot/efi然后在其上挂载 EFI 分区(例如mount /dev/sda1 /boot/efi)。

    • 此外,一旦此类 EFI 分区安装在/boot/efi,并假设shim .efi文件位于/boot/efi/EFI/ubuntu,类似thunar /boot/efi/EFI/ubuntu或的命令nautilus /boot/efi/EFI/ubuntu(取决于您的系统使用的文件管理器)将使您直接从文件管理器(例如)获得对此类文件夹的root访问权限(例如/boot/efi/EFI/ubuntu)窗口界面):这样可以更轻松地浏览、查找和删除shim .efi文件(例如shimx64.efi)。

    • *警告*如果您已连接的根部,不小心删错了文件,这样的文件是永远失去了(它并没有去到回收站)。因此它建议你付出了很多的关注你在做什么,所以你最终不会使您的操作系统无法使用/访问。

    • 如果您想知道为什么要删除shim .efi文件(即 32 位shimia32.efi文件或 64 位shimx64.efi文件):GRUB 的.efi文件(即 32 位grubia32.efi文件或 64 位grubx64.efi文件)是合适的使用在禁用安全启动的计算机上。shim 版本实际上只是提供了 GRUB.efi文件版本的签名版本(因为安全启动需要这样的签名版本)。但是如果你在禁用安全启动的 Mac 上安装 *Ubuntu (这是常见的情况),即使 Mac 的固件告诉引导程序加载不安全的文件,*Ubuntu 也会将 shim EFI 文件添加为默认选项GRUB EFI 文件。因此,解决方案是删除 shim(安全启动)EFI 文件,然后将 GRUB(非安全启动)EFI 文件设为必须在启动时与 Mac 硬件“交互”的新默认 EFI 文件。

  3. 清除垫片 DEB 包。

    删除位于 eg的shim .efi文件后/boot/efi/EFI/ubuntu,运行 APT 以清除shim DEB 包,从而防止将来的shim更新.efi再次创建有问题的文件:

    apt-get purge shim shim-signed --allow-remove-essential -y
    
    Run Code Online (Sandbox Code Playgroud)
  4. 删除 GRUB 文件夹。

    现在您已经摆脱了shim,是时候摆脱 GRUB 了:返回到您的文件管理器窗口(例如 Nautilus、Thunar...)并删除grub可能位于的文件夹/boot。如果在 中没有找到grub文件夹/boot,请运行命令updatedb ; locate -i grubenv查找grubenv文件的位置:此文件存储在grub文件夹中,因此如果您找到grubenv文件的位置,您就可以找到grub文件夹的位置。

  5. 安装 GRUB 的“新”副本。

    假设 GRUB 安装在您的第一个 SATA 存储驱动器(即sda)中,请通过运行以下命令将其安装回那里:

    grub-install /dev/sda ; grub-install --recheck
    
    Run Code Online (Sandbox Code Playgroud)

    如果您的 EFI 分区位于 eg sda(eg /dev/sda1),通常的做法是将 GRUB 安装在/dev/sda. 如果您的 EFI 分区位于 eg sdb(eg /dev/sdb1),通常的做法是将 GRUB 安装在/dev/sdb. 等等。

    正如这里所解释的,也可以使用您的 LiveCD 在您的启动盘中安装一个“新鲜”的 GRUB (例如/dev/sda)。当您系统的 GRUB 安装程序损坏并且您暂时无法通过例如 APT 重新安装它时,此方法特别有用。例如,对于 64 位 Intel Mac,root安装命令当前是apt install grub-common grub-efi grub-efi-amd64 grub-efi-amd64-bin grub-efi-amd64-signed grub-pc-bin grub2-common,但如果它在您的系统上不起作用,您可以随时启动 LiveCD,以便从 LiveCD 运行的软件包安装 GRUB,然后grub创建新文件夹in eg/boot是由这个 LiveCD 的 GRUB 创建的。

  6. 修复 GRUB 的默认设置。

    如果您没有 Gedit 文本编辑器,请通过运行命令安装它apt-get install gedit -y,然后运行此命令以使用 Gedit 编辑 GRUB 的默认设置文件:

    gedit /etc/default/grub
    
    Run Code Online (Sandbox Code Playgroud)

    一旦 Gedit 窗口显示grub文件的内容,删除#位于每个参数左侧的字符GRUB_TIMEOUT_STYLE,GRUB_TIMEOUTGRUB_TERMINAL,然后修改它们的选项,使其成为这些:

    GRUB_TIMEOUT_STYLE=menu
    GRUB_TIMEOUT=3
    GRUB_TERMINAL=console
    
    Run Code Online (Sandbox Code Playgroud)
    • menu选项告诉 GRUB 它必须在计算机启动或重新启动时创建并显示一个菜单。
    • 3选项告诉 GRUB 在自动引导默认操作系统内核之前必须等待 3 秒,因此用户有足够的时间从菜单中选择不同的内核(如果您愿意,可以将其降低到 1 或 2,或者将其增加到 4、5 等)。
    • console选项告诉 GRUB 它必须忽略显卡最合适的驱动程序,而是使用更基本但也更兼容的简化 VGA 显示驱动程序:它不会提供花哨的菜单,但会提供一个功能更多的菜单可能有效并可见。

    完成上述修改后,保存文件,然后退出 Gedit 文本编辑器。

    如果您更喜欢使用 shell 的标准文本编辑器(恰好是 Nano),请运行nano /etc/default/grub而不是gedit /etc/default/grub.

  7. 应用在 GRUB 的默认设置中所做的更改。

    这个很容易。只需返回终端并运行以下命令:

    update-grub
    
    Run Code Online (Sandbox Code Playgroud)

    上面的命令将读取/etc/default/grubGRUB的内容并将其应用到“新”GRUB 安装的设置中,从而从此更改 GRUB 的行为。

  8. 确保选择了正确的引导 EFI。

    假设您的 EFI 分区挂载在,/boot/efi并且您删除的shim .efi文件存储在/boot/efi/EFI/ubuntu(这是 *Ubuntu.efi文件的默认位置),请检查 GRUB 的.efi文件是否在那里:

    ls -l /boot/efi/EFI/ubuntu/ |grep -i '.efi'
    
    Run Code Online (Sandbox Code Playgroud)

    由于 Intel Mac 是 64 位计算机,因此预计在其上安装了 64 位 *Ubuntu,因此grubx64.efi上面的命令会找到一个名为的文件。但是,32 位系统应改为使用名为 eg 的文件grubia32.efi,因此如果您的系统是 32 位系统,请查找 32 位版本的 GRUB.efi文件。

    • 如果未.efi找到GRUB文件,则说明有问题,建议您重新安装 GRUB(请参阅第 5 步)。

    • 如果.efi找到了 GRUB文件,那么现在是时候检查ubuntuEFI 文件夹是否被选为默认(即第一个).efi文件源(此优先级在启动时很重要)。为此,请运行以下命令:

      efibootmgr
      
      Run Code Online (Sandbox Code Playgroud)

    输出必须显示如下内容:

    BootCurrent: 0001
    BootOrder: 0001,0080
    Boot0001* ubuntu
    Boot0080* Mac OS X
    Boot0081* Mac OS X
    Boot0082* 
    BootFFFF* 
    
    Run Code Online (Sandbox Code Playgroud)

    在我的例子中,ubuntu被标识为Boot0001*(它的编号是0001),因此它是需要作为默认选项的那个:从左到右,BootOrder必须首先显示0001(即ubuntu)。如果这不是您的情况,请通过运行如下命令来修复它:

    efibootmgr --bootorder 0001,0080,0081
    
    Run Code Online (Sandbox Code Playgroud)

    这将使0001(即ubuntu)第一个引导选项,0080(即Mac OS X)第二个,以及0081(即Mac OS X)第三个(我还没有找到0080和之间的区别0081。无论如何......)。

    • 如果您的引导加载程序位于 eg /dev/sdb,您必须通过运行命令来更新引导管理器efibootmgr --disk /dev/sdb

    • 如果ubuntu不是活动引导,请使用efibootmgr -b 0001 -a. 查看更多,例如在这里或通过运行efibootmgr --help

  9. 重新启动系统。

    重新启动系统以检查所有这些漫长的旅程是否解决了问题。您可以从菜单或通过运行以下终端命令之一来重新启动它:

    init 6
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    reboot
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    shutdown -r now
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    telinit 6
    
    Run Code Online (Sandbox Code Playgroud)
  10. 出现问题时从 LIVECD 启动。

    在 Mac(iMac、Macbook 等)上从 LiveCD 启动的标准方法:

    • 关闭 Mac。
    • 再次打开并立即按住option钥匙。
    • 输入密码(如果有的话)并点击enter
    • 插入您的 LiveCD USB 记忆棒、包含 LiveCD DVD 的外部 DVD 驱动器、包含 LiveCD 的 Mac 内部 DVD 驱动器等,然后等待。
    • Mac 读取 LiveCD 的内容后,屏幕上将显示一个新图标。使用箭头键(??)选择它并点击enter(即return)。
    • 从这里开始,根据出了什么问题,有很多可能性。例如,您可能想使用 LiveCD 重新安装和/或更新 GRUB。在最坏的情况下,您可以使用 LiveCD 备份您的数据(例如到外部驱动器),然后重新安装 *Ubuntu 发行版。


小智 5

我在 MacBook Pro 5,5(13" 2009 年中)上的 20.04 上遇到了同样的问题。从 Ubuntu Live USB 安装程序启动可以很好地显示 grub 图形菜单。

在有人能够找到根本原因之前,对我有用的解决方法是取消注释或添加到GRUB_TERMINAL=console/etc/default/grub然后运行sudo update-grub​​。

您至少可以从菜单中查看并进行选择,它只是不是全屏或看起来不太好。我怀疑这更多的是 EFI 设置问题,而不是 grub 问题。


归档时间:

查看次数:

13047 次

最近记录:

4 年,8 月 前