Создать файл побитовой копии flash диска в linux

Обновлено: 06.07.2024

Иногда при работе в интерфейсе командной строки Linux может потребоваться выполнение операции точного побитового копирования данных. Чаще всего это требуется для создания образов и резервных копий. Для этого можно воспользоваться утилитой dd, что означает data duplicator (дубликатор данных). И хотя она изначально не создавалась для функции резервного копирования, в данном контексте она оказывается очень полезной. В этом руководстве мы на нескольких простых примерах разберём, как она работает.

Синтаксис

Синтаксис команды следующий:

Вот список наиболее важных опций:

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

Рассмотрим несколько примеров использования команды dd, таких как создание больших файлов для тестирования, создание образов и копий дисков.

Изменение регистра текста

Допустим, у вас есть несколько строк текста, написанного в нижнем регистре, а вам нужно перевести его в верхний регистр. Для этого можно воспользоваться опцией conv с аргументом ucase:


Здесь мы видим команду и введённый текст. Чтобы показать dd, что ввод текста завершён, мы воспользовались комбинацией клавиш Ctrl+D, и команда вывела следующий результат:


Чтение и запись файлов и устройств

В предыдущем примере мы вводили текст в stdin (стандартный поток ввода). Однако, всегда можно использовать входные и выходные файлы. Чтобы указать имена входного и выходного файла, используются опции if и of, соответственно. Например, если вам нужно перевести в верхний регистр текст из файла file1 и записать его в файл file2, можно выполнить следующую команду:

Командой dd также можно создавать файлы различных объемов, например для тестов. Следующая команда создаст файл объемом 1 ГБ заполненный случайными данными


Или файл заполненный нулями

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

Например, следующая команда полностью копирует диск /dev/sda на диск /dev/sdb:

Аргумент noerror опции conv позволяет программе продолжать копирование даже при наличии ошибок, а sync задаёт использование синхронизированного ввода/вывода. Размер блока должен быть кратным 1 Кб (1024 байта), а выходной диск равен по объему входному или больше.

Аналогично можно создать образ CD или DVD, вместе с загрузочным сектором:

Опция -o loop команды mount позволяет смонтировать файл как обычное устройство. Так можно подключить созданный образ:

Пропуск части входных данных

При необходимости можно задать команде пропустить несколько начальных байтов входных данных. Это осуществляется при помощи опции skip с целочисленным аргументом. Например, если значение этого аргумента N, то dd пропустит N блоков размера ibs. Это ещё одна опция команды, которая определяет число байтов, считываемых за раз (по умолчанию 512).

Если вам требуется пропустить первые 4 байта входного файла, нужно задать ibs равным 4, а аргумент skip равным 1. Таким образом при чтении файла команда пропустит один блок размером 4 байта.

Сравним файлы командой grep


Видно, что часть текста при считывании файла file1 были пропущены, поэтому в файле file2 их нет.

Действия с выходными файлами

Чтобы команда работала только в том случае, если выходного файла ещё не существует, в качестве аргумента опции 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


Сокращение вывода в stderr

Можно ограничить объём информации, выводимой в поток stderr, при помощи опции status. Например, если требуется сообщать только об ошибках, нужно указать эту опцию с аргументом none:

Заключение

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

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

Для решения всех этих задач используется утилита dd linux, которая просто выполняет копирование данных из одного места в другое на двоичном уровне. Она может скопировать CD/DVD диск, раздел на диске или даже целый жесткий диск. В этой статье мы рассмотрим что из себя представляет команда dd linux, основные ее опции и параметры, а также как ею пользоваться.

Как работает команда dd?

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

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

Команда 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 чаще всего для создания образов дисков DVD или CD. Например, чтобы сохранить образ диска в файл можно использовать такую команду:

sudo dd if=/dev/sr0 of=

/CD.iso bs=2048 conv=noerror

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

