UEFI / GPT系统的第二个硬盘上的双启动窗口


15

我想安装linux,但是我不想冒险破坏当前的Windows安装,因为我听到了很多恐怖的故事。幸运的是,我有一个额外的硬盘。我可以在上面安装linux,然后在不修改Windows驱动器的情况下安装双启动窗口吗?

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

Answers:


18

当涉及到较新的UEFI系统和传统BIOS系统相同的概念时,我将使用以下术语BIOS,因为虽然这是一个面向UEFI的问题,但可以使用GRUB文档更好地讨论“ BIOS”名称,并且“ BIOS / UEFI”太笨拙。GRUB(实际上是GRUB 2-经常被歧义使用)是Linux安装的引导程序,用于双引导Windows。

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

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

希望您可以继续使用实时CD或其他任何东西,并使用GUI安装程序来完成此操作。但是,并非所有安装程序都是平等的,如果搞砸了,您将面临诸如以下问题:

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

  2. 我在第二张磁盘上安装了linux,但是将第一张磁盘用于引导加载程序,现在我什么也无法引导!

然后继续阅读。在第二种情况下,您应该首先尝试将linux重新安装到第二张磁盘上,这一次要确保引导装载程序就在那儿。最简单,最简单的方法是从计算机上临时删除Windows驱动器,因为我们将假定,无论驱动器的顺序如何,都没有安装任何额外的东西。

一旦您安装了Linux,并确保它可以启动,请重新插入Windows驱动器(如果您将其卸下,请记住,理想情况下,我们首先希望在驱动器顺序方面首先要它,然后在驱动器方面首先要第二个驱动器。引导顺序),然​​后继续下一步。

访问GRUB配置

启动linux,打开一个终端,然后

> su root

系统将要求您输入root的密码。从现在开始,您就是该终端的超级用户(请检查,然后尝试whoami),因此不要做任何愚蠢的事情。但是,您仍然是GUI的普通用户,并且由于我们将编辑文本文件,因此,如果您希望使用GUI编辑器,我们将不得不临时更改该文件的所有权及其所在目录:

> chown -R yourusername /etc/grub.d/

如果收到“不允许操作”,则说明操作不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.

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

> touch /etc/grub.d/40_custom
> chmod 755 /etc/grub.d/40_custom
> chown yourusername /etc/grub.d/40_custom

在文本编辑器中将其打开,复制粘贴上面的部分(从w /开始#!/bin/sh),然后继续进行下一步。

添加Windows启动选项

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

menuentry "MS Windows" {
        insmod part_gpt
        insmod search_fs_uuid
        insmod ntfs
        insmod chain
}

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

查找Windows Second Stage Bootloader

您的Linux安装可能已经自动挂载了Windows分区,您应该能够在文件浏览器中找到它。如果不是,请找出一种实现方法(如果不确定如何,请在此站点上提问)。完成后,我们需要知道挂载点-这在文件浏览器中应该很明显,例如/media/ASDF23SF23/。为了节省一些输入,我们将其放入一个shell变量中:

win="/whatever/the/path/is"

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

cd $win
find . -name bootmgfw.efi

如果您有一个很大的分区,这可能需要几分钟,但最有可能出现的第一件事就是我们正在寻找的东西。文件系统中可能还有其他包含长goobledygook字符串的引用-并非如此。Ctrl-c一旦看到简短的内容(例如./Windows/Boot/EFI/bootmgfw.efi或),请使用停止查找./EFI/HP/boot/bootmgfw.efi

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

设置正确的参数

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

> grub-probe --target=hints_string $win

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

--hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1

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

    insmod chain
    search --fs-uuid --set=root [the complete "hint bios" string]
}

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

> grub-probe --target=fs_uuid $win

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


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

    drivemap -s hd0 hd1

这就是前面提到的“窍门”。请注意,它不能保证正常工作,但尝试时不会造成伤害。


最后,最后一行应为:

    chainloader (${root})[the Windows path to the bootloader]
}

只是要清楚一点,例如:

    chainloader (${root})/Windows/Boot/EFI/bootmgfw.efi

而已。保存文件,然后在文件浏览器中签入以确保它确实已保存并看起来应该是这样。

将新菜单选项添加到GRUB

这可以通过称为grub-mkconfig或的工具完成grub2-mkconfig。它会一直在您之前找到的那个列表中Tab。您可能还有一个名为的命令update-grub。要检查它,只需在根终端中键入它。如果收到“找不到命令”,则需要grub-mkconfig直接使用。如果不是这样(包括再次出现错误),则只需设置配置即可略过。

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

> find /boot -name grub.cfg

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

> grub-mkconfig -o /boot/grub/grub.cfg

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

> grub-script-check /boot/grub/grub.cfg

如果此(或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

参考文献


2
您正在寻找的技术上正确的术语(也不是笨拙的)是固件,可以将自身显示为BIOS或UEFI。
Milind R

不幸的是,固件还具有更一般的含义,因为它是指嵌入到硬件中的任何软件。
Kylotan 2015年

在我的桌面上,引导时找不到“链”作为命令,但是它是我需要编写的40_custom文件中的chainloader。让我知道这是否正常
FlogFR

非常好!但是,当我尝试此操作时,我的Windows 8安装将不会在grub2中显示为条目。我已经修复了所有语法错误,并且创建的grub.cfg文件没有错误。还请注意,第一次提到chainload时会出现语法错误:chainload $({root})应该是chainload (${root})(我不能对其进行编辑,因为它的更改太小了)。
sobek 2015年

@sobek谢谢您-纠正了。如果您已向文件中添加了某些内容,/etc/grub.d而在生成配置时未添加该文件,则说明有些奇怪。如果您运行时grub-mkconfig没有-o吐出标准液,则可能有助于确认或拒绝正在处理您的添加。
goldilocks
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.