← Весь справочник

dd

Побайтовое копирование блоками — файлы заданного размера, вырезка байтов, образы дисков

dd копирует данные из одного места в другое блоками заданного размера и умеет пропускать блоки на входе и выходе. Отсюда применения: создать файл нужного размера из /dev/zero или /dev/urandom, вырезать кусок файла по смещению, записать байты в середину файла, снять или записать образ диска. В песочнице — GNU coreutils 9.4.

Синтаксис

dd if=вход of=выход bs=размер_блока count=сколько_блоков [операнды…]

Операнды пишутся как имя=значение, без дефисов. Без if= читается stdin, без of= пишется stdout. Отчёт (records in/out, скорость) идёт в stderr.

Операнды

ОперандЧто делает
if=файлоткуда читать (файл, устройство, /dev/zero, /dev/urandom)
of=файлкуда писать. Существующий файл по умолчанию обрезается
bs=Nразмер блока для чтения и записи сразу (по умолчанию 512 байт)
ibs=N / obs=Nразмер блока отдельно для чтения / записи
count=Nскопировать только N входных блоков
skip=N (iseek=N)пропустить N блоков на входе (размером ibs)
seek=N (oseek=N)пропустить N блоков на выходе (размером obs) — писать с этого места
conv=списокпреобразования через запятую (таблица ниже)
iflag= / oflag=флаги чтения / записи через запятую
status=LEVELnone — молчать; noxfer — без итоговой строки со скоростью; progress — показывать прогресс по ходу

Суффиксы чисел: c = 1, w = 2, b = 512, K/M/G — степени 1024, kB/MB/GB — степени 1000. Можно перемножать: bs=1x2K = 2048.

conv=

ЗначениеЧто делает
notruncне обрезать выходной файл — нужно, чтобы переписать кусок внутри файла
fsync / fdatasyncсбросить данные на диск перед завершением (честное время для замеров)
sparseвместо записи блоков из нулей делать «дыры»
exclошибка, если выходной файл уже есть
nocreatне создавать выходной файл
noerrorне останавливаться на ошибках чтения (битый диск); обычно вместе с sync
syncдополнять каждый входной блок нулями до ibs
ucase / lcaseперевести в верхний / нижний регистр
swabпоменять местами байты в каждой паре

iflag= / oflag=

ФлагЧто делает
fullblock (iflag)дочитывать блок до полного размера — обязательно при чтении из канала
skip_bytes / count_bytes (iflag)считать skip= и count= в байтах, а не в блоках
seek_bytes (oflag)считать seek= в байтах
append (oflag)дописывать в конец (вместе с conv=notrunc)
directпрямой ввод-вывод в обход кеша
sync / dsyncсинхронная запись каждого блока
nofollowне открывать символические ссылки

Отчёт

10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0137 s, 767 MB/s

10+0 — 10 полных блоков и 0 неполных. 0+2 означает, что блоки читались «огрызками» — признак чтения из канала без iflag=fullblock.

Примеры

# файл ровно 10 МиБ из нулей
dd if=/dev/zero of=zero.bin bs=1M count=10

# 4 КиБ случайных данных, без отчёта
dd if=/dev/urandom of=random.bin bs=1K count=4 status=none

# разреженный файл 100 МиБ без записи данных (как truncate -s)
dd if=/dev/zero of=sparse.img bs=1 count=0 seek=100M

# байты с 3-го по 7-й (смещение 3, длина 5)
printf '0123456789ABCDEF' > s.txt
dd if=s.txt iflag=skip_bytes,count_bytes skip=3 count=5 status=none   # 34567

# второй блок по 4 байта
dd if=s.txt bs=4 skip=1 count=1 status=none   # 4567

# переписать 2 байта со смещения 2, не обрезая файл
printf 'XY' | dd of=s.txt bs=1 seek=2 conv=notrunc status=none   # 01XY456789ABCDEF

# первые 512 байт диска/образа (MBR) в файл
dd if=disk.img of=mbr.bin bs=512 count=1

# из канала — только с fullblock, иначе размер будет меньше
cat /dev/urandom | dd of=r.bin bs=1M count=2 iflag=fullblock

# грубый замер скорости записи на диск
dd if=/dev/zero of=test.bin bs=1M count=100 conv=fsync

# записать образ на флешку с прогрессом (сначала проверь имя устройства!)
dd if=image.iso of=/dev/sdX bs=4M status=progress conv=fsync

Подводные камни

  • of= перепутан с if= или указан не тот диск — данные затёрты без вопросов и без корзины. Перед записью на устройство проверь его через lsblk.
  • Без conv=notrunc файл обрезается. printf 'XY' | dd of=f bs=1 seek=2 оставит в файле 4 байта (01XY), а не заменит 2 байта в середине.
  • Чтение из канала без iflag=fullblock. cat /dev/urandom | dd bs=1M count=2 запишет не 2 МиБ, а сколько успело прийти за два чтения (в песочнице — 128 КиБ) и предупредит «partial read».
  • skip и seek — в блоках, а не в байтах. bs=1M skip=3 пропускает 3 МиБ. Для байтов — iflag=skip_bytes / oflag=seek_bytes или bs=1 (очень медленно на больших объёмах).
  • bs по умолчанию — 512 байт: без bs= копирование большого файла идёт заметно медленнее. Разумно bs=1M–4M.
  • Отчёт — в stderr. dd … > log его не поймает; используй 2> log или status=none.
  • Без conv=fsync скорость завышена: данные ещё в кеше, а не на диске.
  • Для файла нужного размера быстрее truncate или fallocate; head -c 1M /dev/zero > f — проще, если dd не нужен.

См. также

truncate · split · xxd · head-tail · checksums · filesystems · df-du