如何创建仅支持UEFI的可启动USB实时媒体?

在当前可用的Windows 8计算机上安装Ubuntu时,拥有可以双向引导的实时媒体可能会成为一个问题。

换句话说,创建仅支持UEFI引导的可引导USB实时媒体的关键优势是:您知道它肯定通过UEFI引导并安装。

由于Valve已经使用基于Debian的Steam OS和UNetbootin进行了仅支持UEFI引导的USB安装程序,而Ubuntu的启动盘创建器的替代方案中得票最高的UNetbootin不兼容UEFI,因此具有误导性,我认为我们应该有一个单独的主题来创建仅支持UEFI引导的可引导USB实时媒体。

3个回答

概述

创建仅支持UEFI引导的USB启动介质非常简单。只需将文件复制到格式为FAT32的USB驱动器中。就这样!

请记住,在安装或引导介质时:

  • 您可能仍然需要明确地告诉计算机通过UEFI引导介质
  • 建议使用类似于Windows 8及更高版本预安装中的GPT分区表
  • 在创建分区表后不要忘记创建一个分区。
  • 使用最新的AMD64(LTS)ISO镜像,因为这些镜像肯定包含UEFI引导加载程序。

目录

  • 使用ISO方法复制文件
    1. 通过终端的示例
    2. 通过图形界面的示例
    3. 在Windows上的示例
  • ISO回环方法(高级)
    1. 创建二进制文件
    2. 创建配置文件
    3. 添加持久性
    4. 检查完整性
    5. UEFI安全启动
  • 2020年回顾

1. 从ISO文件复制文件的方法

这种方法也适用于其他包含EFI加载程序的安装介质,比如Windows。

1.1. 终端示例

如果604A-00EA是您的USB驱动器,并且您已经安装了p7zip,您可以执行以下操作:

$ 7z x ubuntu-12.04-desktop-amd64.iso -o/media/$USER/604A-00EA/

如果您的USB驱动器上只有一个分区,那么您已经完成了。否则,您需要将该分区标记为可引导,例如通过使用parted命令。
# parted /dev/sdX set 1 boot on

在这里,/dev/sdX 是你的USB驱动器,1 是应该用来引导的分区号。

1.2. 通过图形界面的示例

  1. 挂载.iso文件并将内容复制到USB驱动器上。在Nautilus中按下Ctrl+H以显示和复制隐藏文件。

    nautilus showing Disk Image Mounter in context menu when .iso-file is selected

  2. 通过GParted添加引导标志。

    GParted showing how to manage partition flags

1.3. Windows示例

1. 和上面一样,只需复制文件。 2. 按下 Windows/Super+X,进入磁盘管理并检查分区是否标记为活动。在 Windows 8 之前的版本中,您可以按下 Windows/Super+R 打开运行菜单,并打开 diskmgmt.msc,这将打开磁盘管理。

2. ISO回环方法(高级)

与从ISO镜像提取内容不同,GRUB和GRUB2能够通过回环设备直接从ISO镜像引导。假设ISO镜像是UEFI可引导的,我们可以设置一个USB驱动器,其中包含多个具有不同操作系统的ISO,而不会在USB驱动器上弄乱。

如果你想引导 Windows ,你可能想看一下SARDU。我记得2005年左右我在使用它时,它支持 Windows PE 并且似乎已经更新以支持 USB 驱动器和 UEFI,但请记住该工具也支持传统引导。

我们需要什么?

  • 对GRUB配置文件有非常基本的了解。
  • 对UEFI引导和GRUB有非常基本的了解,因为我们将生成自己的GRUB引导加载程序镜像,并包含大量模块。
  • 一个支持UEFI引导的ISO镜像、一个格式为FAT的USB驱动器和一台运行Linux的机器。
    • 不需要UEFI安装Linux(可能是鸡生蛋或蛋生鸡的情况),在VirtualBox中使用传统的Linux虚拟机即可。

2.1. 创建二进制文件

在您的Ubuntu机器或虚拟机上,请确保安装了grub-efi-amd64-bin软件包(较新版本还提供了32位Intel架构的grub-efi-ia32-bin)。该软件包在其他发行版上可能有不同的名称,您可以比较软件包的文件列表以找到适合您发行版的正确软件包。

