如何创建一个既可以作为引导的Ubuntu.iso启动盘,又拥有多个分区的USB驱动器?

这个老问题听起来像是我想要的:将ubuntu.iso复制到带有两个分区的U盘 它被标记为重复问题:如何在不使用启动盘创建器的情况下将Ubuntu安装到USB键? 但是所有答案都回答了一个不同的问题,即如何创建一个具有多个分区的可引导USB。
我不想要只是可引导的东西;我想要一个既可以用来安装Ubuntu(如果我简单地使用dd复制iso文件时会得到的东西),又可以有一个或多个可写分区的USB。

我刚刚手动将Grub安装到GPT分区的闪存驱动器上,使用ESP和ext4,并创建了自己的grub.cfg文件,该文件使用Grub的loopmount来引导大多数ISO镜像。现在我已经在我的系统上安装了这个,并且可以通过引导一个驱动器来安装到另一个驱动器,所以现在不再频繁使用闪存驱动器了。以下是一些示例链接:https://help.ubuntu.com/community/Grub2/ISOBoot、https://gist.github.com/Pysis868/27203177bdef15fbb70c、https://wiki.archlinux.org/index.php/Multiboot_USB_drive#GParted_Live、https://askubuntu.com/questions/1269462/bios-uefi-template-image-for-booting-iso-files、https://ubuntuforums.org/showthread.php?t=2276498 - oldfred
1除了@oldfred提供的好链接之外,您还可以使用mkusb-plug - sudodus
@karel,那个和其他的回答提供了足够的信息,让我能够完成它,尽管它并不像我希望的那样简单。 - Ray Butterworth
3个回答

另一个可能的解决方案是使用Ventoy。直接来自工具描述:

Ventoy是一个开源工具,用于为ISO/WIM/IMG/VHD(x)/EFI文件创建可启动USB驱动器。 使用ventoy,您不需要一遍又一遍地格式化磁盘,只需要将映像文件复制到USB驱动器并引导即可。您可以一次复制多个iso文件,ventoy会给您提供一个启动菜单以选择它们。 同样支持Legacy BIOS和UEFI。 同样支持MBR和GPT分区样式。

我已经创建了一个可启动的USB,其中我通过复制/粘贴过程简单地复制了我的Ubuntu ISO文件,以便它们在将USB存储器用作可启动驱动器时显示在菜单中。同时,我也可以使用这个USB来存储我的个人数据(它们不会出现在Ventoy菜单中)。

这意味着当我将这个USB驱动器用作可引导驱动器时,我有一个像这样的菜单(从官方网站截图):

ventoy menu

当我通过Nautilus打开它时,它就像一个普通的USB存储设备,你可以在上面放置文件(来自我的Ubuntu 20.04的截图)。

nautilus

Ventoy没有deb格式或安装脚本,所以您需要从发布页面下载Ventoy。如果您下载了.tar.gz版本(以下示例中将引用版本1.0.61),您可以在终端中执行以下命令进行解压: sudo tar xzf ventoy-1.0.61-linux.tar.gz -C /opt 考虑到/opt文件夹的含义,我认为/opt是目标文件夹的最佳选择。
现在,您需要至少给Ventoy2Disk.shVentoyGUI.x86_64赋予权限: sudo chmod +x /opt/ventoy-1.0.61/Ventoy2Disk.sh /opt/ventoy-1.0.61/VentoyGUI.x86_64 现在你已经准备好使用它了。要创建一个可引导的USB,映射为/dev/usb(始终使用lsblk正确识别你的USB磁盘!)并采用GPT分区方式,你可以运行以下命令: sudo bash /opt/ventoy-1.0.61/Ventoy2Disk.sh -I -g /dev/sdb 接下来是Ventoy2Disk.sh提供的参数列表:
Ventoy2Disk.sh CMD [ OPTION ] /dev/sdX
  CMD:
    -i   install ventoy to sdX (fail if disk already installed with ventoy)
    -I   force install ventoy to sdX (no matter installed or not)
    -u   update ventoy in sdX
    
  OPTION: (optional)
   -r SIZE_MB  preserve some space at the bottom of the disk (only for install)
   -s          enable secure boot support (default is disabled)
   -g          use GPT partition style, default is MBR style (only for install)

否则,您可以使用图形界面运行Ventoy,方法如下:
sudo /opt/ventoy-1.0.61/VentoyGUI.x86_64
更多详细信息请参考Ventoy安装
另一个有趣的资源是来自RedHat.com:创建多启动Linux桌面系统的文章。

1Ventoy确实满足了所有楼主的需求,并且在我尝试过的每个操作系统上都能正常运行(除了Clear OS)。不过,我只能在UEFI模式下成功引导Windows安装程序。点赞! - C.S.Cameron

