Using dd
for Precise ISO-to-USB Imaging on Linux and macOS
For engineers seeking deterministic, byte-exact USB provisioning—especially in deployment automation, recovery media preparation, or firmware work—the dd
utility is foundational. Skipping the GUI "safety rails" exposes sharp edges but provides unmatched control and predictability.
The Problem
Graphical tools like Rufus or Balena Etcher often obscure error states and limit performance tuning. In CI scripts, headless setups, or hardened environments, only dd
and its careful use reliably accomplish the write-once-assume-nothing requirement of system image creation.
Device Identification and Risk Management
Critical: Make certain you have the device path correct before writing. An incorrect value (e.g., /dev/sda
instead of /dev/sdb
) will irremediably overwrite data.
On Linux:
lsblk -o NAME,SIZE,FSTYPE,LABEL,MOUNTPOINT
On macOS:
diskutil list
Verify the device by comparing size and, if possible, by detaching/re-inserting the USB stick and noting which device reappears. Avoid writing to devices with existing data structures you want to preserve.
Preparatory Unmount
dd
operates at the block level. Active mountpoints block writes or cause corruption.
Linux—unmount each partition attached to the USB device:
sudo umount /dev/sdc1
sudo umount /dev/sdc2 # Repeat as needed
macOS—detach the entire disk:
diskutil unmountDisk /dev/disk2
Note: umount
will fail if the partition is in use. Check with lsof
or fuser
if needed.
The Imaging Command: Usage and Adjustments
A canonical dd
invocation (Linux, kernel ≥4.6 for progress):
sudo dd if=/home/admin/custom.img of=/dev/sdc bs=4M status=progress conv=fsync
if=
: Input file (your ISO or raw image).of=
: Output device. Use the device, not a partition (e.g.,/dev/sdc
, not/dev/sdc1
).bs=4M
: Empirically, block size ≥4MiB maximizes throughput on USB 3.0 media—lower for USB 2.0 if needed.status=progress
: Displays real-time byte counts. If unavailable, usekill -USR1 $(pidof dd)
from another shell (sends info to stderr).conv=fsync
: Forces OS to flush buffers; prevents premature command completion before hardware writeback.
Walkthrough: Imaging Ubuntu 22.04 ISO
Suppose the source ISO is at /var/tmp/ubuntu-22.04.iso
and the destination USB stick is /dev/sdd
. These systems are running Ubuntu 20.04+ and macOS Ventura (13.6).
- Double-check device mapping:
lsblk | grep -A2 sdd
- Unmount all mounted partitions for
/dev/sdd
. - Write image:
sudo dd if=/var/tmp/ubuntu-22.04.iso of=/dev/sdd bs=4M status=progress conv=fsync
- You may see output like:
311296000 bytes (311 MB, 297 MiB) copied, 10 s, 31.1 MB/s
- You may see output like:
- Once complete:
- Linux:
sudo eject /dev/sdd
- macOS:
diskutil eject /dev/disk2
eject
reports “not found”—the device may already be safe to remove, but wait for drive activity LEDs to cease. - Linux:
Handling Limitations and Workarounds
- Read-only ISOs: Some hybrid ISOs (Fedora, Debian Live) require post-write tweaks (partition table fix-ups). Not all bootloaders are equally tolerant of
dd
-imaged sticks. - USB controller quirks: In rare cases, a drive may not report eject events until a power cycle. Unplug only when OS confirms write completion and device sync.
- Non-linear progress:
dd
may appear stalled—USB sticks often pause for internal wear management. Unless the system logs I/O errors (dmesg
), wait it out.
Verifying the Result
A full verification uses checksums, but matching device contents to the ISO is non-trivial unless the image is a pure bitstream (no hidden random partitions, no boot sector magic). Experienced engineers usually combine:
- Boot test on a real or virtual machine (
qemu -usbdevice disk:file=...
) - Selective block checks; e.g.:
(sudo cmp --n=1048576 /var/tmp/ubuntu-22.04.iso /dev/sdd
cmp
will exit nonzero if the first 1MiB differs.)
Caution: Full device read can wear out cheap USB media.
Alternatives, Edge Cases, and Non-Obvious Pitfalls
cp
is not a drop-in replacement: On character/block devices, it doesn’t handle direct I/O properly; possible incomplete writes or buffer confusion.- Write speed and blocksize: Higher (
bs=16M
orbs=32M
) can boost USB 3.1 performance; some sticks throw I/O errors abovebs=8M
. - Image tweaking: Patching ISOs to update scripts before imaging is common—mount, edit, unmount, re-
dd
. - Read errors:
Indicates mismatched device size. Always comparedd: error writing '/dev/sdc': No space left on device
lsblk
output with ISO size (stat -c %s file.iso
).
Closing Note
dd
lacks safety guards—its effectiveness is due to, not despite, this property. For repeatable infrastructure, robust automation, or bootstrapping bare-metal servers, nothing is more direct. But: trust, then verify. Test your drives, document your device mapping, and accept that occasional batch failures will force further refinement.
Gotchas remain: some UEFI-only ISOs need extra steps, and USB 3.0 hubs can introduce silent failures. Experiment, validate, and refine as hardware evolves. In production pipelines, integrate verification steps, log raw output, and rotate USB sticks to avoid silent corruption from media fatigue.
No GUI will ever match the precise, transparent control of dd
in the hands of a careful engineer.