是否仍然可以使用UEFI将Ubuntu安装到外部硬盘?

看起来UEFI无法将Ubuntu安装到外部硬盘 ,与MBR一样,外部和内部之间没有太大区别。 这是真的还是仍然可能?

甚至可以结合两种启动方法吗?

它实际上是可能的

在继续之前,这些说明适用于空白EFI系统分区(ESP),可能会覆盖现有文件,或者无法按预期工作。 至少做备份!

为不同平台添加所需的分区

平台:Legacy PC,基于UEFI的Windows计算机,Apple计算机

使用MBR将ESP添加到现有安装

您需要按照其他安装或实时媒体的说明进行操作。

  1. 安装grub-efi-amd64-bin软件包。 这只会安装所需的资源。 它不会将您现有的MBR样式安装切换到UEFI并将事情颠倒过来。

  2. 在GParted中缩小Ubuntu分区以为ESP腾出空间。 ESP的建议大小范围为100 MB到500 MB,但按照这些说明创建的文件不需要超过2到5 MB。

    注意:ESP位于磁盘上的位置无关紧要,并且将Ubuntu分区从末端缩小几兆应该是快速且安全的。 一开始萎缩是不安全的 。 但需要注意的是,您的ESP应该是主分区而不是扩展分区或逻辑卷的一部分,1到4之间的分区数很好,上面的数字表示MBR分区表上的扩展分区。

    选择FAT32作为文件系统并设置启动标志。

  3. 挂载刚创建的ESP和缩小的根文件系统:

     mkdir -p /mnt/esp mount $esp_device /mnt/esp mkdir -p /mnt/rootfs mount $root_device /mnt/rootfs 

    注意:将$esp_device$root_device替换$esp_device 适当的设备,例如/dev/sdb2/dev/sdb1mountpoints /mnt/esp/mnt/rootfs只是选择用于处理此答案的其余部分的示例。

    使用以下命令安装GRUB的EFI映像和最小配置文件:

     grub-install --efi-directory /mnt/esp --boot-directory /mnt/rootfs/boot --target x86_64-efi --removable $device 

    请注意, $device是整个设备,例如/dev/sdb ,而不是分区。

  4. 就是这样,我们已经完成了,但让我试着解释一些事情。

    参数--target x86_64-efi将确保将UEFI映像和模块安装到给定路径。 --removable会将UEFI映像安装到--removable编码路径\EFI\BOOT\BOOT{arch}.EFI用于可移动媒体,而不是特定于分发的路径。 /boot/grub/ grub.cfg应该与两种启动方法一起使用,现在i386-pc旁边应该存在一个名为x86_64-efi的新文件夹。

    为了完整性,这是用于写入和依赖平台中NVRAM条目的不可移动介质的命令:

     grub-install --efi-directory /mnt/esp --boot-directory /mnt/rootfs/boot --target x86_64-efi --bootloader-id "Ubuntu" $device 

    正确的UEFI安装包括类似于下面/etc/fstab的一行,但是设置function没有,并且UEFI映像(类似于MBR引导加载程序)通常仅在OS安装期间写入/更新。

     UUID=1234-567F /boot/efi vfat defaults 0 1 

使用GPT将ESP或GRUB-BBP添加到安装中

ESP添加到GPT分区驱动器上的旧安装非常类似于上面的:

  1. 安装grub-efi-amd64-bin软件包。
  2. 通过调整根分区的大小并设置boot标志,创建一个FAT32文件系统的分区,类似于上面的说明。
  3. 挂载分区并从上面运行包含--removable参数的grub-install命令。

如果您只想在另一台计算机上启动现有的UEFI安装,这也可以使用。