以下命令将生成GRUB镜像,这里是一个EFI二进制文件,每台具有UEFI固件的计算机都应该能够运行。
grub-mkimage -o bootx64.efi -p /efi/boot -O x86_64-efi \
 fat iso9660 part_gpt part_msdos \
 normal boot linux configfile loopback chain \
 efifwsetup efi_gop efi_uga \
 ls search search_label search_fs_uuid search_fs_file \
 gfxterm gfxterm_background gfxterm_menu test all_video loadenv \
 exfat ext2 ntfs btrfs hfsplus udf

每个标准的UEFI固件都应该在\EFI\BOOT\中查找名为boot{arch}.efi的文件,因此在USB驱动器上创建文件夹,并将刚刚创建的镜像复制到此位置。除了x64以外,还可能有其他架构,但我们保持简单使用x64/amd64。

2.2. 创建配置文件

一个非常基本的示例grub.cfg配置文件,应该放置在与bootx64.efi相同的目录中,看起来像这样:

set timeout=3
set color_highlight=black/light-magenta

menuentry 'Boot Ubuntu 14.04.2 LTS from ISO' {
        set isofile="/efi/boot/ubuntu-14.04.2-desktop-amd64.iso"
        loopback loop $isofile
        linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile noprompt noeject quiet splash persistent --
        initrd (loop)/casper/initrd.lz
}
submenu 'Useful snippets' {
    menuentry 'Ubuntu' {
            chainloader /efi/ubuntu/grubx64.efi
    }
    menuentry 'Windows' {
            chainloader /efi/Microsoft/Boot/bootmgfw.efi
    }
    menuentry 'Firmware Setup' {
            fwsetup
    }
}

重要的是标题为从ISO文件引导Ubuntu 14.04.2 LTS的配置块。您可以根据自己的喜好更改颜色和超时时间。我选择了黑/浅洋红,因为它看起来还有点像Ubuntu,但在加载其他配置时很容易区分开来。您可以在Arch Wiki上找到其他发行版的更多示例,如果您想进一步了解,请花些时间阅读GRUB手册

回到配置块,显然ISO文件被引用为/efi/boot/ubuntu-14.04.2-desktop-amd64.iso,所以将您的ISO文件复制到\EFI\BOOT\并将配置中的ubuntu-14.04.2-desktop-amd64.iso替换为您的ISO实际文件名。

loopback loop $isofile 是一行代码,用于将我们的ISO文件加载到一个回环设备中,从而可以直接引导Linux内核。这是可能的,因为我们的EFI GRUB映像包含了回环模块。(在确定要包含哪些模块时进行了一些尝试和错误。您不应该看到任何错误消息,但还不完美。)说到内核,您可以添加内核参数,如toram,不同语言的参数(例如locale=de_DE bootkbd=de),以及示例中的persistent

2.3. 添加持久性

您可以按照以下描述添加分区:如何使Live USB使用分区进行持久化? 或者您可以创建一个casper-rw文件并将其放置在USB驱动器的根目录下。

dd if=/dev/zero of=casper-rw bs=1M count=4094
mkfs.ext4 -m 0 casper-rw

我没有测试过绝对最大值是多少,应该在4094到4096 MB之间。如果您打算使用更多的空间,请使用分区。请注意,对(根)的每一次更改都是对覆盖文件系统的修改,甚至包括删除文件。

2.4. 检查完整性

为了验证USB驱动器上的Live ISO内容是否处于原始状态,请查看以下问题的答案:

2.5. UEFI安全启动

Windows 10机器将强制使用安全启动,我建议您查看Linux Foundation的PreLoader,以将安全启动功能添加到此设置中。这里有一些ASCII艺术示例,展示了附带的HashTool的菜单

3. 2020年回顾

