dd (Русский)
dd — это основная утилита, основной задачей которой является конвертация и копирование файлов.
Как и cp, по умолчанию dd делает точную копию файла, но позволяет контролировать параметры ввода-вывода на низком уровне.
Подробности можно почитать в dd(1) или полной документации.
status=progress
.Установка
dd входит в состав GNU . Другие утилиты из этого пакета описаны в статье Основные утилиты.
Клонирование диска и восстановление
Команда dd — это простой, но универсальный и мощный инструмент. Она может использоваться для копирования, блок за блоком, независимо от типа файловой системы или операционной системы. Нередко dd используется в LiveCD.
Клонирование раздела
Копирование раздела 1 на диске в раздел 1 на диске :
# dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync status=progress
sdb1
). Если он не существует, то dd создаст новый файл, который будет занимать место в вашей файловой системе.Клонирование всего диска
Копирование физического диска в диск :
# dd if=/dev/sda of=/dev/sdb bs=64K conv=noerror,sync status=progress
Эта команда скопирует диск целиком, в том числе таблицу разделов, загрузчик, разделы, UUID и данные.
bs=
устанавливает размер блока. По умолчанию 512 байт, что является «классическим» размером блока для жёстких дисков с начала 1980-х годов, но не самым удобным. Используйте большее значение, 64K или 128K. Также прочитайте предупреждение ниже, потому что это не просто «размер блока» — это также влияет на обработку ошибок чтения. Смотрите и для получения подробной информации и определения наилучшего значения bs для вашего случая.- указывает dd продолжить работу, игнорируя все ошибки чтения. По умолчанию dd прекращает работу при любой ошибке.
- заполняет входные блоки нулями, если были ошибки чтения, чтобы смещения данных оставались правильными.
- показывает статистику передачи данных, которая позволяет оценить время завершения.
Утилита dd технически имеет «размер входного блока» (IBS) и «размер выходного блока» (OBS). Когда вы устанавливаете , вы фактически устанавливаете и IBS, и OBS. Обычно, если размер блока, скажем, 1 МиБ, dd считывает 1024×1024 байт и записывает столько же байт. Но если произойдет ошибка чтения, всё пойдет не так. Многие думают, что dd «заполнит ошибки чтения нулями», если вы используете опции , но это не так. dd, согласно документации, дополнит размер OBS до размера IBS после завершения чтения, что означает добавление нулей в конце блока. То есть, весь 1 МиБ будет испорчен из-за одной ошибки чтения в 512 байт в начале чтения: 12ERROR89 станет 128900000 вместо 120000089.
Если вы уверены, что ваш диск не содержит ошибок, вы можете использовать больший размер блока, что увеличит скорость копирования в несколько раз. Например, изменение bs с 512 до 64K изменило скорость копирования с 35 МБ/с до 120 МБ/с на простой системе Celeron 2,7 ГГц. Но имейте в виду, что ошибки чтения на исходном диске будут в конечном итоге выглядеть как ошибки блоков на целевом диске, то есть одна ошибка чтения 512 байт испортит весь выходной блок размером 64 КиБ.
Резервное копирование таблицы разделов
Смотрите fdisk (Русский)#Резервное копирование и восстановление таблицы разделов или GPT fdisk (Русский)#Резервное копирование и восстановление таблицы разделов.
Создание образа диска
Загрузитесь в LiveCD и убедитесь, что разделы исходного диска не примонтированы.
Затем смонтируйте целевой диск и запишите на него резервную копию:
# dd if=/dev/sda conv=sync,noerror bs=64K | gzip -c > /путь/к/копии.img.gz
При необходимости (например, если результирующие файлы будут храниться в файловой системе FAT32) можно разделить образ диска на несколько частей (смотрите также ):
# dd if=/dev/sda conv=sync,noerror bs=64K | gzip -c | split -a3 -b2G - /путь/к/копии.img.gz
Если не хватает свободного места на локальном диске, можно отправить образ через ssh:
# dd if=/dev/sda conv=sync,noerror bs=64K | gzip -c | ssh user@local dd of=копия.img.gz
Наконец, сохраните дополнительную информацию о геометрии диска, необходимую для интерпретации таблицы разделов, хранящейся в образе. Наиболее важной из них является размер цилиндра.
# fdisk -l /dev/sda > /путь/к/list_fdisk.info
bs=
), равный объёму кэша на диске, с которого выполняется копирование. Например, bs=8192K
подходит для кэша 8 МиБ. Упомянутые в этой статье 64 КиБ лучше, чем стандартные bs=512
байт, но при большем bs=
копирование будет ещё быстрее.Восстановление системы
Чтобы восстановиться из такой резервной копии:
# gunzip -c /путь/к/копии.img.gz | dd of=/dev/sda
Если образ был разделён на несколько частей командой split, используйте другую команду (обратите внимание на звёздочку):
# cat /путь/к/копии.img.gz* | gunzip -c | dd of=/dev/sda
Патчинг бинарных файлов
Если нужно заменить заменить три байта по смещению 0x123AB
, это можно сделать с помощью такой команды:
# printf '\xff\xc0\x14' | dd seek=$((0x123AB)) conv=notrunc bs=1 of=/путь/к/файлу
Резервное копирование и восстановление MBR
Перед внесением изменений на диск можно создать резервную копию таблицы разделов и схемы разделов диска. Также можно использовать резервную копию для копирования одной и той же схемы разделов на несколько дисков.
MBR хранится в первых 512 байтах диска. Она состоит из 4 частей:
- Первые 440 байт содержат загрузочный код (загрузчик).
- Следующие 6 байт содержат сигнатуру диска.
- Следующие 64 байта содержат таблицу разделов (4 записи по 16 байт каждая, по одной записи на каждый основной раздел).
- Последние 2 байта содержат сигнатуру загрузки.
Сохранение MBR в :
# dd if=/dev/sdX of=/путь/к/mbr_file.img bs=512 count=1
Также можно извлечь MBR из полного образа диска dd:
# dd if=/путь/к/образу.img of=/путь/к/mbr_file.img bs=512 count=1
Для восстановления (будьте осторожны, это уничтожит существующую таблицу разделов, а вместе с ней и доступ ко всем данным на диске):
# dd if=/путь/к/mbr_file.img of=/dev/sdX bs=512 count=1
Если вы хотите восстановить только загрузчик, но не информацию о разделах, просто восстановите первые 440 байт MBR:
# dd if=/путь/к/mbr_file.img of=/dev/sdX bs=440 count=1
Восстановление только таблицы разделов без затрагивания загрузчика и сигнатуры:
# dd if=/путь/к/mbr_file.img of=/dev/sdX bs=1 skip=446 count=64
Удаление загрузчика
Чтобы стереть загрузочный код MBR (может быть полезно, если вам нужно сделать полную переустановку другой операционной системы), можно обнулить первые 440 байт:
# dd if=/dev/zero of=/dev/sdX bs=440 count=1
Решение проблем
Partial read
Файлы, созданные с помощью dd, могут иметь меньший размер, чем запрошено, если полный входной блок недоступен и системный вызов завершается раньше времени. Это может произойти при чтении из или при чтении с и недостаточной энтропии, или с при чтении более 32 МиБ.
Возможно, но не гарантировано, что dd предупредит вас об этой проблеме:
dd: warning: partial read (X bytes); suggest iflag=fullblock
Решается это так, как и предлагает предупреждение: добавлением iflag=fullblock
к команде dd:
$ dd if=/dev/random of=bigsecret.img bs=1K count=1 iflag=fullblock $ dd if=/dev/urandom of=bigsecret.img bs=40M count=1 iflag=fullblock
Для также можно задать большее число копируемых блоков:
$ dd if=/dev/urandom of=bigsecret.img bs=1M count=40
При чтении из pipe альтернативой для для iflag=fullblock
может быть прописывние для значения , которое определено в . Например:
$ cat input.img | dd of=output.img bs=4k count=100