将U盘分区,根据需要在第一个FAT分区中为ISO映像提供空间。
运行`lsblk`命令来识别您的U盘设备,例如`/dev/sdb`,其中第一个分区是FAT分区,例如`/dev/sdb1`。将其挂载,例如`/media/user/PENDRIVE`。
将此分区标记为可引导,您可以使用磁盘工具完成此操作。
运行以下命令:
警告!下面是危险的命令,可能会损坏您的系统!建议:在虚拟机中执行此操作,或者如果有多余的U盘,则在实时环境中执行(更容易)。
``` sudo apt install grub-efi-amd64
dirs=(dev bin sbin etc sys usr proc lib lib64)
for dir in "${dirs[@]}"; do mkdir -p /media/user/PENDRIVE/$dir sudo mount --bind /$dir /media/user/PENDRIVE/$dir done sudo chroot /media/user/PENDRIVE/ grub-install --force --removable --target=x86_64-efi --efi-directory=/ /dev/sdb1
sudo chroot /media/user/PENDRIVE/ grub-install --force --removable --target=i386-pc --boot-directory=/ /dev/sdb ```
等待命令执行完毕。
取消挂载绑定的目录并删除它们:
``` for dir in "${dirs[@]}"; do sudo umount /media/user/PENDRIVE/$dir rm -r /media/user/PENDRIVE/$dir done ```
在`/media/user/PENDRIVE/grub/`下创建一个名为`grub.cfg`的文件,内容如下:
``` set root='(hd0,1)' configfile /boot/grub/grub.cfg ```
挂载Ubuntu ISO并将`grub.cfg`文件复制到`/media/user/PENDRIVE/boot/grub/`中。
根据需要修改文件¹,例如使用`ubuntu-20.04.1-desktop-amd64.iso`。
set root='(hd0,1)'
set iso_path=/ubuntu-20.04.1-desktop-amd64.iso
loopback loop $iso_path

menuentry "Ubuntu" {
    set gfxpayload=keep
    linux   (loop)/casper/vmlinuz iso-scan/filename=$iso_path file=/cdrom/preseed/ubuntu.seed maybe-ubiquity quiet splash ---
    initrd  (loop)/casper/initrd
}
  1. 将ISO映像复制到分区中(第一个FAT分区)。

准备好了,现在你有一个带有你创建的分区的EFI/i386可启动的U盘。

¹ 你可以修改所有的条目,而保留其余部分不变,在我的例子中我进行了简化。


@RayButterworth "在步骤0" 错了,应该是步骤9。当你制作一个列表时,编辑器会自动将0设置为适当的数字(很巧妙的技巧),但在这种情况下出错了。*"那只是一个简单的cp -r,没有dd"*. 不不,没有涉及dd,只是简单地复制文件。cp <the iso>就可以了。 - schrodingerscatcuriosity

简单手工制作持久化USB

如果你喜欢学习体验,你可以从零开始创建一个多分区的持久化USB,可以安装Ubuntu。

  • 启动已安装的Ubuntu或Live USB。
  • 插入目标USB。
  • 启动GParted。
  • 在目标USB上创建一个GPT分区表。
  • 在左侧创建一个1MB的BIOS引导分区,格式为未格式化。
  • 在其旁边添加一个300MB的FAT32 EFI引导分区。
  • 添加一个足够大的ext4根分区,用于存放Ubuntu ISO的内容(对于20.04来说,大约3GB)。
  • 创建一个标记为casper-rw的ext4分区。
  • 如果需要,添加一个NTFS数据分区。
  • 应用所有操作。
  • 将分区1标记为bios_grub。
  • 将分区2标记为boot、esp。
  • 关闭GParted。

gparted

  • 以管理员身份打开ISO文件夹,使用存档管理器打开ISO文件。
  • 将ISO的内容提取到目标根分区。
  • 从存档管理器窗口中拖放引导和EFI文件夹到EFI引导分区。
  • 在"sdx2/boot/grub/grub.cfg"文件中,在"尝试Ubuntu..."行后添加"set root=(hd0,3)"。
  • 在---后面加一个空格和单词"persistent"。

grub.cfg

  • 安装grub,如果在BIOS模式下或从Live USB驱动器引导,请执行以下命令:
  • sudo mount /dev/sdx2 /mnt
    
    sudo grub-install --boot-directory=/mnt/boot /dev/sdx
    
  • 如果在已安装系统上处于UEFI模式,请引导到目标驱动器并运行上述命令。

基于sudodus的mkusb启动


1你还可以创建一个持久文件。 - schrodingerscatcuriosity
1@schrodigerscatcuriosity。在上述问题中,OP似乎希望有多个分区,并且持久文件仍然限制在4GB。我在这个问题中提到了持久文件的创建:https://askubuntu.com/questions/1269462/bios-uefi-template-image-for-booting-iso-files。但是那篇文章有点啰嗦和复杂。 - C.S.Cameron
我下载的mbp-ubuntu 20.04 iso存档中没有boot/grub/grub.cfg文件。 - Edward Anderson