On this page
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. |
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. |