dd
dd copies data from one place to another, a block at a time, and can transform the data as it goes. It is the tool for low-level copying — writing a disk image to a device, extracting an exact byte range out of a file, copying from or to a raw device.
dd [operand]...
$ dd if=disk.img of=/dev/mydisk bs=4M status=progress
How dd is told what to do #
dd does not take options in the usual -x form. It takes operands, each written name=value, in any order. With no if= operand it reads from standard input; with no of= operand it writes to standard output.
The operands #
| Operand | Meaning |
|---|---|
if=FILE | Read input from FILE. |
of=FILE | Write output to FILE. |
bs=BYTES | Read and write BYTES at a time. Sets both the input and output block size at once. |
ibs=BYTES | Input block size (default 512). |
obs=BYTES | Output block size (default 512). |
cbs=BYTES | Conversion block size — used by the block and unblock conversions. |
count=N | Stop after N input blocks, rather than reading to the end. |
skip=N | Skip N input blocks before copying. Also spelled iseek=N. |
seek=N | Skip N output blocks before writing. Also spelled oseek=N. |
conv=LIST | Apply the comma-separated conversions below. |
iflag=LIST | Comma-separated input flags — how the input is opened and read. |
oflag=LIST | Comma-separated output flags — how the output is opened and written. |
status=LEVEL | How much to report: progress (periodic stats while copying), noxfer (final counts only), none (silent). |
A size value accepts a unit suffix (K, M, G, …). So bs=4M is four mebibytes per block.
Conversions (conv=) #
| Value | Effect |
|---|---|
ucase / lcase | Convert the data to upper-case / lower-case. |
swab | Swap every adjacent pair of bytes. |
sync | Pad each input block out to its full size — with zeros, or with spaces alongside block/unblock. |
block / unblock | Convert between newline-terminated lines and fixed-size cbs records. |
sparse | Where an output block is all zeros, seek past it instead of writing it. |
excl | Fail if the output file already exists. |
nocreat | Fail if the output file does not already exist. |
notrunc | Do not truncate the output file when opening it. |
noerror | Continue past read errors instead of stopping. |
fdatasync / fsync | Flush the data — or the data and metadata — to storage before finishing. |
When dd creates the output file — an of= file that does not already exist — the new file needs a security descriptor, and it inherits one from the directory it is created in.
Input and output flags (iflag=, oflag=) #
| Flag | Applies to | Effect |
|---|---|---|
count_bytes | input | Interpret count=N as a number of bytes, not blocks. |
skip_bytes | input | Interpret skip=N as a number of bytes. |
fullblock | input | Wait for a full ibs of data on each read. |
seek_bytes | output | Interpret seek=N as a number of bytes. |
append | output | Open the output in append mode. |
direct | both | Use direct I/O, bypassing the cache. |
dsync / sync | both | Use synchronised I/O — for data, or for data and metadata. |
nonblock | both | Use non-blocking I/O. |
noatime | both | Do not update the file's access time. |
nocache | both | Ask the system to drop the file's cached pages. |
directory | both | Fail unless the file is a directory. |
What dd prints #
Unless status=none is set, dd prints a summary when it finishes:
16+0 records in
16+0 records out
67108864 bytes (67 MB, 64 MiB) copied, 1.234 s, 54.4 MB/s
The records in / records out counts are written complete+partial — full-sized blocks plus any short final block. status=progress prints the last line periodically during a long copy.
Exit status #
| Code | Meaning |
|---|---|
0 | The copy completed. |
1 | The copy failed — a bad operand, an I/O error, or a file that could not be opened. |