第二个硬盘上的双引导窗口,UEFI/GPT 系统

gol*_*cks 16 linux dual-boot windows gpt uefi

我想安装 linux,但我不想冒险破坏我当前的 Windows 安装,因为我听说过很多恐怖故事。幸运的是,我有一个额外的硬盘。我可以将 linux 安装到那个上然后双引导 Windows 而不必修改 Windows 驱动器吗?

另外,我有一个 UEFI“BIOS”,Windows 驱动器是 GPT 格式。

gol*_*cks 19

当提到新的 UEFI 系统和传统 BIOS 系统的相同概念时,我将使用下面的术语BIOS,因为虽然这是一个面向 UEFI 的问题,但谈论“BIOS”更适合例如 GRUB 文档,而且“BIOS/UEFI”太笨重了。GRUB(实际上是 GRUB 2 —— 这经常被模糊地使用)是由 linux 安装的引导加载程序,用于双引导 Windows。

首先,关于驱动器顺序和引导顺序。 驱动器顺序是指驱动器物理连接到主板上总线的顺序(第一驱动器、第二驱动器等);此信息由 BIOS 报告。 引导顺序指 BIOS 检查可引导驱动器的顺序。这不一定与驱动器顺序相同,通常可通过 BIOS 设置屏幕进行配置。驱动器顺序不应该是可配置的或受引导顺序影响,因为这将是一个对操作系统非常不友好的事情(但理论上一个钝的 BIOS 可以)。此外,如果您拔下第一个驱动器,第二个驱动器可能会成为第一个驱动器。我们将在配置引导加载程序时使用 UUID 来尝试避免此类问题(当代 linux 安装程序也这样做)。

获得所需内容的理想方法是根据驱动器顺序将 linux 安装到第二个驱动器上,然后使用 UEFI 设置根据引导顺序首先选择它。这样做的另一个好处是,您可以使用 BIOS/UEFI 引导顺序来选择 Windows 驱动器并根据需要绕过 grub。我在第二个驱动器上推荐 linux 的原因是因为 GRUB 必须“链式加载”Windows 本机引导加载程序,而 Windows 引导加载程序始终假定它在第一个驱动器上。但是,如果您更喜欢或需要相反的方式,有一种方法可以欺骗它。

希望您可以继续使用 live CD 或其他任何东西,并使用 GUI 安装程序完成此操作。然而,并非所有安装程序都是平等的,如果这被搞砸了,你会遇到以下问题:

  1. 我将 linux 安装到第一个磁盘上,但现在无法启动 Windows,或者

  2. 我将 linux 安装到第二张磁盘上,但是使用第一张磁盘作为引导加载程序,现在我无法启动任何东西!

然后继续阅读。在第二种情况下,您应该首先尝试将 linux 重新安装到第二个磁盘上,这一次确保引导加载程序所在的位置。最简单和最简单的方法是暂时从机器上移除 Windows 驱动器,因为我们将假设它没有安装任何额外的东西,无论驱动器顺序如何。

一旦你安装了 linux 并确保它可以启动,重新插入 Windows 驱动器(如果你删除了它——记住,我们理想情况下希望它首先是驱动器顺序,然后是第二个驱动器)引导顺序)并继续下一步。

访问 GRUB 配置

启动 linux,打开终端,然后

> su root
Run Code Online (Sandbox Code Playgroud)

您将被要求输入 root 的密码。从现在开始,您是该终端中的超级用户(检查、尝试whoami),所以不要做任何愚蠢的事情。但是,您仍然是 GUI 中的普通用户,因为我们将编辑一个文本文件,如果您更喜欢 GUI 编辑器,我们将不得不临时更改该文件的所有权及其所在的目录:

> chown -R yourusername /etc/grub.d/
Run Code Online (Sandbox Code Playgroud)

如果您收到“不允许操作”,则说明您没有su正确操作。如果你得到chown: invalid user: ‘yourusername’,你就太从字面上理解了最后一个命令。

您现在可以/etc/grub.d在文件浏览器中导航到并查找名为40_custom. 它应该是这样的:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
Run Code Online (Sandbox Code Playgroud)

如果找不到,请在 root 终端中输入以下命令:

> touch /etc/grub.d/40_custom
> chmod 755 /etc/grub.d/40_custom
> chown yourusername /etc/grub.d/40_custom
Run Code Online (Sandbox Code Playgroud)

