Рубріки: Теория

Утилита dd в Linux

Денис Бородовский

Утилита dd — это программа Unix, утилита командной строки, которую в Linux используют для низкоуровневого копирования и конвертации файлов. Функции утилиты на самом деле значительно шире и об этом мы более детально расскажем в статье ниже.

Содержание:
1. Назначение команды dd
2. Дисклеймер: работайте осторожно
3. Стандартный синтаксис команды dd
4. Параметры для работы с командой dd
5. Параметры для iflag, oflag
6. Примеры использования dd
В Заключение

1. Назначение команды dd

Мы упоминали, что основная задача dd — обработка файлов. Но в Linux все устройства, порты, оперативная память и память с кодом процессов отображаются как файлы, а это значит, что над ними можно проводить операции в dd. Еще утилита позволяет осуществлять выборочное копирование файлов с диска.

Например, переместить фрагмент файла определенного размера или пропустить несколько гигабайт. Эта функция также помогает считать файлы с поврежденного носителя, изменить расположение байтов в файле, создавать файлы фиксированного размера. Кроме этого в dd можно создать дополнительную копию загрузочного сектора жесткого диска или прочитать блоки из системных файлов.

2. Дисклеймер: работайте осторожно

Разработчики задумывали, что название dd должно отсылать к аббревиатуре языка Job Control Language (JCL), который использовала IBM. В этом языке оператор dd расшифровывался как «Доступ к данным» (Data Access). Работая с утилитой, помните, что при передаче некорректных аргументов, часть или все данные диска могут быть потеряны.

Поэтому крайне важно корректно указывать адреса и имена целевых файлов. В связи с этим dd имеет несколько ироничных расшифровок-прозвищ, таких как data destroyer, «добей диск» и delete data. Но инструмент продолжают применять из-за его мощности, надежности и простоты в использовании.

При работе с dd рекомендуется использовать Live-режим Linux, то есть запускать систему без установки на компьютер, например с USB-носителя. Live-режим работает медленнее из-за копирования каждого байта, даже с неиспользуемого пространства.

Обратите внимание, что dd не отличает занятое и свободное дисковое пространство и копирует все. Поэтому жесткий диск, на который переносятся данные должен быть не меньшим, чем клонируемый.

3. Стандартный синтаксис команды dd

Обычно синтаксис конда состоит из трех команд:

  • Команда if

Обозначает путь к файлу откуда будут взяты данные. Может быть как обычным файлом, так и файлом устройства.

  • Команда of

Указывает куда будут копироваться данные. Сохранять файлы также можно как в обычные, так и в системные файлы.

  • Другие параметры использования.

4. Параметры для работы с командой dd

В dd довольно большой набор дополнительных параметров для конфигурации настроек. Мы рассмотрим основные из них:

  • bs — Установить размер блока (block size), который система будет считывать. Оптимально использовать 4–8 MB;
  • cbs — Установить, сколько байт нужно записывать за один раз;
  • count — Выбрать определенное число блоков для копирования. А чтобы обозначить их размер, подключают bs-опцию.
  • ibs — обозначить сколько байт нужно считать за раз. По умолчанию — 512 байт.
  • obs — Обозначить сколько байт нужно записать за раз. По умолчанию — 512 байт.
  • seek — Пропустить определенное количество байт в начале вывода;
  • skip — Пропустить определенное количество байт в начале ввода;
  • conv — Параметр, чтобы преобразовать файл. Параметр conv имеет собственные параметры. С их помощью, например, можно конвертировать систему кодов ASCII в EBCDIC и наоборот. В таблице указаны основные способы конвертации файлов.
Параметр Действие
lcase Заменить буквы верхнего регистра на нижний
uncase Заменить буквы нижнего регистра на верхний
nocreate Не создавать выходной файл
noeror Игнорировать ошибки ввода-вывода
swab Поменять местами каждую пару байтов ввода
fdatasync Записывает данные выходного файла до окончания процесса
fsync Аналогично fdatasync, но еще записываются метаданные
notrunc Не обрезать выходной файл

