当我想从外部硬盘运行Ubuntu时,引导加载程序应该安装在哪里?

我有一台运行Windows 10的笔记本电脑,我想在外部硬盘上安装Ubuntu,这样每当我需要时,只需将其插入并从外部驱动器启动即可。
我按照教程进行了操作,实际上是两个教程,都说引导加载程序必须安装在外部硬盘上。结果是,只有在插入外部硬盘时才能访问Windows。每当我没有插入它时,笔记本电脑就无法启动,只会出现一个带有白线的黑屏。修复了主引导记录后,我可以访问Windows。
现在我想再试一次,但我担心如果将引导加载程序安装在内部驱动器上,可能会不小心删除我的Windows分区,或者在启动时遇到问题。
那么我应该怎么办呢?

可能的错误和解决方法在https://bugs.launchpad.net/ubuntu/+bug/1835639。 - Bellera
4个回答

首先,很重要的是你了解你的启动模式。现代计算机可以以两种方式之一启动:
  • 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上。
希望运气好的话,这些方法中的一个会让你能够开始运行。

1. 启动Ubuntu Live USB/CD 2. 将外部硬盘连接上 3. 在外部硬盘上安装Ubuntu(高级选项,可以设置引导加载程序的安装位置) 4. 配置BIOS以从外部硬盘启动

这是一个基于BIOS的解决方案,在大多数基于EFI的计算机上无法正常工作。 - Rod Smith

你需要将引导加载程序安装在UEFI/BIOS用于启动的任何驱动器上。您可以在BIOS设置中更改此驱动器,通常可以通过在计算机启动后立即按下类似于、或的键来访问这些设置。因此,作为第一步,您可以尝试将计算机设置为从外部驱动器而不是内部驱动器启动。如果引导加载程序已正确安装在外部驱动器上,这应该可以正常工作。
对于日常使用,为了方便起见,您可能希望始终从同一驱动器启动,因此您需要将引导加载程序安装到内部驱动器上。但在此之前,您应该先备份,最好是制作一个工作中的内部驱动器的完整磁盘映像。如果在Windows旁边安装Ubuntu后遇到问题,Boot-Repair工具可能会有所帮助。

我已经把启动顺序改成了从USB引导,而不是内部硬盘驱动器。所以我想如果我在外部硬盘上安装Ubuntu并将引导程序安装在外部硬盘上,我就可以像从U盘启动一样了吧? - captain
抱歉,我不确定你具体在问什么。你应该能够 1) 在外部硬盘上安装引导程序,2) 移除 USB 驱动器,和 3) 设置 BIOS 从外部驱动器启动,然后启动 Ubuntu。 - Ben
@Wright船长。就像我说的,这个方案可行。 - Izzno

我会将引导程序安装在外部设备上! 这样一来,您的Windows安装就不会损坏或删除引导程序的机会。 只需简单地设置您的BIOS以启动即可完成任务:
USB-Key
USB-Disk
HDD
etc 
etc

注意:确保禁用安全启动(如果您找到该选项)

这样,如果由于某种原因您断开外部设备,它将不会对您的计算机造成问题。

而且:如果您避免使用专有驱动程序,您将能够在其他计算机上运行此系统...

(顺便说一句,我不建议将此类型的安装用于长期使用,因为它比eSATA慢)


Ubuntu支持安全启动。虽然偶尔会出现不兼容的情况,但这种情况很少见,所以通常不需要更改该设置。在EFI下,引导顺序设置通常比你描述的要复杂得多,这既有好处也有坏处——它提供了更多选项和更精细的控制;但这也意味着需要学习更多内容,而在BIOS世界中学到的简单解决方案可能行不通。 - Rod Smith
我并不知道Ubuntu可以“冒充”Windows,因为我看到的所有安全启动BIOS选项都明确说明它会永久禁用更改启动顺序和操作系统的能力。 - Izzno
Ubuntu并不“冒充”Windows。安全启动只需要一个EFI程序由一个私钥签名,而该私钥的公钥已在固件中注册。微软为第三方签署密钥,包括Canonical的Shim二进制文件,使它们可以在包含微软密钥的计算机上运行。我从未听说过安全启动实现会阻止更改引导顺序,尽管我想供应商可能选择添加这个限制。有关此主题的更多信息,请参阅我的安全启动页面 - Rod Smith