В вашей домашней папке будет создан файл с именем disk1.img, который в будущем можно будет развернуть и восстановить испорченную систему. Чтобы записать образ на жесткий диск или раздел достаточно поменять местами адреса устройств:

Очень важная и полезная опция - это bs. Она позволяет очень сильно влиять на скорость работы утилиты. Этот параметр позволяет установить размер одного блока при передаче данных. Здесь нужно задать цифровое значение с одним из таких модификаторов формата:

Команда dd linux использует именно такую систему, она сложная, но от этого никуда не деться. Ее придется понять и запомнить. Например, 2b - это 1 килобайт, и 1k, это тоже 1 килобайт, 1М - 1 мегабайт. По умолчанию утилита использует размер блока - 512 байт. Например, чтобы ускорить копирование диска можно брать блоки размером по 5 мегабайт. Для этого применяется такая команда:


Следующий параметр - это count. С помощью него можно указать сколько блоков необходимо скопировать. Например, мы можем создать файл размером 512 мегабайт, заполнив его нулями из /dev/zero или случайными цифрами из /dev/random:

sudo dd if=/dev/zero of=file.img bs=1M count=512


Обратите внимание, что этот параметр указывает не размер в мегабайтах, а всего лишь количество блоков. Поэтому, если вы укажите размер блока 1b, то для создания файла размером 1Кб нужно взять только два блока. С помощью этого параметра также можно сделать резервную копию таблицы разделов MBR. Для этого скопируем в файл первые 512 байт жесткого диска:

sudo dd if=/dev/sda of=mbr.img bs=1b count=1

Для восстановления используйте обычную команду развертывания образа на диск.

dd if =/dev/sda2 | bzip2 disk.img.bz2

Также можно использовать утилиту dd linux для копирования файлов, хотя это и не является ее прямым предназначением:

dd if=/home/sergiy/test.txt of=/home/sergiy/test1.txt

Как вы знаете, команда dd linux пишет данные на диск непосредственно в двоичном виде, это значит, что записываются нули и единицы. Они переопределяют то, что было раньше размещено на устройстве для записи. Поэтому чтобы стереть диск вы можете просто забить его нулями из /dev/zero.

sudo dd if=/dev/zero of=/dev/sdb

Такое использование dd приводит к тому что весь диск будет полностью стерт.

Выводы

В этой статье мы рассмотрели как пользоваться dd linux, для чего можно применять эту утилиту и насколько она может быть полезной. Это почти незаменимый инструмент системного администратора, поскольку с помощью нее можно делать резервные копии целой системы. И теперь вы знаете как. Если у вас остались вопросы, спрашивайте в комментариях!

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

На самом деле, команда dd — не единственный инструмент, ведь большинство задач на Linux можно решить в несколько способов. Мы же попытаемся рассказать, почему утилита dd до сих пор популярна среди разработчиков, хоть ее и называют иногда data destroyer .

Назначение команды 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 не отличает занятое и свободное дисковое пространство и копирует все. Поэтому жесткий диск, на который переносятся данные должен быть не меньшим, чем клонируемый.

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

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

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

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

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

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

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

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

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

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

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

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

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

sudo mount /dev/sdc1 /mnt/usb

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

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

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

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

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

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

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

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

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

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

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

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

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

Или применять 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 . Производим перезапись файлов, указав команду пропускать поврежденные блоки.

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

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

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

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

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

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

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

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

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

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

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

Чтобы узнать производительность внешних жестких дисков, флешек или других устройств, нужно сначала их монтировать, а затем повторить вышеуказанные команды. Альтернативный вариант — заменить 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 для синхронизации данных. В остальном это быстрый и удобный инструмент для модерации данных на устройствах и его применение ограничивается лишь фантазией пользователя.

Highload нужны авторы технических текстов. Вы наш человек, если разбираетесь в разработке, знаете языки программирования и умеете просто писать о сложном!
Откликнуться на вакансию можно здесь .

ОПОВЕЩЕНИЕ СПОЙЛЕРА: прокрутите вниз и посмотрите видеоурок в конце этой статьи.

