Answers:
当涉及到较新的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安装程序来完成此操作。但是,并非所有安装程序都是平等的,如果搞砸了,您将面临诸如以下问题:
我在第一个磁盘上安装了linux ,但是现在我无法启动Windows,或者
我在第二张磁盘上安装了linux,但是将第一张磁盘用于引导加载程序,现在我什么也无法引导!
然后继续阅读。在第二种情况下,您应该首先尝试将linux重新安装到第二张磁盘上,这一次要确保引导装载程序就在那儿。最简单,最简单的方法是从计算机上临时删除Windows驱动器,因为我们将假定,无论驱动器的顺序如何,都没有安装任何额外的东西。
一旦您安装了Linux,并确保它可以启动,请重新插入Windows驱动器(如果您将其卸下,请记住,理想情况下,我们首先希望在驱动器顺序方面首先要它,然后在驱动器方面首先要第二个驱动器。引导顺序),然后继续下一步。
启动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
),然后继续进行下一步。
使用文件编辑器将其复制粘贴到文件末尾:
menuentry "MS Windows" {
insmod part_gpt
insmod search_fs_uuid
insmod ntfs
insmod chain
}
这是GRUB完成工作所需的模块列表(ntfs
可能是多余的,但也不应伤害任何东西)。 请注意,这是不完整的条目 -我们需要添加一些关键命令。
您的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-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-grub
或grub-mkconfig
试。
完成后,您可以关闭文本编辑器并输入exit
终端以退出超级用户模式。
当您进入grub菜单时,快速向下滚动(在超时到期之前,通常为5秒)到“ Windows”选项并进行测试。如果您从grub收到一条短信错误,则说明配置有问题。如果从Windows收到错误消息,则说明您和Microsoft之间存在此问题。不过,请放心,您的Windows驱动器尚未修改,您可以通过BIOS设置将其放在第一位(根据启动顺序)来直接启动。
再次返回linux时,将/etc/grub.d
目录的所有权及其内容恢复为原始状态:
sudo chmod 755 /etc/grub.d/40_custom
Arch拥有一些最好的文档,并且其中大部分(包括该页面)大部分适用于任何GNU / Linux发行版。
chainload $({root})
应该是chainload (${root})
(我不能对其进行编辑,因为它的更改太小了)。
/etc/grub.d
而在生成配置时未添加该文件,则说明有些奇怪。如果您运行时grub-mkconfig
没有-o
吐出标准液,则可能有助于确认或拒绝正在处理您的添加。