5. Параметры для iflag, oflag

Также отдельно стоит рассмотреть параметры iflag и oflag. Они позволяют задать дополнительные флаги: iflag — для устройств ввода, а oflag — для вывода.

Наиболее популярные флаги:

  • append — режим дописывания данных в файл. Append применяют только для вывода. Когда вы объедините этот флаг с конструкцией “of=файл”, нужно еще указать параметр “conv=notrunc”, чтобы выходной файл не был обрезан из-за добавления новых данных.
  • direct — режим обработки данных в обход кэша. Этот флаг повышает скорость.
  • dsync — запись данных с синхронизацией. Этот флаг повышает надежность.
  • sync — так же как и dsync, но и с метаданными.
  • directory — выдавать ошибку, при использовании каталога.
  • fullblock — чтение только полных блоков. Применяется только для iflag.
  • noatime — не обновляет время доступа к элементам файловой системы. Флаг повышает скорость.
  • nofollow — запрет на переход по символическим ссылкам.

6. Примеры использования dd

Передача образа Linux на флешку

Для записи образа диска на флешку, сначала нужно узнать, как она называется в системе. Для этого ее необходимо отключить и выполнить команду sudo fdisk -l. Флешки и жесткие диски находятся в каталоге /dev. Они подключаются по алфавиту sda, sdb, sdc

Имя sda обозначает жесткий диск, поэтому флешка будет называться sdb или sdc. Далее с помощью команды mount добавляем внешний USB-накопитель в систему Linux.

sudo mount /dev/sdc1 /mnt/usb

Дальше нужно определить куда записывать данные: на раздел флешки или на саму флешку. В случае ISO-образа нужно писать на раздел. Если образ диска типа img, то непосредственно на флешку.

Обычно это выглядит так:

sudo dd if=~/путь/к/образу/диска.iso of=/dev/sdb1 

В случае записи Linux на флешку, а не на раздел, единицу после имени указывать не нужно. Также после этого этапа обязательно нужно выполнить команду sync, чтобы не потерять часть данных, так как dd завершает работу раньше чем данные записаны на флешку.

Клонирование диска

Скопировать данные можно как и с всего устройства, так и с отдельного диска. Примерный код перемещения жесткого диска (sda) на внешнее устройство sdb1 будет выглядеть так:

sudo dd if=/dev/sda of=/dev/sdb1 bs=64K conv=noerror,sync

То есть здесь мы вначале установили размер блока, командой noerror дали инструкцию продолжать запись и при этом не замечать ошибки при чтении, а sync указывает на заполнения блоков нулями при ошибках чтения.

Обычно dd не отображает изменений в ходе исполнения. Но можно передать инструменту опцию status=progress. Тогда система будет отображать информацию о количестве скопированных данных в режиме реального времени.

Передача файла образа диска на другой компьютер

Назовем другой компьютер именем newcomputer. Тогда команда для передачи файла будет выглядеть так:

# dd if=/dev/sdb | ssh root@newcomputer "(cat >backup.img)"

Архивация образа диска

Часто полезно записать сжатый образ диска, например, чтобы сделать бэкап данных. Архивацию можно реализовать несколькими способами. Наиболее популярные — утилитами bzip2 и gzip.

Вот пример кода с bzip2 сжатием:

# dd if =/dev/disk2 | bzip2 disk2.img.gz

Или применять gzip:

$ sudo dd if=/dev/disk3 | gzip -c > /Users/captain/raspberrypi.img.gz

Разные алгоритмы сжатия отличаются по производительности и дают разный размер архива. Также можно добавить дополнительные опции, например, размер блоков (bs), наблюдение за статусом (status=progress) и запись данных выходного файла (conv=fsync).

Извлечение данных из резервной копии

Когда утилита dd завершает работу с клонирования диска, вы получаете образ диска с названием backup_image.img.gz. Чтобы его открыть, сначала нужно получить права суперпользователя.

Например, Ubuntu это выполняется командой sudo su + пароль компьютера. В других дистрибутивах алгоритм действий аналогичный, но применяете команду su. Такую же команду нужно повторить если восстановления из образа данных жесткого диска:

Синтаксис команды:

gunzip/+ Путь кореневой директории диска/ /backup_image.img.gz | dd of=/dev/sda

Создать образ оптического диска формата ISO

Для решения этой задачи фактически нужно прочитать «по блокам» информацию с диска и сохранить их в файле. Код для решения задачи будет выглядеть вот так:

# dd if=/dev/sr0 of=image.iso bs=4096

Восстановить файл с поврежденного устройства или создать образ этого носителя

В ситуации, когда вы потеряли доступ к документам или фотографиям из-за поврежденного диска, можно попробовать перенести информацию утилитой dd. Производим перезапись файлов, указав команду пропускать поврежденные блоки.

Вот пример кода:

# dd if=picture.png of=/home/user1/picture.png conv=noerror,sync

Другой вариант — создать файл образа поврежденного диска и попробовать вытащить данные из него.

# dd if=/dev/sdb of=/home/user1/picture.png bs=4096 conv=noerror,sync

Анализ содержания жесткого диска

Часто нужно отыскать информацию в определенной части диска. Для этого система может пропустить считывание ненужной части блоков. Например, вы хотите узнать содержимое диска начиная с 2000-го блока в примере произвольное число. Чтобы это сделать, достаточно выполнить такую команду:

# dd if=/dev/sdc1 count=1 skip=2000

Тестирование скорости чтения и записи дисков

В утилите dd можно проверить насколько быстро жесткие диски и съемные устройства, например флешки, считывают и записывают информацию. Для этого мы создаем файл с блоками фиксированного размера. А потом считываем файл, используя тот же размер блока.

Так будет выглядеть синтаксис команд:

dd if=path/to/input_file of=/path/to/output_file    
bs=block_size count=number_of_blocks  

При записи мы можем считывать диск /dev/zero, он будет источником бесконечных байтов, а отправляем его по адресу dev/null. Этот раздел нигде физически не существует. Во время передачи dd просто отслеживает скорость передачи файлов и отображает сведения об операции.

Чтобы определить скорость чтения кэшированных файлов, можно задать программе такие команды:

sudo dd if=tempfile of=/dev/null bs=1M count=1024
1024+0 records in
1024+0 records out

Файлы с кэша обычно считываются быстрее, поэтому, чтобы протестировать скорость чтения именно из диска, лучше очистить кэш:

sudo /sbin/sysctl -w vm.drop_caches=3
 vm.drop_caches = 3
sudo dd if=tempfile of=/dev/null bs=1M count=1024
 1024+0 records in
 1024+0 records out

Чтобы узнать, насколько быстро проходит запись, выполните следующую команду:

sudo dd if=/dev/zero of=tempfile bs=1M count=1024
1024+0 records in
1024+0 records out

Чтобы узнать производительность внешних жестких дисков, флешек или других устройств, нужно сначала их монтировать, а затем повторить вышеуказанные команды. Альтернативный вариант — заменить tempfile на путь к точке монтирования:

sudo dd if=/dev/zero of=/media/user1/Flashcard/tempfile bs=1M count=1024

Максимальная скорость съемных устройств, которые имеют подключение USB 2.0, — 480 Мбит или 60 МВ в секунду. Но из-за различных ограничений максимальная пропускная способность ограничена на уровне примерно в 35 МВ/с.

Копирование файлов

Также утилиту dd можно применять и для простого копирования файлов. Для этого, на самом деле, лучше использовать специальную утилиту cp. Но иногда нет необходимости переключаться. Сделать копию данных можно с помощью такого кода:

$ dd if=/home/user1/article.txt /home/user1/article_copy.txt 

В Заключение

Утилита dd предназначена для форматирования, обработки и конвертации файлов. Она работает на «низком» уровне, то есть позволяет взаимодействовать с секторами дисков. Поэтому во время работы важно помнить о соответствии размеров дисков и использовать флаг sync для синхронизации данных. В остальном это быстрый и удобный инструмент для модерации данных на устройствах и его применение ограничивается лишь фантазией пользователя.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023