Утилита dd
— это программа Unix, утилита командной строки, которую в Linux используют для низкоуровневого копирования и конвертации файлов. Функции утилиты на самом деле значительно шире и об этом мы более детально расскажем в статье ниже.
Содержание:
1. Назначение команды dd
2. Дисклеймер: работайте осторожно
3. Стандартный синтаксис команды dd
4. Параметры для работы с командой dd
5. Параметры для iflag, oflag
6. Примеры использования dd
В Заключение
Мы упоминали, что основная задача dd
— обработка файлов. Но в Linux все устройства, порты, оперативная память и память с кодом процессов отображаются как файлы, а это значит, что над ними можно проводить операции в dd
. Еще утилита позволяет осуществлять выборочное копирование файлов с диска.
Например, переместить фрагмент файла определенного размера или пропустить несколько гигабайт. Эта функция также помогает считать файлы с поврежденного носителя, изменить расположение байтов в файле, создавать файлы фиксированного размера. Кроме этого в dd
можно создать дополнительную копию загрузочного сектора жесткого диска или прочитать блоки из системных файлов.
Разработчики задумывали, что название dd
должно отсылать к аббревиатуре языка Job Control Language (JCL), который использовала IBM. В этом языке оператор dd
расшифровывался как «Доступ к данным» (Data Access). Работая с утилитой, помните, что при передаче некорректных аргументов, часть или все данные диска могут быть потеряны.
Поэтому крайне важно корректно указывать адреса и имена целевых файлов. В связи с этим dd
имеет несколько ироничных расшифровок-прозвищ, таких как data destroyer
, «добей диск» и delete data
. Но инструмент продолжают применять из-за его мощности, надежности и простоты в использовании.
При работе с dd
рекомендуется использовать Live-режим Linux, то есть запускать систему без установки на компьютер, например с USB-носителя. Live-режим работает медленнее из-за копирования каждого байта, даже с неиспользуемого пространства.
Обратите внимание, что dd
не отличает занятое и свободное дисковое пространство и копирует все. Поэтому жесткий диск, на который переносятся данные должен быть не меньшим, чем клонируемый.
Обычно синтаксис конда состоит из трех команд:
if
Обозначает путь к файлу откуда будут взяты данные. Может быть как обычным файлом, так и файлом устройства.
of
Указывает куда будут копироваться данные. Сохранять файлы также можно как в обычные, так и в системные файлы.
В 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 | Не обрезать выходной файл |
Также отдельно стоит рассмотреть параметры iflag
и oflag
. Они позволяют задать дополнительные флаги: iflag
— для устройств ввода, а oflag
— для вывода.
Наиболее популярные флаги:
append
— режим дописывания данных в файл. Append применяют только для вывода. Когда вы объедините этот флаг с конструкцией “of=файл
”, нужно еще указать параметр “conv=notrunc
”, чтобы выходной файл не был обрезан из-за добавления новых данных.direct
— режим обработки данных в обход кэша. Этот флаг повышает скорость.dsync
— запись данных с синхронизацией. Этот флаг повышает надежность.sync
— так же как и dsync
, но и с метаданными.directory
— выдавать ошибку, при использовании каталога.fullblock
— чтение только полных блоков. Применяется только для iflag
.noatime
— не обновляет время доступа к элементам файловой системы. Флаг повышает скорость.nofollow
— запрет на переход по символическим ссылкам.Для записи образа диска на флешку, сначала нужно узнать, как она называется в системе. Для этого ее необходимо отключить и выполнить команду 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
Для решения этой задачи фактически нужно прочитать «по блокам» информацию с диска и сохранить их в файле. Код для решения задачи будет выглядеть вот так:
# 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
для синхронизации данных. В остальном это быстрый и удобный инструмент для модерации данных на устройствах и его применение ограничивается лишь фантазией пользователя.
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…