How to create a bootable USB drive from an ISO image on Linux

Writing an ISO image directly to a USB drive creates installer, live, and recovery media that can boot on another system without unpacking files or building partitions by hand. This is the normal path for distro installers, rescue environments, and firmware update media that ship as ready-to-write images.

Most current distro downloads are hybrid ISO images. They already contain the boot records, partition table, and filesystem layout needed for USB boot, so dd copies the image to the target device as a raw block-for-block write instead of copying files into an existing filesystem.

The write replaces the entire contents of the target device, not just one partition. Confirm the whole-disk device node such as /dev/sdb before starting, and use the vendor's documented writer when the downloaded file is not a hybrid ISO or the release notes require a specific imaging tool.

Steps to create a bootable USB drive from an ISO image on Linux:

  1. List block devices and identify the target USB drive by its size and current mount point.
    $ lsblk --paths --list --output PATH,SIZE,TYPE,MOUNTPOINTS
    PATH       SIZE TYPE MOUNTPOINTS
    /dev/sda    64G disk
    /dev/sda1    1G part /boot/efi
    /dev/sda2   63G part /
    /dev/sdb   7.5G disk
    /dev/sdb1  7.5G part /media/user/LIVEUSB

    Use the whole device such as /dev/sdb in the write command, not a partition such as /dev/sdb1. Writing to the wrong disk destroys its contents.

  2. Confirm that the source file is a bootable ISO image before overwriting the USB drive.
    $ file ~/Downloads/linux-installer.iso
    /home/user/Downloads/linux-installer.iso: ISO 9660 CD-ROM filesystem data (DOS/MBR boot sector) 'alpine-virt 3.23.3 x86_64' (bootable)

    The exact label depends on the downloaded image, but ISO 9660 CD-ROM filesystem data and (bootable) confirm that the file is an ISO image rather than a ZIP archive or another disk format.

  3. Unmount all mounted filesystems on the target USB drive.
    $ sudo umount /dev/sdb*

    Replace /dev/sdb with the device name from lsblk so every mounted filesystem on that drive is released before the write starts.

  4. Write the ISO image to the whole USB device.
    $ sudo dd if=~/Downloads/linux-installer.iso of=/dev/sdb bs=4M conv=fsync status=progress
    16+1 records in
    16+1 records out
    70254592 bytes (70 MB, 67 MiB) copied, 0.0996981 s, 705 MB/s

    bs=4M uses larger blocks, conv=fsync flushes the final write before dd exits, and status=progress shows transfer progress on longer writes.

    Check both the if= and of= values before pressing Enter. The output path must be the whole USB device.

  5. Confirm that the written USB drive now reports the image filesystem and partition table.
    $ sudo blkid /dev/sdb
    /dev/sdb: BLOCK_SIZE="2048" UUID="2026-01-27-21-19-33-00" LABEL="alpine-virt 3.23.3 x86_64" TYPE="iso9660" PTUUID="f7dc9be9" PTTYPE="dos"

    The important part is that the device now reports TYPE=“iso9660” with an image label. If the old layout still appears, unplug and reconnect the USB drive before checking again.

  6. Remove the USB drive only after the shell prompt returns and the device activity light stops blinking.

    The media is ready for the target system boot menu or firmware boot order.