我写了这个答案已经超过5年了。它还能正常工作吗?对于Ubuntu来说,它运行良好。然而,最新的Windows 10镜像中的install.wim文件超过了FAT32的最大文件大小,而更大的镜像如RHEL 8也无法适应。昨天我尝试了Rufus,并注意到它也使用了GRUB和NTFS EFI模块来读取另一个NTFS分区,该分区存储了Windows安装文件。然而,它未能从该分区加载数据。此外,exFAT现在很常见。
Windows对没有分区表的驱动器要求很严格。试图将旧的SSD重新用作笨重的USB闪存驱动器在Windows上效果并不好。也许我需要阅读一些微软的文档,找出为什么要使它比在Linux上更加复杂的理由。
ChromeOS是一个不同的话题,我认为不可能按照我喜欢的方式创建恢复介质。当你不得不使用Windows并重新格式化整个驱动器来为你的Chromebook创建介质时,这是很麻烦的。
有趣的事情,希望我能找到时间修复其中的一些问题并学到更多新知识。
恭喜,我可以说你现在已经掌握了UEFI引导,不再需要担心了。

1让我指出以下几点:(a)过去5年左右出货的所有个人电脑都具备这种功能;(b).iso安装程序根目录可以将整个USB存储设备用作普通持久存储。使用只读挂载选项可防止意外删除。对于现代个人电脑和常见的使用模式来说,这似乎是比live-usb-creator的默认解决方案更好的选择。 - user1539216
3在使用GUI方法时,我遇到了一些符号链接错误。这是否相关?你能详细说明一下吗? - VRR
1嗨,LiveWireBT!非常感谢你的有趣回答!!我按照第二种方法——ISO环回(高级)成功地从USB闪存驱动器启动了UEFI。但是,在启动结束时,我收到了错误信息:无法挂载/dev/loop2到/cow,然后按下回车键后看到了(initramfs)提示符。你能帮助我解决这个问题吗? - zuba
我还想感谢你提供的出色指南,它清晰简明。我甚至从未想过将闪存驱动器分区并在上面安装多个操作系统。再次感谢! - Hatem Jaber
2至少在16.04版本中,“复制所有文件”无法启动,因为grub.cfg内核行参数“file=/cdrom/preseed/ubuntu.seed”。没有这样的文件,可能与先前提到的丢失的符号链接(ubuntu到.)有关。编辑grub.cfg以删除file=...并将其替换为“live-media-path=/casper/ ignore_uuid”。 - ubfan1
1有些文件太大了,无法复制到FAT32文件系统中。 - Gayan Weerakutti
只需将文件复制到格式为FAT32的USB驱动器中。关于USB驱动器的格式化...作为Mac OS用户,我必须问:当我使用磁盘工具来格式化("擦除")USB闪存驱动器时,应该选择什么"方案"?可用选项如下:
  • GUID分区图
  • 主引导记录
  • Apple分区图