Резервное копирование SD-карт и флэш-накопителей

Для начала откройте окно терминала и подключите SD-карту / USB-накопитель, для которого вы пытаетесь создать резервную копию. Используйте команду lsblk для печати всех доступных устройств в системе.

Имейте в виду, что SD-карты не будут соответствовать общей структуре / dev / sdX, особенно если вы используете встроенный считыватель карт памяти. Вместо этого вы должны увидеть / dev / mmcblk, за которым следует информация о разделе.

Примечание. Резервное копирование USB должно осуществляться по традиционной схеме именования / dev / sdX.

Ваша SD-карта может не отображаться как / dev / mmcblk (или аналогичный), если вы используете USB-адаптер. Название метки устройства зависит от того, как адаптер SD-карты работает с Linux. Лучше всего прочитать руководство к адаптеру.

Проверь это - Как играть в The Talos Principle в Linux

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

Резервное копирование файла изображения

USB-накопители

Выполнение этой команды приведет к созданию полной копии USB-накопителя и сохранению ее в файле с именем image-of-usb.img. Возьмите этот файл изображения и сделайте резервную копию в безопасном месте. Если вы хотите повысить безопасность, выполните следующие действия, чтобы зашифровать его с помощью GnuPG.

Вывод GnuPG должен быть image-of-usb.img.gpg.

После завершения процесса шифрования удалите исходный файл и сохраните зашифрованный.

Извлеките изображение из зашифрованного файла в любое время с помощью:

SD-карты

Примечание: 0 означает SD 1.

Выполнение этой команды DD сделает снимок вашей SD-карты и сохранит его в файл в файловой системе с именем image-of-sd-card.img. Вы сможете переместить этот архивный образ, загрузить его в Dropbox, Google Drive, на домашний сервер и т. Д. Имейте в виду, что этот архив небезопасен, и к конфиденциальным данным можно легко получить доступ, если кто-то получит их. Вот почему мы рекомендуем вам также зашифровать резервную копию SD с помощью GnuPG.

Проверь это - 4 лучших дистрибутива Linux, которые стоит попробовать

Чтобы зашифровать, выполните эту команду:

Шифрование должно выводить файл с меткой image-of-sd-card.img.gpg

Вы должны удалить исходный исходный файл, когда шифрование завершится.

Чтобы извлечь зашифрованный архив, повторно запустите gpg без -c.

Дубликаты USB и SD карт

Например, чтобы скопировать SD-карту 1 на SD-карту 2, мне нужно будет использовать / dev / mmcblk0 и / dev / mmcblk1. Еще раз обратитесь к lsblk –help, если необходимо.

Когда вы придумали правильные метки, следуйте приведенным ниже инструкциям.

USB-накопители

/ image-of-usb.img, мы будем выводить его на второй USB-накопитель.

Проверь это - Как переназначить кнопки на Chromecast с помощью Google TV Remote

По завершении DD все данные с диска №1 должны находиться на диске №2!

SD-карты

Как и в разделе USB, DD берет данные с SD-карты №1, дублирует их и помещает на SD-карту №2. Запишите эту команду в терминал, чтобы запустить процесс дублирования. В этом примере SD-карта №1 будет / dev / mmcblk0, а №2 будет / dev / mmcblk1.

Вы узнаете, что процесс завершен, когда терминал снова сможет принимать текст с клавиатуры.

Восстановление резервных копий

Начните с загрузки последней версии Инструмент для прошивки Etcher для Linux откройте его и вставьте USB-накопитель или SD-карту.

В программе Etcher нажмите «Выбрать изображение», чтобы открыть окно выбора изображения. В этом окне найдите файл image-of-sd-card.img или image-of-usb.img и выберите его. Когда изображение загрузится, нажмите «Flash» и начните восстановление!

Когда Etcher показывает окно конечного экрана, ваши данные должны быть на устройстве.

Читайте также: