My daily driver predates Dell’s support for the Linux Vendor Firmware Service, usually abbreviated LVFS. The only way to update my motherboard’s UEFI is through Windows, which I means I’ll need a Windows 10 USB installer.

Creating a USB installer on Ubuntu is typically as easy as opening GNOME Disks, selecting the desired USB disk, clicking Restore Disk Image…​, and selecting the ISO or image file. Unfortunately, creating a Windows installer is not that simple. The best solution for this has got to be Ventoy. Not only does it support booting more that just a single operating system, it allows booting from as many disk images as you can cram on to your drive. The long list of tested images is also quite nice. Runner ups include GNOME Disks plus workarounds and WoeUSB-ng.

Tutorial

Ventoy is a project for booting any number of arbitrary ISO’s off of a single flash drive. Once a flash drive is set up, you can just drag and drop ISO images on to the flash drive and presto! This tutorial is broken in to three parts, creating a Ventoy flash drive, adding an ISO image to it, and updating the Ventoy flash drive. For reference, I use Ubuntu 20.04 here, but these options will work across many Linux distributions. This tutorial assumes you are familiar with the command-line and Linux systems.

Create a Ventoy Flash Drive

The first step is, of course, to setup the flash drive with Ventoy.

  1. Insert a flash drive in to your computer.

  2. Locate the device associated with your USB by using the lsblk(8) command.[1]

    ➜ lsblk
    NAME             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
    sda                8:0    0 465.8G  0 disk
    ├─sda1             8:1    0   512M  0 part  /boot/efi
    ├─sda2             8:2    0     2G  0 part
    │ └─cryptoswap   253:1    0     2G  0 crypt [SWAP]
    ├─sda3             8:3    0     2G  0 part
    └─sda4             8:4    0 461.3G  0 part
    sdb                8:16   1  29.9G  0 disk (1)
    zd0              230:0    0   500M  0 disk
    └─keystore-rpool 253:0    0   484M  0 crypt /run/keystore/rpool
    1 sdb here is the 32 Gigabyte flash drive I’ve plugged in to my laptop.
  3. Ensure that nothing important is on the flash drive since it will be overwritten in a minute.

  4. Download the latest release for Linux, available on Ventoy’s GitHub Releases page.

    Download the latest release directly from the command-line with the following command.

    ➜ wget -q -nv -O - https://api.github.com/repos/ventoy/Ventoy/releases/latest \
      | awk -F': ' '/browser_download_url/ && /\.tar\.gz/ \
      {gsub(/"/, "", $(NF)); system("wget -qi -L " $(NF))}'
  5. Use the tar(1) command to extract the archive.

    tar xf ventoy-*-linux.tar.gz
  6. Install Ventoy on the flash drive by running the Ventoy2Disk.sh shell script as root, passing the -i flag and device.

    Since my target system uses UEFI, I include support for secure boot with the -s flag and use a GUID partition table by passing the -g flag. When targeting systems using legacy BIOS or depending on your target device, you may want to omit one or both of these flags.

    Some one-time setup, documented here, is required for secure boot when booting the flash drive for the first time on a machine.
    sudo ventoy-*/Ventoy2Disk.sh -i -s -g /dev/sdb
    
    **********************************************
          Ventoy: 1.0.31
          longpanda admin@ventoy.net
          https://www.ventoy.net
    **********************************************
    
    Disk : /dev/sdb
    Model: Samsung Flash Drive FIT (scsi)
    Size : 29 GB
    Style: GPT
  7. When prompted, take a deep breath, read the message, double-check the device is correct, and type Y if everything checks out and you still think this is a good idea.

    Attention:
    You will install Ventoy to /dev/sdb.
    All the data on the disk /dev/sdb will be lost!!!
    
    Continue? (y/n) y
  8. Repeat as necessary.

    All the data on the disk /dev/sdb will be lost!!!
    Double-check. Continue? (y/n) y
    
    Create partitions on /dev/sdb by parted in GPT style ...
    Done
    mkfs on disk partitions ...
    create efi fat fs /dev/sdb2 ...
    mkfs.fat 4.1 (2017-01-24)
    success
    mkexfatfs 1.3.0
    Creating... done.
    Flushing... done.
    File system created successfully.
    writing data to disk ...
    sync data ...
    esp partition processing ...
    
    Install Ventoy to /dev/sdb successfully finished.
  9. That’s all that is required of the downloaded Ventoy files for this tutorial, so delete them if you like.

    rm -rf ventoy-*

Add Images