- pilat
关于1.1节:你尝试过在USB驱动器中创建不同的分区吗?每个分区都有不同版本的Ubuntu镜像,以便安装特定版本,并使其成为可引导的分区。同时,我也在https://askubuntu.com/q/1216314/446253上提问了。 - XavierStuvw
@LiveWireBT 你需要在终端指令中添加详细信息。USB需要使用哪种分区方案?如果是GPT,那么FAT32分区是否需要被指定为EFI系统分区?文件需要提取到FAT32分区的根目录还是一个名为EFI的文件夹中,就像几乎所有ESP设置一样?如果ISO有多个分区怎么办?如果我们正在使用UEFI,为什么要设置引导标志? - Melab
很抱歉我没有回答最近的两条评论。目前我没有太多时间对一些陈述进行进一步调查。@Melab,你有一个带有多个分区的ISO的例子吗?在gparted中设置引导标志应该可以将分区配置为可引导(MBR)或ESP(GPT)。 - LiveWireBT
太不可思议了,7z方法起作用了。使用dd创建的一些镜像竟然被这台2011年的Mac完全忽略了。甚至都不需要运行'parted'这个东西。在进行7z之前将USB格式化为fat32可能与此有关。 - cardamom
2023年,我在戴尔电脑上使用7z方法无法成功,使用的是Fedora-KDE-Live-x86_64-38-1.6.iso文件,并将其安装在U盘的第一个分区中。它显示了grub菜单,但之后屏幕左上角只显示一个下划线,什么都没有发生。电脑对Cntr-Alt-Del有响应,所以并没有卡住。 - Luis A. Florit
ISO回环方法开始引导启动,但在挂载.iso文件(Fedora 38, 2023)后就会简单地停止。 - Luis A. Florit
@LuisA.Florit 请试试Ventoy,我已经使用它有一段时间了。虽然它会以特定的方式格式化您的存储设备,但我发现它非常易于使用,维护成本低,并且具有许多功能。我在我的Ventoy驱动器上存储了Fedora、Ubuntu、Windows和其他几个ISO文件。 - LiveWireBT
谢谢你的回答。我需要将Live drive作为一个分区(用于紧急情况),而第二个分区是我主要的U盘所在之处。Ventoy允许这样吗? - Luis A. Florit
@LuisA.Florit 不,不是这样的。只需购买一张微型SD卡和一个尺寸与拇指驱动器类似的小读卡器,或者购买另一个USB驱动器,不要再为此担心。存储器变得越来越便宜,我可以购买一张能够存储上述所有图像及更多内容的微型SD卡,而且我还有几张使用Ventoy格式化的驱动器,因此我永远不必花时间寻找那个装有所有图像的特殊驱动器。 - LiveWireBT
我猜我们的目标不同。我只想要一个随时随地陪伴我的Linux系统,唯一的目的是恢复系统或进行维护,无论何时何地,为任何需要的人提供帮助。我已经将所有重要的东西都存储在加密的U盘中,我不想再多带一个。我已经有了类似于你所说的“dd方法”,但我想实现循环挂载的方法,因为这样更容易保持更新。这与金钱无关,而是为了方便。然而,了解到Ventoy确实非常有趣,谢谢。 - Luis A. Florit
我尝试使用Nautilus上的选项2将文件复制到我的FAT32 USB驱动器上,但出现了错误“复制“stable”时发生错误。文件系统不支持符号链接。”请问该怎么办? - Richard

从ISO文件中提取到FAT32分区
将Ubuntu 64位桌面ISO文件的内容提取到一个带有FAT32文件系统和引导标志的分区中就能完成任务:创建一个只能以UEFI模式启动的实时驱动器。这里称为“从ISO文件复制文件的方法”(在接受的答案中)。
测试是否在UEFI或BIOS模式下运行
但是,在运行的Ubuntu系统(无论是实时还是已安装)中,很容易测试它是在UEFI还是BIOS模式下启动。运行这个命令行,
test -d /sys/firmware/efi && echo efi || echo bios

这样可以轻松地使用可在引导模式下使用的实时系统,这也是一个优势。
还可以参考以下链接,了解更详细的说明和方法描述。

help.ubuntu.com/community/Installation/iso2usb

help.ubuntu.com/community/Installation/iso2usb/diy


最简单的方法。最新的ISO仍然无法在我的机器上通过EFI引导(除非媒体已经格式化为GPT)。 /cdrom目录提到了一个早期的时代。也许是时候更新安装框架了。 - u2n

使用dd对我来说有效,出于某种原因,GUI版本不起作用。所以,首先,你可能想要监视dd的进度,另一个选项是使用SIGUSR1选项定期触发dd报告其进度,但这比pv更复杂。
然后:
sudo dd if=path/to/image/file | pv | sudo dd of=/dev/device_you_want_to_use

通常情况下,你想要使用的设备是 /dev/sdb,但请先用 df 命令进行确认!

10用这种方式创建媒体不会产生仅支持UEFI引导的媒体。问题的最后一段强调了一个优点:“创建仅支持UEFI引导的USB启动媒体,你可以确定它是通过UEFI引导的。”当尝试理解和设置支持UEFI引导的Ubuntu安装时,拥有可以同时支持两种引导方式的媒体会带来问题。 - LiveWireBT
1我明白了。奇怪的是,用这种方式,我能够制作出一个以UEFI模式启动的映像(我知道这一点,因为笔记本电脑设置为仅允许UEFI引导,并且由于初始屏幕)。首选答案对我没有用,计算机只是无法使用仅通过复制文件创建的映像启动。 - sup
6@sup 这种方法创建的媒体可以进行UEFI引导。问题是它不仅仅支持UEFI引导,正如问题中所要求的那样:它也可以在BIOS模式下引导。 - Darael
大家都忘了你可以使用status=progress来查看进度。 - slf