Bootable USB from the Terminal#
A bootable USB stick from an ISO — no extra tooling, just lsblk, umount and dd. The
example writes a Debian netinst installer, but the steps are the same for any hybrid ISO. For
what each command actually does, see lsblk, umount, dd, sync.
dddoes not ask and has no undo. The wrong device name overwrites your system disk. Check the target twice before running it.
Identify the device#
lsblk -o NAME,SIZE,MODEL,TRAN,MOUNTPOINTSExample output:
NAME SIZE MODEL TRAN MOUNTPOINTS nvme0n1 1.8T Samsung SSD ├─nvme0n1p1 1G /boot └─nvme0n1p2 1.8T / sdb 28.7G SanDisk Ultra usb └─sdb1 28.7G /run/media/xander/USBTRAN usb, the matching size and the model name identify the stick — here/dev/sdb.Unmount the partition#
sudo umount /dev/sdb1Only the mounted partition has to go; the device itself is never mounted.
Write the ISO#
sudo dd \ if="$HOME/Downloads/debian-13.6.0-amd64-netinst.iso" \ of=/dev/sdb \ bs=4M \ status=progress \ conv=fsyncAdjust the ISO filename if needed. This gives you the exact name:
ls -lh ~/Downloads/debian*.isoFlush the buffers#
syncOnly now is everything actually on the stick and safe to unplug.
Whole device, not the partition#
correct: /dev/sdb
wrong: /dev/sdb1Debian explicitly states that the ISO must be written to the complete drive, not to a single partition. A hybrid ISO carries its own partition table — write it inside an existing partition and the stick has no boot sector.
The dd options#
| Option | Meaning |
|---|---|
if= | input file, the ISO |
of= | output file, the block device |
bs=4M | block size; without it dd copies in 512-byte chunks and takes forever |
status=progress | progress output instead of silence |
conv=fsync | flushes buffers to the device before exiting |
conv=fsynctechnically makes the trailingsyncredundant. It costs nothing and still helps if the ISO was written without that option.