Now that the flash drive has been configured, you just have to place any desired images on to the storage partition. Here, I walk through each step necessary to add a Windows 10 ISO to the flash drive.

  1. Download the Windows 10 ISO.

  2. Mount the Ventoy flash drive with the udisksctl(1) command.

    Usually a USB drive is mounted automatically and you can skip this step. If you’ve just created the flash drive, you’ll have to manually mount it.[2] If you are wondering whether it is mounted or not, well, the following command won’t hurt.

    By default, Ventoy labels the storage partition on the USB drive Ventoy and the boot partition VTOYEFI. Here, I mount the Ventoy partition by label.

    ➜ udisksctl mount -b /dev/disk/by-label/Ventoy --no-user-interaction
    Mounted /dev/sdb1 at /media/jordan/Ventoy
  3. Now just drag and drop the ISO in the Ventoy partition or use cp(1) as shown here.

    Unless Ventoy’s label for the storage partition has been changed from its default, it will be mounted at /media/$USER/Ventoy, where $USER represents your username.

    cp ~/Downloads/Win10_20H2_English_x64.iso /media/$USER/ventoy
  4. Before unplugging the flash drive, remember to unmount the filesystems.

    1. Unmount the Ventoy storage partition.

      ➜ udisksctl unmount -b /dev/disk/by-label/Ventoy --no-user-interaction
      Unmounted /dev/sdb1.
    2. Unmount the VTOYEFI boot partition.

      ➜ udisksctl unmount -b /dev/disk/by-label/VTOYEFI --no-user-interaction
      Unmounted /dev/sdb2.
  5. Now remove the flash drive and it’s ready for use!

Update

Ventoy regularly releases updates which may include bug fixes and new features. Typically, minor updates can be applied to an existing Ventoy flash drive without erasing your ISO files on the USB drive. These instructions explain how to go about updating a Ventoy flash drive.

  1. Plug the Ventoy flash drive in to your computer.

  2. Find the your flash drive with lsblk(8) command.

    ➜ lsblk
    NAME             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
    sda                8:0    0 465.8G  0 disk
    ├─sda1             8:1    0   512M  0 part  /boot/efi
    ├─sda2             8:2    0     2G  0 part
    │ └─cryptoswap   253:1    0     2G  0 crypt [SWAP]
    ├─sda3             8:3    0     2G  0 part
    └─sda4             8:4    0 461.3G  0 part
    sdb                8:16   1  29.9G  0 disk (1)
    ├─sdb1             8:17   1  29.8G  0 part /media/jordan/Ventoy
    └─sdb2             8:18   1    32M  0 part /media/jordan/VTOYEFI
    zd0              230:0    0   500M  0 disk
    └─keystore-rpool 253:0    0   484M  0 crypt /run/keystore/rpool
    1 sdb here is the 32 Gigabyte Ventoy flash drive I’ve plugged in to my laptop.
  3. Download the latest release for Linux from Ventoy’s GitHub Releases page.

    ➜ wget -q -nv -O - https://api.github.com/repos/ventoy/Ventoy/releases/latest \
      | awk -F': ' '/browser_download_url/ && /\.tar\.gz/ \
      {gsub(/"/, "", $(NF)); system("wget -qi -L " $(NF))}'
  4. Extract the archive with tar(1).

    tar xf ventoy-*-linux.tar.gz
  5. Update the Ventoy flash drive by running the Ventoy2Disk.sh shell script as root with the -u flag and the path to the flash drive.

    sudo ventoy-*/Ventoy2Disk.sh -u /dev/sdb
    
    **********************************************
          Ventoy: 1.0.31
          longpanda admin@ventoy.net
          https://www.ventoy.net
    **********************************************
  6. Ventoy will prompt for confirmation after indicating whether the operation is safe or dangerous.

    Enter Y to continue with the update.

    Upgrade operation is safe, all the data in the 1st partition (iso files and other) will be unchanged!
    
    Update Ventoy  1.0.30 ===> 1.0.31   Continue? (y/n)y
    
    Update Ventoy to /dev/sdb successfully finished.
  7. Before unplugging the flash drive, remember to unmount the filesystems.

    1. Unmount the Ventoy storage partition.

      ➜ udisksctl unmount -b /dev/disk/by-label/Ventoy --no-user-interaction
      Unmounted /dev/sdb1.
    2. Unmount the VTOYEFI boot partition.

      ➜ udisksctl unmount -b /dev/disk/by-label/VTOYEFI --no-user-interaction
      Unmounted /dev/sdb2.
  8. Now remove the flash drive and it’s ready for use again!

  9. If you are finished with the downloaded Ventoy files, clean them up now.

    rm -rf ventoy-*

Conclusion

Ventoy is really, really helpful for booting all kinds of operating systems off of a single USB drive. Take advantage of that increased disk space on flash drives now-a-days for storing more than just one image at a time.


1. Or, use fdisk(8), via sudo fdisk -l, if you prefer.
2. Or just unplug the flash drive and plug it back in.