Некоторые особенности использования системной утилиты dd и её модифицированных версий. В UNIX системах есть одна очень древняя команда, которая называется dd. Она предназначена для того, чтобы что-то куда-то копировать побайтово. dd (dataset definition) — программа UNIX, предназначенная как для копирования, так и для конвертации файлов. Название унаследовано от оператора DD (Dataset Definition) из языка JCL.
Оглавление
Несколько слов о резервном копировании файлов
Бэкапы (от английского «Backup») – это метод создания запасной копии важной информации на компьютере либо сервере. Его можно проводить ручным способом или автоматическим в соответствии с регулярным расписанием.
Утилитой DD можно воспользоваться для ОС семейства Линукс, ее команды помогают с копированием файлов через определенные операнды. Это одна из наиболее давних утилит, ее бэкапы можно открыть разнообразным софтом. Версия под операционную систему Виндовс отличается меньшим функционалом, чем версия для Линукс. К примеру, в ней отсутствует поддержка конвертации файлоы и использования блочных устройств.
Что такое утилита dd?
Резервное копирование (backup) — создание запасных копий серверов, может быть настроено по регулярному расписанию, а может выполняться однократно в удобный для пользователя момент.
Утилита dd является аналогом одноименной утилиты для Linux систем. Команда dd копирует файл, в соответствии с указанными операндами. Программа генерирует необработанные файлы, которые могут быть прочитаны многими другими программами. dd является самой старой утилитой для создания образов и не обладает некоторыми полезными опциями, но при этом все еще используется. Версия для Windows является урезанной по сравнению с родительской под Linux, например, не поддерживается конвертация данных и нельзя использовать блочные устройства.
Примеры использования dd
Если вы работали с командой dd в Linux, то у вас не возникнет сложностей при её использовании в операционной системе Windows.
Для того чтобы открыть страницу помощи перейдите в каталог с исполняемым файлом, откройте консоль PowerShell и выполните команду:
./dd.exe –list
Чтобы сделать запасную копию вашего жесткого диска используйте следующую команду:
./dd.exe if=<исходный_диск> of=<полное_имя_копии> bs=1440k
Пример создания образа диска f на диск e:
./dd.exe if=\.f: of=e:tempdisk1.img bs=8M
Результат:
rawwrite dd for windows version 0.5. Written by John Newbigin <jn@it.swin.edu.au>This program is covered by the GPL. See copying.txt for details 7279+1 records in 7279+1 records out
- if=/dev/sda – копируем весь жесткий диск sda;
- of=/mnt/backup/sda.img – копируем в /mnt/backup/sda.img, где каталог /mnt/backup точка монтирования диска, на котором будет содержаться образ;
- bs=8M – задаем размер кэша жесткого диска для ускорения процедуры копирования (иначе данные будут сбрасываться малыми порциями по 512 байт).
Примечание: на целевом диске должно быть достаточно места, т.е. не менее того объема, который занимает исходный диск.
Чтобы сделать восстановление вашего жесткого диска из резервной копии используйте следующую команду:
./dd.exe if=<полное_имя_копии> of=<целевой_диск> bs=8M
Например:
./dd.exe if=e:tempdisk1.img of=\.f: bs=8M
Результат:
rawwrite dd for windows version 0.5. Written by John Newbigin <jn@it.swin.edu.au>This program is covered by the GPL. See copying.txt for details 1279+1 records in 1279+1 records out
Создавать резервную копию очень удобно по настроенному расписанию, о том как настроить планировщик Windows читайте в нашей статье. Это позволит автоматизировать создание копий сервера или данных.
Примечание: В рамках нашего сервиса есть услуга резервного копирования серверов, копирование выполняется 1 раз в сутки на территориально удаленный дисковый массив, при этом вам не нужно самостоятельно выполнять настройки резервирования, а сохранность копии не зависит от работоспособности сервера.
</jn@it.swin.edu.au></jn@it.swin.edu.au>
Команда dd
Синтаксис утилиты достаточно необычен, но в то же время очень прост, после того как вы его запомните и привыкнете:
$ dd if=источник_копирования of=место_назначенияпараметры
С помощью параметра if вам нужно указать источник, откуда будут копироваться блоки, это может быть устройство, например, /dev/sda или файл – disk.img. Дальше, с помощью параметра of необходимо задать устройство или файл назначения. Другие параметры имеют такой же синтаксис, как if и of.
Теперь давайте рассмотрим дополнительные параметры:
- bs – указывает сколько байт читать и записывать за один раз;
- cbs – сколько байт нужно записывать за один раз;
- count – скопировать указанное количество блоков, размер одного блока указывается в параметре bs;
- conv – применить фильтры к потоку данных;
- ibs – читать указанное количество байт за раз;
- obs – записывать указанное количество байт за раз;
- seek – пропустить указанное количество байт в начале устройства для чтения;
- skip – пропустить указанное количество байт в начале устройства вывода;
- status – указывает насколько подробным нужно сделать вывод;
- iflag, oflag – позволяет задать дополнительные флаги работы для устройства ввода и вывода, основные из них: nocache, nofollow.
Это были все основные опции, которые вам могут понадобиться. Теперь перейдем ближе к практике и рассмотрим несколько примеров как пользоваться утилитой dd linux.
Почему dd?
Мы выбрали dd как первого соискателя в нашей серии, потому что это очень полезная утилита, имеющая, как вы увидите ниже, множество опций. Это делает ее практически швейцарским армейским ножом в мире Linux.
Как работает команда dd?
Сначала нужно понять как работает команда dd и что она делает. Фактически, это аналог утилиты копирования файлов cp только для блочных данных. Утилита просто переносит по одному блоку данных указанного размера с одного места в другое.
Поскольку в Linux все, в том числе, устройства, считается файлами, вы можете переносить устройства в файлы и наоборот.
С помощью различных опций утилиты можно повлиять на размер блока, а это, в свою очередь, уже влияет на скорость работы программы. Дальше мы рассмотрим основные опции утилиты и ее возможности.
Как загрузить утилиту dd
Скачиваем утилиту DD со специального сайта, ведь это стороннее программное обеспечение, широко доступное для пользователей.
В загруженном архиве будет несколько файлов, запустить утилиту позволит приложение dd.exe.
Синтаксис команды dd
У данной утилиты странный и слегка сложный синтаксис. Несмотря на это, он весьма прост. Пользоваться программой легко, вы быстро запомните алгоритм и привыкнете к нему.
dd if=[что копировать] of=[куда копировать] параметры
С использованием параметра «if» потребуется прописать что копировать (источник). В “of” можно написать файл или устройство, например флешку или HDD диск.
Основные параметры:
- «bs» – количество байт, которые будут читаться и записываться за один раз.
- «cbs» – число байт, записываемых за один раз.
- «count» – число скопированных блоков. Размер блока прописывается в опции «bs».
- «ibs» – чтение определенного числа байт за 1 раз.
- «obs» – записывание определенного числа байт за 1 раз.
- «seek» – пропуск определенного числа байт в самом начале устройства во время чтения.
- «skip» – пропуск определенного числа байт в самом начале при выводе.
- «status» – подробность вывода.
- «iflag», «oflag» – создание дополнительных флагов, которые нужны для ввода или вывода.
- –help – показывает справку.
- –version – показывает информацию о версии утилиты.
Выше описаны наиболее популярные функции, которые могут потребоваться вам при использовании программы dd Linux.
Примеры команды linux dd
Утилита чаще всего применяется для формирования образов DVD- и CD-дисков. Для их сохранения в виде образа iso существуют определенные команды. Чтобы программа не реагировала на ошибки, можно запустить фильтр noerror. Далее создается образ, который в последующем сохраняется на диск.
Чтобы сделать образ, узнаем разметку диска, с помощью dh.
df -h
Сделаем образ раздела /home, файловая разметка /dev/sda6 в каталог /root/home.iso. В качестве аргумента укажем “noerror” – не выдавать ошибки. Также ограничим максимальный размер файла на 4096 байт.
dd if=/dev/sda6 of=/root/home.iso bs=4096 conv=noerror
Таким образом делаются образы жестких дисков, флешек, оптических приводов.
Как видно из примера выше, в каталоге /root появился файл home.iso. В дальнейшем его можно развернуть. Он позволит восстановить испорченную в ходе использования систему, в нашем случае файлы каталога home.
Весьма полезный параметр – «bs». Он в значительной мере влияет на скорость работы самой программы. Этот аргумент дает возможность установить размер блока во время передачи информации. Предварительно задается цифровое значение, где указывается один из модификаторов.
Как было сказано выше, dd Linux позволяет записать информацию на диск или в определенный раздел именно в двоичном виде. В этом случае записываются как нули, так и единицы. Для очистки диска достаточно наполнить его нулями.
Создадим образ диска. Пусть /dev/cdrom1 это наш оптический привод, cdrom.
# dd if=/dev/cdrom1 of=/home/samba/disk/obraz.iso
Программа является практически незаменимым инструментом для эффективной работы системного администратора. С использованием данной программы можно создавать копию всей системы. Команда весьма полезна, имеет множество сфер применения.
Как пользоваться dd?
Обычные пользователи используют команду dd чаще всего для создания образов дисков DVD или CD.
Например, чтобы сохранить образ диска в файл можно использовать такую команду:
$ dd if=/dev/sda of=~/disk.img
В вашей домашней папке будет создан файл с именем disk1.img, который в будущем можно будет развернуть и восстановить испорченную систему.
Чтобы записать образ на жесткий диск или раздел достаточно поменять местами адреса устройств:
$ dd if=/dev/sda of=~/disk.img bs=5M
Следующий параметр — это count. С помощью него можно указать сколько блоков необходимо скопировать.
Например, мы можем создать файл размером 512 мегабайт, заполнив его нулями из /dev/zero или случайными цифрами из /dev/random:
$ sudo dd if=/dev/sda of=mbr.img bs=1b count=1
Использование параметров, управляющих размерами и количеством блоков
Важными параметрами команды dd являются bs (block size) и count. Первый упрвляет размером блока, второй — количеством блоков, подвергающихся обработке. Например, можно выполнить следующую команду
# dd if=/dev/zero of=/dev/null bs=1M count=32768 32768+0 записей считано 32768+0 записей написано скопировано 34359738368 байт (34 GB), 2,35194 c, 14,6 GB/c
дающую представленеие о скорости передачи данных “процессор-память”.
Другое, более полезное применение параметров изменения размера и количества блоков — создание образа MBR (Master Boot Record):
dd if=/dev/sda of=/home/user/archive/MBR.image bs=512 count=1
С помощью dd можно также при необходимости тестировать и анализировать производительность жёсткого диска при выполнении операций последовательного чтения/записи с блоками заданного размера, например, с блокми по 1024 байта
dd if=/dev/zero bs=1024 count=1000000 of=/home/user/tmp/1Gb.file dd if=/home/user/tmp/1Gb.file bs=64k | dd of=/dev/null
Параметры пропуска блоков
Когда необходимо игнорировать некоторые данные из входного файла и не переносить их в выходной файл, на помощь приходит параметр skip, который позволяет пропустить заданное количество блоков перед началом копирования (даже на устройствах, на которых невозможна операция seek</strong>; при этом “пропускаемые” блоки считываются, но никак не используются).
Например, информацию в BIOS, располагающууюся по адресам с C:0000 по F:FFFF можно просмотреть следующим образом:
dd if=/dev/mem bs=1k skip=768 count=256 2>/dev/null | strings -n 8
А вот пример преобразования файла образа диска, созданного программой Nero (Nero Image File) в обычный ISO-формат (команда просто удаляет 300-килобайтный заголовок при записи нового образа):
dd if=nero_image.nrg bs=1k skip=300 of=image.iso
Параметр seek позволяет пропускать заданное количество блоков в выходном файле. Это может оказаться полезным при “склейке” большого файла, который может быть считан лишь фрагментарно (то есть, не всё содержимое можно получить за одну операцию чтения). Хороший пример подобного применения параметра seek приведён в википедии. Иногда необходимо зараезервировать свободное место в начале выходного файла или имитировать “большой” файл. В этом случае также помогает seek:
dd if=small.file seek=100 of=pseudo_big.file
Параметр conv в данной статье не рассматривается в подробностях, а упомянут он здесь лишь для того, чтобы отметить один из его аргументов, noerror — продолжать после ошибок чтения. Дело в том, что при указании conv=noerror при наличии слишком большого количества ошибок во входных файлах (на устройствах) возникают затруднения и даже потенциальные опасности для оборудования при выполнении команды dd.
Утилита dd_rescue
Программа dd_rescue выполняет те же задачи, что и dd, но делает это более эффективно и с меньшим риском. В общем виде её выполнение выглядит так:
dd_rescue /dev/sda1 local_sda1.img
Следует обратить внимание на то, что здесь не используется формат параметров dd, то есть части “if=” и “of=” не нужны. По умолчанию dd_rescue копирует стандартный ввод в стандартный вывод, то есть, так же, как и dd, является фильтром и может участвовать в конвейерах команд:
dd_rescue /dev/sda1 – | bzip2 > /dir/local_sda1.img.bz2
Ещё один пример, с передачей файла образа раздела диска по сети:
dd_rescue /dev/sda1 – | ssh user@remote.host “cat – > /remote/destination/my_sda1.img”
В целом операции и действия похожи на dd. Но главным отличием dd_rescue от dd является то, что эта утилита не прекращает работу при возникновении ошибок и не пытается выполнять чтение (или запись) с ошибкой до бесконечности, а обрабатывает возникающие ошибки наилучшим возможным в конкретной ситуации образом. Здесь можно определить обнуление “плохого” блока после определённого количества попыток чтения/записи, фиксацию номеров “плохих” блоков в log-файле и запись либо отказ от записи блоков, обнулённых при ошибках. Такой подход делает программу весьма полезной при извлечении данных с устройств, при чтении которых возникает слишком много ошибок ввода/вывода.
Описание всех ключей можно получить, выполнив команду dd_rescue -h.
Чтение и запись файлов и устройств
В предыдущем примере мы вводили текст в stdin (стандартный поток ввода). Однако, всегда можно использовать входные и выходные файлы. Чтобы указать имена входного и выходного файла, используются опции if и of, соответственно. Например, если вам нужно перевести в верхний регистр текст из файла file1 и записать его в файл file2, можно выполнить следующую команду:
dd if=file1 of=file2 conv=ucase
Командой dd также можно создавать файлы различных объемов, например для тестов. Следующая команда создаст файл объемом 1 ГБ заполненный случайными данными
dd if=/dev/urandom of=bigfile bs=1M count=1000
Или файл заполненный нулями
dd if=/dev/null of=bigfile bs=1M count=1000
В качестве аргументов можно указывать не только файлы, но и блочные устройства. А так как команда именно дублирует данные, а не копирует их по файлам, это открывает огромные возможности для резервного копирования и создания образов дисков.
Например, следующая команда полностью копирует диск /dev/sda на диск /dev/sdb:
dd if=/dev/sda of=/dev/sdb bs=4096 conv=noerror,sync
Аргумент noerror опции conv позволяет программе продолжать копирование даже при наличии ошибок, а sync задаёт использование синхронизированного ввода/вывода. Размер блока должен быть кратным 1 Кб (1024 байта), а выходной диск равен по объему входному или больше.
Аналогично можно создать образ CD или DVD, вместе с загрузочным сектором:
dd if=/dev/cdrom of=/mycd.iso
Опция -o loop команды mount позволяет смонтировать файл как обычное устройство. Так можно подключить созданный образ:
mount -o loop /mycd.iso /mnt/cd
Сокращение вывода в stderr
Можно ограничить объём информации, выводимой в поток stderr, при помощи опции status. Например, если требуется сообщать только об ошибках, нужно указать эту опцию с аргументом none:
dd if=file1 of=file3 status=none
Другие возможные значения — noxfer, исключающее вывод конечной статистики, и progress, исключающее вывод текущей статистики.
Действия с выходными файлами
Чтобы команда работала только в том случае, если выходного файла ещё не существует, в качестве аргумента опции conv можно указать значение excl.
dd if=file1 of=file3 conv=excl
По умолчанию dd перезаписывает выходной файл, если он уже существует. Если требуется обновление с записью в конец файла, укажите значение append для опции oflag и значение notrunc для опции conv, например:
dd if=file1 of=file2 oflag=append conv=notrunc
При необходимости можно также отключить создание выходного файла, если такого файла не существует. Для этого используется аргумент nocreat опции conv:
dd if=file1 of=file10 oflag=append conv=nocreat
Изменение регистра текста
Наиболее простой пример, на котором можно рассмотреть работу команды — скопировать текст с заменой регистра символов (большие буквы вместо маленьких или наоборот).
Допустим, у вас есть несколько строк текста, написанного в нижнем регистре, а вам нужно перевести его в верхний регистр. Для этого можно воспользоваться опцией conv с аргументом ucase:
dd conv=ucase
Здесь мы видим команду и введённый текст. Чтобы показать dd, что ввод текста завершён, мы воспользовались комбинацией клавиш Ctrl+D, и команда вывела следующий результат:
Введённый текст был переведён в верхний регистр, последние три строки — это статистика операции. Аналогичным образом можно перевести текст в нижний регистр.
Пропуск части входных данных
При необходимости можно задать команде пропустить несколько начальных байтов входных данных. Это осуществляется при помощи опции skip с целочисленным аргументом. Например, если значение этого аргумента N, то dd пропустит N блоков размера ibs. Это ещё одна опция команды, которая определяет число байтов, считываемых за раз (по умолчанию 512).
Если вам требуется пропустить первые 4 байта входного файла, нужно задать ibs равным 4, а аргумент skip равным 1. Таким образом при чтении файла команда пропустит один блок размером 4 байта.
dd if=file1 of=file2 ibs=4 skip=1
Сравним файлы командой grep
grep -v -f file1 file2
Видно, что часть текста при считывании файла file1 были пропущены, поэтому в файле file2 их нет.
Утилита dcfldd
Программа dcfldd является дальнейшим развитием клона dd с расширенной функциональностью и множеством дополнительных параметров, краткое описание которых можно получить с помощью команды dcfldd –help. В дополнение к типовым операциям dd утилита dcfldd может выполнять следующие действия: хэширование копируемых данных “на лету”, разделять вывод данных в несколько различных файлов, осуществлять проверку соответствия создаваемого образа оргинальному устройству “бит-в-бит”. Кроме того, dcfldd выводит индикатор прогресса выполняемой работы, фиксирует свои действия в log-файле и, разумеется, может быть составной частью конвейера, как и положено члену семейства dd.
Типичный пример использования программы dcfldd на первый взгляд может показаться несколько ошеломляющим, но при проходе по каждому параметру всё становится гораздо проще:
dcfldd if=/dev/sdb4 hash=md5,sha256 hashwindow=10G md5log=md5.txt sha256log=sha256.txt hashconv=after bs=512 conv=noerror,sync split=10G splitformat=aa of=sdb4image.dd
Здесь считываются 10 Гб данных с устройства /dev/sdb4, и эти данные записываются в файл sdb4image.dd.aa. При этом также вычисляется MD5-хэш и sha256-хэш для копируемого фрагмента данных. Затем считываются следующие 10 Гб данных и записываются в файл sdb4image.dd.ab и т.д. Вычисленные хэши сохраняются в файлах md5.txt и sha256.txt соответственно. Само вычисление хэш-сумм выполняется после всех прочих преобразований. Размеры блока хэширования и блока, записываемого в выходные файлы (различные), совпадают. Размер блока копирования 512 байтов. После ошибок чтения выполнение команды не прерывается, по умолчанию dcfldd записывает в такие блоки нули.
Заключение
Утилита dd и её более усовершенствованные версии представляют собой весьма удобный инструмент для решения определённого круга задач, к которым можно отнести копирование и клонирование файлов и разделов устройств, формирование образов дисков и разделов, создание резервных копий, просмотр обычных и бинарных файлов, а также тестирование и анализ производительности устройств.
[spoiler title=”Источники”]- https://serverspace.by/support/help/dd-utility-for-windows-backup/
- https://1cloud.ru/help/windows/rezervnoe-kopirovanie-windows-utilita-dd
- https://losst.ru/komanda-dd-linux
- http://rus-linux.net/MyLDP/consol/dd.html
- https://j4web.ru/linux/komanda-dd.html
- https://www.vseprolinux.ru/dd-linux
- https://www.ibm.com/developerworks/ru/library/os-dd_util/index.html
- https://www.ibm.com/developerworks/ru/library/os-dd_util/
- https://ITProffi.ru/komanda-dd-v-linux/