如何在 Ubuntu 双启动硬件上将 Ubuntu BIOS 安装转换为 EFI/UEFI,无需 Boot-Repair?

如何在 Ubuntu 双启动硬件上将 Ubuntu BIOS 安装转换为 EFI/UEFI,无需 Boot-Repair?

以前的配置:

  • /dev/sda[WD 2T HDD]上的 Ubuntu 12.04
  • /dev/sdb[日立 2T HDD]上的 Ubuntu 14.04

BIOS 模式下约 10 年的旧 PC(2006 年没有 EFI 模式的 PC!),基本 Nvidia 显卡。BIOS 设置为在/dev/sdb安装 grub2 的位置启动,并指向 14.04 + 12.04 /dev/sda

新配置:

最近的 PC 设置为 EFI 模式。没有显卡,使用 Core i7 6700 内的集成 Intel GPU。

/dev/sda[三星 500G SSD]上的 Ubuntu 16.04(全新安装)

Ubuntu 16.04 在该配置下运行良好。EFI 指向 SSD 上的启动。

问题:

现在,因为我喜欢保留旧版本的 Ubuntu,作为备份,以防我忘记重新应用一些有用的调整,我从旧电脑中取出日立驱动器并将其安装在新电脑上。

所以现在我有:

  • Ubuntu 16.04 位于 /dev/sda [三星 500G SDD]
  • Ubuntu 14.04 位于 /dev/sdb [日立 2T HDD]

在 16.04 上执行了操作grub-update,以便使用 14.04 获取 grub 菜单。机器在 16.04 上仍能正常启动,并显示 grub 菜单。

但问题是,当我从 grub 菜单中选择它时,它无法在 14.04 上正确启动。

会发生什么:

就好像 Ubuntu 根本找不到我正在运行的硬件一样,一切似乎都是“默认”的。

我设法通过删除 14.04 上的 NVIDIA 驱动程序进入会话,但是我得到:

  • 默认 1024x768 视频(在 1920 LCD 上不好看!)
  • 没有以太网
  • 没有声音

磁盘、键盘和鼠标工作正常。

这一切看起来“很正常”,因为 14.04 的安装最初是 BIOS,而且从我搜索到的内容来看,EFI 似乎以与内核不同的方式显示硬件。

我想要哪种修复:

最接近的问题是这个: 哪些命令可以在单启动硬件上将 Ubuntu BIOS 安装转换为 EFI/UEFI 而无需启动修复?

但是在这篇文章中,操作者没有一台可以正常工作的机器,而我有一台(操作系统为 16.04),并且没有安装 EFI 启动,而我已经有。

我更愿意了解自己在做什么,而不是使用自动启动修复(我怀疑它在我的例子中不会做任何聪明的事情)。

上述问题的答案建议安装要修复的版本的 grub-efi。但实际上它并不适用于我的情况,因为:

  1. 我不想在我的 HDD 上创建 EFI 分区(/dev/sdb),因为我的 SSD(/dev/sda)上已经有一个可以启动的分区。
  2. 如果我在 14.04 上执行 grub-efi-update,要求它在 上安装 grub /dev/sda,它可能会用旧 14.04 的 efi 分区覆盖 16.04。这是不可取的!

确实,我也可以在 14.04 覆盖它之后使用 dd 开头来/dev/sda恢复它,但是这种操作很“危险”,有毁掉一切的风险!

我已经尝试过了:

成功地:

  • 删除了 nVidia 驱动程序,以便在 14.04 上获得“最小”会话。使用 Nvidia 驱动程序,它可以运行到 lightdm,但无法启动 Unity 会话。

不成功:

  • 尝试了modprobee1000e(16.04 使用的以太网英特尔驱动程序)和 ptp plus pps_core。模块加载正确,但没有提供以太网接口
  • 在 /etc/fstab 上安装 efi 分区,与在 16.04 中安装的相同。没有区别。
  • 尝试insmod efivars通过实时编辑(Emacs 风格)添加 grub 菜单:不起作用,14.04 启动模块列表中没有 efivars.mod(16.04 也没有)

我还没有做的事情:

在 EFI 模式下将 14.04 安装到我为将来使用而保留的备用分区上,如果可能的话不要安装 grub-efi(参见上文),如果不可能的话,将其放在我不想毁坏的 USB 密钥上。然后尝试了解已安装版本与我的硬盘上的版本之间的差异。

