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=LEVEL | none — молчать; 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