在您的文本编辑器中打开它,复制粘贴上面的部分(从 w/ 开始#!/bin/sh)并继续下一步。

添加 Windows 启动选项

使用文本编辑器将其复制粘贴到文件末尾:

menuentry "MS Windows" {
        insmod part_gpt
        insmod search_fs_uuid
        insmod ntfs
        insmod chain
}
Run Code Online (Sandbox Code Playgroud)

这是 GRUB 完成任务所需的模块列表(ntfs可能是多余的,但也不应该有任何伤害)。 请注意,这是一个不完整的条目——我们需要添加一些关键命令。

查找 Windows 第二阶段引导加载程序

您的 linux 安装可能已经自动挂载了您的 Windows 分区,您应该能够在文件浏览器中找到它。如果没有,想办法做到这一点(如果你不确定如何做,请在本网站上提问)。完成后,我们需要知道挂载点——这在文件浏览器中应该很明显,例如/media/ASDF23SF23/. 为了节省一些输入,我们将把它放到一个 shell 变量中:

win="/whatever/the/path/is"
Run Code Online (Sandbox Code Playgroud)

等号两边不应该有空格。 请勿在此处包含 Windows 路径的任何元素。这应该指向 Windows 分区上的顶级文件夹。现在:

cd $win
find . -name bootmgfw.efi
Run Code Online (Sandbox Code Playgroud)

如果您有一个大分区,这可能需要几分钟,但很可能它吐出的第一件事就是我们正在寻找的东西;在包含长 goobledygook 字符串的文件系统中可能有进一步的引用——那些不是。用于Ctrl-c在您看到简短而简单的内容(如./Windows/Boot/EFI/bootmgfw.efi或 )时停止查找./EFI/HP/boot/bootmgfw.efi

除了.最开始的,记住这条路,以备后用;您可以将它复制到文本编辑器底部的空白行中,因为我们将在那里使用它。如果您现在想返回到以前的目录,请使用cd -,尽管从现在开始您在 shell 中的位置并不重要。

设置正确的参数

GRUB 需要能够找到引导过程并将其移交给第二阶段的 Windows 引导加载程序。我们已经有了 Windows 分区上的路径,但是我们还需要一些参数来告诉 GRUB 该分区在哪里。您的系统上应该安装了一个名为grub-probeor(例如,在 Fedora 上)的工具grub2-probe。打字grub再敲Tab两三下;您应该会看到一个包含其中一个的列表。

> grub-probe --target=hints_string $win
Run Code Online (Sandbox Code Playgroud)

您应该看到一个字符串,例如:

--hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1
Run Code Online (Sandbox Code Playgroud)

返回包含 GRUB 配置的文本编辑器,并在所有insmod命令之后(但在右花括号之前)添加一行,如下所示:

    insmod chain
    search --fs-uuid --set=root [the complete "hint bios" string]
}
Run Code Online (Sandbox Code Playgroud)

不要打破该行或允许您的文本编辑器这样做。它可能会在显示中环绕——区分不同的一种简单方法是设置行编号。下一个:

> grub-probe --target=fs_uuid $win
Run Code Online (Sandbox Code Playgroud)

这应该返回较短的字母、数字和可能的破折号字符串,例如“123A456B789X6X”或“b942fb5c-2573-4222-acc8-bbb883f19043”。将其添加到search --fs-uuid提示 bios 字符串之后的行尾,用空格分隔。


接下来,如果(且仅当) Windows 在驱动器顺序方面位于第二个驱动器上,请在该行之后添加search --fs-uuid一行:

    drivemap -s hd0 hd1
Run Code Online (Sandbox Code Playgroud)

这就是前面提到的“窍门”。请注意,它不能保证工作,但尝试并没有什么坏处。


最后,最后一行应该是:

    chainloader (${root})[the Windows path to the bootloader]
}
Run Code Online (Sandbox Code Playgroud)

只是要清楚,例如:

    chainloader (${root})/Windows/Boot/EFI/bootmgfw.efi
Run Code Online (Sandbox Code Playgroud)

就是这样。保存文件并在文件浏览器中检查以确保它确实已保存并且看起来像它应该的样子。

将新菜单选项添加到 GRUB

这是通过一个名为grub-mkconfigor的工具完成的grub2-mkconfig;它将在您之前找到的列表中Tab。您可能还有一个名为update-grub. 要检查它,只需在根终端中输入它。如果出现“找不到命令”,则需要grub-mkconfig直接使用。如果没有(包括出现更长的错误),您只需设置配置并可以略读一下。

grub-mkconfig直接使用,我们首先需要找到grub.cfg

> find /boot -name grub.cfg
Run Code Online (Sandbox Code Playgroud)

这可能是/boot/grub/grub.cfg/boot/grub2/grub.cfg

> grub-mkconfig -o /boot/grub/grub.cfg
Run Code Online (Sandbox Code Playgroud)

update-grub将自动扫描配置中的错误。 grub-mkconfig不会,但这样做很重要,因为现在处理它们比尝试启动机器时容易得多。为此,请使用grub-script-check(或grub2-script-check):

> grub-script-check /boot/grub/grub.cfg
Run Code Online (Sandbox Code Playgroud)

如果此(或update-grub)产生指示行号的错误,那就是 grub.cfg 中的行号,但您需要修复/etc/grub.d/40_custom(文本编辑器中的文件)中的相应部分。您可能需要成为 root 才能查看以前的文件,因此请尝试less /boot/grub/grub.cfg在终端中,点击:,然后输入行号。您应该会看到您的菜单条目。找到拼写错误,在文本编辑器中更正,然后再次运行update-grubgrub-mkconfig

完成后,您可以关闭文本编辑器并exit在终端中输入以退出超级用户模式。

重启!

当您进入 grub 菜单时,快速向下滚动(在超时到期之前,通常为 5 秒)到“Windows”选项并进行测试。如果您从 grub 收到文本消息错误,则说明配置有问题。如果您收到来自 Windows的错误消息,则问题出在您和 Microsoft 之间。不过不用担心,您的 Windows 驱动器尚未修改,您可以通过 BIOS 设置将其置于首位(根据启动顺序)直接启动。

当您再次返回 linux 时,将/etc/grub.d目录的所有权及其内容恢复为原始状态:

sudo chmod 755 /etc/grub.d/40_custom
Run Code Online (Sandbox Code Playgroud)

参考

  • 您正在寻找的技术上正确的术语(也不笨拙)是 **firmware**,它可以将自己显示为 BIOS 或 UEFI。 (2认同)