您建议下一步采取什么步骤来避免完全重新安装 14.04 或覆盖我的 16.04 efi grub?


我希望内核能够“自动”猜测驱动程序,就像当您不让 BIOS/EFI 问题干扰它时它应该做的那样。

这是我对无法解决的问题的理解(由于缺乏明确的文档)。

启动过程:(就我所理解的而言)

  • 电源按钮
  • EFI(或 BIOS)启动并扫描硬件
  • 开始从为“初始加载器”(MBR、EFI 加载器......)参数化的任何存储设备读取
  • 使用 EFI 时,它会遍历 EFI 分区,运行那里的一些可执行文件(例如 shimx64.efi 以规避 M$-Secure-Lockdown 功能),这些文件能够以最小方式安装 Linux 分区,如 ext2/3/4。从那里的 grub.cfg 读取以找到“真正的”grub 加载程序的位置。
  • 启动“真正的” grub 加载程序(/dev/sda3对我来说是开启的)。
  • 这个“真正的” grub-loader(来自 16.04)读取菜单,其中包含当前版本(16.04)的行、恢复和我添加的旧 14.04 的行。
  • 当我选择 14.04 时,它会使用相应的 initrd 映像在 /dev/sdb1 上启动正确的 vmlinuz。
  • 从这里开始,内核被加载,并尝试获取机器的正确驱动程序(模块)。它可以通过/etc/modules(“手动”方法)或查看 BIOS/EFI 报告的配置(“自动”方法)来执行此操作。
  • 当系统设置为 EFI 时,内核将通过以下方式查看您的配置efivars,我在这里找到了一些文档:https://firmware.intel.com/blog/accessing-uefi-variables-linux。基本上,有一个伪文件系统/sys/firmware/efi允许内核查询您的配置并采取相应的行动。

我猜想 BIOS 安装的系统显然会做其他事情。内核查询 BIOS 的方式不同,并且系统以 EFI 启动,内核会发现“没有硬件”... 因此只初始化默认机器。

如何辨别 14.04 的旧安装:“现在您已经通过 EFI 启动,请使用efivars获取硬件详细信息”

如果我对启动过程的(简化)描述的假设存在严重错误,请毫不犹豫地纠正我,并向我指出有关该过程的任何有用链接。

答案1

回顾一下:您将 BIOS 启动 14.04 磁盘移至 UEFI 16.04 系统,重新运行 update-grub,现在可以启动 14.04 系统,但存在视频/驱动程序问题。您的解决方案是卸载所有(旧系统)专有驱动程序以恢复到默认系统,然后安装任何新驱动程序。

单击“软件更新程序”上的“设置”按钮,在“Ubuntu 软件”选项卡下,单击“专有驱动程序...”按钮,在“附加驱动程序”选项卡下查看提供哪些专有驱动程序,然后单击所需的驱动程序(可能重新启动)。什么都不会自动发生。

您可能还想将反向移植安装到 14.04 系统,以便为您的 6700 获取更新的内核。就是这样。无需“转换”。那么,如果您移动的 14.04 更新更改了该系统上的(未使用的)grub.cfg,该怎么办?您只需在 16.04 系统上重新运行 update-grub。那么,如果它没有任何对 /boot/efi 的引用,该怎么办?(尽管您可以在 /etc/fstab 文件中的一行中轻松添加它)。您根本没有启动问题。

答案2

我放弃将旧安装从 BIOS 转换为 EFI 的想法。

相反,我会使用@oldfred 的建议当我需要时通过主板进行双重启动。

这实际上有优势:

  • 在我的日常系统(16.04)中,我不需要等待 Grub-Menu(甚至 3 秒)来启动,因此我可以节省启动时间。
  • 当我想启动旧系统(14.04)时,在启动时按 F8 并不比按箭头键更难!
  • 我可以将我的 BIOS 安装在 /dev/sdb 上,因为我的主板可以启动 EFI 和 BIOS,因此在启动 14.04 时,它将处于 BIOS 模式。

无论如何,即使在 BIOS 模式下,我的驱动程序也无法加载,但由于这是另一个问题,我将提出另一个问题来尝试修复这些驱动程序。

因此,这个问题已经结束,但是如果你发现好的文档有关Linux Box的详细启动过程,我很高兴阅读它!

相关内容