首先,很重要的是你了解你的启动模式。现代计算机可以以两种方式之一启动:
- BIOS -- 这是旧的引导方式,在2011年之前的大多数计算机上使用。现代计算机通过一个叫做兼容性支持模块(CSM)的功能来支持BIOS模式引导,也被称为“传统模式引导”或类似的术语。因此,这种方法可以用三个名称来描述:BIOS、CSM或传统模式。它涉及到16位引导加载程序代码分散在主引导记录(MBR)和其他各处。这是一种不太优雅但成熟的引导方法,大多数没有明确提到引导模式的网站都在描述BIOS模式引导。然而,如果你的计算机配备了Windows 8或更高版本,很有可能它不使用这种引导方法。
- EFI/UEFI -- 这是自2011年中期以来大多数计算机的原生引导模式,与BIOS模式引导完全不同,所以你应该忽略任何明确指出是针对BIOS模式引导的建议,或者任何没有提到引导模式的内容(因为这很可能是过时的或者是由不了解区别的人编写的)。一个例外是:令人困惑的是,许多人,甚至计算机制造商,将他们的EFI称为“BIOS”。这种做法造成了很大的混淆。
既然你提到了Windows 10,那么很有可能你的电脑是基于EFI的,并且以EFI模式启动。我将在这个假设下继续进行。如果这个假设不正确,请忽略本答案的其余部分。
要以EFI模式引导内部磁盘,操作系统通常会将引导加载程序存储为磁盘上EFI系统分区(ESP)中的一个文件。这个文件名可以是任何合法的名称,但对于Ubuntu来说,它将是EFI/ubuntu/shimx64.efi
,然后再启动EFI/ubuntu/grubx64.efi
。操作系统安装程序会将引导加载程序的名称注册到EFI内置的引导管理器中,并将该名称存储在NVRAM中。如果EFI正常工作(并非所有都如此),这将导致一个正常的引导过程。
将这个过程应用于可移动磁盘时的问题有三个:
Ubuntu安装程序将GRUB安装到“ESP” - 但您可能有多个可用的ESP(几乎肯定一个在硬盘上,也许一个在USB驱动器上)。控制GRUB安装的位置可能会很棘手。它不是通过使用关于GRUB安装位置的明显标题标记的选项来完成的。相反,只能通过“其他选项”安装选项来完成(据我所知),方法是将要使用的ESP标记为“EFI引导分区”或“EFI系统分区”(名称取决于Ubuntu版本)。
如果您将GRUB安装到USB驱动器上的ESP,则当您拔出USB驱动器时,EFI可能会注意到它有一个无效的注册引导加载程序条目,并删除该条目。许多EFI都会这样做,这意味着如果您将GRUB安装到外部磁盘上,然后拔掉它,即使您重新插入该磁盘,也无法从该磁盘启动。
Ubuntu配置GRUB的方式导致其依赖于位于Ubuntu /boot/grub目录中的配置文件,这很可能不在ESP上。因此,如果Ubuntu将GRUB安装到内部磁盘上的ESP上,您将避免第一个问题,但会遇到另一个问题,因为当您断开连接USB驱动器启动时,GRUB将启动但无法找到其配置文件。结果是一个对大多数用户来说令人困惑的grub>提示符。
这些问题有很多解决方案,包括:
- 手动将GRUB安装到外部磁盘的回退文件名 -- 操作系统安装程序通过使用回退文件名
EFI/BOOT/bootx64.efi
进行引导。如果你将Shim(启动GRUB)复制到此文件名(通过将EFI/ubuntu
复制到ESP上的EFI/BOOT
,然后在EFI/BOOT
中将shimx64.efi
重命名为bootx64.efi
),你的固件将能够像启动Ubuntu安装程序一样启动基于USB的GRUB。这将解决我刚刚提到的两个问题,但你需要使用计算机内置的引导管理器来选择要启动的操作系统。这个内置的引导管理器从无法使用到可容忍的范围不等,所以这可能是一个可以接受的解决方案,也可能不是。在安装Ubuntu后,你可能还需要调整启动顺序,以防止默认情况下从内部磁盘的ESP或外部磁盘的ESP启动GRUB。
- 在内部磁盘上创建一个
/boot
分区 -- 如果你将GRUB安装到内部磁盘上,那么你还可以在内部磁盘上创建一个/boot
分区。这将使GRUB在所有启动时正常工作;然而,即使USB磁盘未连接,Ubuntu选项也会一直显示。这可能是不可取的,特别是如果Ubuntu是默认选项。此外,这个解决方案意味着你的外部USB驱动器只能在准备它的计算机上启动。如果你想在其他计算机上使用该磁盘,应避免使用此解决方案。
- 使用更智能的引导管理器 -- 引导管理器可以让你选择要启动的操作系统,而引导加载程序则将内核加载到内存中。GRUB同时完成这两个任务,而EFI内置的引导管理器只完成第一个任务。还有其他可用的引导管理器,其中一些可能帮助你避免我提到的问题。例如,我的rEFInd,如果安装到内部磁盘的ESP并设置为默认的引导程序,将仅在GRUB或Linux内核存在时检测和显示Ubuntu选项--也就是说,当USB驱动器插入时。通过适当设置
refind.conf
中的default_selection
选项,你可以配置rEFInd在插入Ubuntu USB驱动器时自动启动Ubuntu,并在未插入Ubuntu USB驱动器时直接启动Windows。我对this question的回答提供了更多关于这种类型配置的详细信息,尽管是在Mac而不是PC上。
希望运气好的话,这些方法中的一个会让你能够开始运行。