为GRUB创建BIOS可引导分区 (BBP)有点不同:

  1. 安装grub-pc-bin包。

  2. 通过调整根分区大小并设置bios_grub标志,创建类似于上述说明的分区。 选择无文件系统并保持未格式化。

  3. 使用管理权限编辑配置文件/etc/default/grub ,并在GRUB_DEVICE=/dev/sdb6添加GRUB_DEVICE=/dev/sdb6 。 将/dev/sdb6替换为BBP的实际设备名称。 您可以使用命令行编辑器nano来保持简单。

    使用以下命令将GRUB MBR映像安装到BBP:

     grub-install --boot-directory /mnt/test/boot/ --target i386-pc $device 

    您可能希望删除或注释掉/etc/default/grub ,并将其添加到实际安装中。

额外奖励:在使用GPT的安装上为Mac添加分区

我发现我测试的全新Mac(Mac Mini A1347 EMC 2840)可以从标准的FAT32 ESP启动,甚至可以从MBR启动! 无论如何,我们走了:

  1. 安装grub-efi-amd64-binhfsprogsmactel-bootmactel-boot-logo (可选)软件包。 您需要启用Universe存储库( 如何从命令行启用“Universe”存储库? )并添加当前的Mactel支持PPA (有关详细信息,请参阅Mactel支持社区团队 )以安装所有这些存储库。

  2. 通过调整根分区大小,使用类似于上述说明的HFS +文件系统创建分区。 这次我们需要几兆字节的空间,如果之前只有5兆字节或更少,那么ESP的大小要加倍。 不需要旗帜。

  3. 安装分区:

     mkdir -p /mnt/esp-mac mount $esp-mac_device /mnt/esp-mac mkdir -p /mnt/rootfs mount $root_device /mnt/rootfs 

    注意:我选择$esp-mac_device/mnt/esp-mac来避免冲突。

    运行包含--removable参数的grub-install命令:

     grub-install --efi-directory /mnt/esp-mac --boot-directory /mnt/rootfs/boot --target x86_64-efi --removable $device 

    最后按照Mac预期的方式设置分区:

     sudo hfs-bless /mnt/esp-mac/EFI/BOOT/bootx64.efi sudo cp -v /mnt/esp-mac/EFI/BOOT/bootx64.efi /mnt/esp-mac/System/Library/CoreServices/boot.efi sudo cp -v /mnt/esp-mac/EFI/BOOT/grub.cfg /mnt/esp-mac/System/Library/CoreServices/grub.cfg sudo cp -v /usr/share/mactel-boot/SystemVersion.plist /mnt/esp-mac/System/Library/CoreServices/SystemVersion.plist sudo cp -v /usr/share/mactel-boot-logo/ubuntu.icns /mnt/esp-mac/.VolumeIcon.icns echo "Dummy kernel for booting" | sudo tee /mnt/esp-mac/mach_kernel 

    要在Mac上从外部媒体启动Ubuntu,您现在只需要在Windows键盘上按选项键 Alt ,然后选择正确的磁盘。

    Mac Startup Manager显示卷和Ubuntu徽标

关于分区标志,类型代码和GUID

为了尽可能准确,引导标志对GRUB并不重要,默认情况下,GRUB会搜索UUID以找到要从中引导的正确文件系统。 在GParted中设置引导标志或bios_grub标志通常会为分区设置类型(MBR)或GUID(GPT)。

除了具有正确工作的设置之外,设置正确类型或GUID的好处是这些分区将隐藏在文件管理器中。 检查和更改类型和GUID的最简单方法是通过磁盘 ( gnome-disks )。

屏幕截图显示了gnome-disks中的驱动器和分区

屏幕截图显示了gnome-disks中的编辑分区对话框

或者你可以使用parted或gdisk:

  • 0xef是MBR中用于fdisk的ESP的类型代码
  • ef00是GPT中用于gdisk的ESP的缩写类型代码
  • ef02是GPT中BBP的缩写类型代码,用于gdisk

维基百科有一个很大的GPT GUID列表。

根据手册 parted $device set partition esp on命令行等价物被parted $device set partition esp onparted $device set partition bios_grub on