Использование dd. Как записать iso-образ дистрибутива на флешку из терминала в Ununtu и производные

Как известно, «пользователи компьютера делятся на тех, кто делает бэкапы, и тех, кто будет их делать» . В этой статье мы рассмотрим различные способы резервного копирования (бэкапа) всей системы и, соответственно, восстановления из резервной копии.

Сразу стоит отметить, что все операции стоит производить не «по-живому», т.е. не на работающей системе, а с liveCD или установленной на соседнем разделе/флэшке/usb-hdd системы. В случаях, когда простой в несколько минут критичен для системы, возможно копирование системы из-под самой себя, но при этом нужно учитывать некоторые дополнительные условия, которые в данной статье пока что не рассматриваются

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

tar

Одним из наиболее популярных способов создания простейшего бэкапа является архивация данных с помощью tar . Преимуществами данного способа являются возможность инкрементного бэкапа (добавления файлов в существующий архив, удаления или изменения таковых), возможность извлечения из архива отдельных файлов, а также присутствие tar практически в любой Linux-системе.

Создание архива

Для начала создайте точки монтирования для корневого раздела и для раздела, на котором вы собираетесь создавать бэкап, например так

Смонтируйте оба раздела. Для большей надежности можно смонтировать корневой раздел в режиме read-only (только для чтения), чтобы исключить вероятность случайного изменения данных

Sudo mount /dev/sdXY /mnt/root -o ro sudo mount /dev/sdXY /mnt/backup

(Вместо «sdXY» используйте ваши значения для нужных разделов. определить их можно с помощью sudo fdisk -l или sudo blkid)

В случае, если вы используете отдельные разделы для /boot, /usr, /home и пр. и хотите включить их содержимое в бэкап, примонтируйте их в соответствующие папки

Sudo mount /dev/sdXY /mnt/root/usr -o ro sudo mount /dev/sdXY /mnt/root/home -o ro

При необходимости создайте на бэкап-разделе папку, в которой вы хотите разместить архив, например

Sudo mkdir -p /mnt/backup/ubuntu/root

Теперь можно приступить к созданию архива. Чтобы создать архив с gzip-сжатием, выполните

Sudo tar -cvzpf -C /mnt/root /mnt/backup/ubuntu-sda1.tar.gz .

(Ключ -p включает сохранение владельцев и прав доступа для файлов )

Для bzip2-сжатия используйте

Sudo tar -cvjpf /mnt/backup/ubuntu-sda1.tar.bz2 /mnt/root

Для lzma-сжатия

Sudo tar --lzma -cvpf /mnt/backup/ubuntu-sda1.tar.lzma /mnt/root

Аналогично для lzo-сжатия - ключ --lzop вместо --lzma

Различные алгоритмы сжатия дают разный размер архива, а также отличаются по производительности

По завершении процесса отмонтируйте все смонтированные разделы

Sudo umount /mnt/root{/boot,/var,/home,} /mnt/backup

Восстановление из архива

Создайте точки монтирования для корневого раздела и раздела, на котором хранится ваш архив

Sudo mkdir /mnt/{root,backup}

Примонтируйте раздел с архивом-бэкапом

Sudo mount /dev/sdXY /mnt/backup -o ro

Отформатируйте корневой раздел в ту же (или другую) ФС. Если вы используете отдельные разделы для /usr, /boot и пр. и архивировали их, отформатируйте их тоже

(если вы восстанавливаете систему на новый жесткий диск, разметьте его с помощью fdisk/gparted и отформатируйте разделы)

Некоторые файловые системы поддерживают задание UUID при форматировании. Это дает возможность создать ФС с таким же UUID, как у старой, что позволит избежать необходимости править fstab .

Для ext2/3/4 UUID задается с помощью ключа -U , а еще больше упростить задачу можно командой вида

Sudo mkfs.ext4 -L "label" -U "$(sudo blkid -o value -s UUID /dev/sda1)" /dev/sda1

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

Bzip2 -dv /media/backup/sda5.dd.bz

Теперь можно смонтировать образ

Sudo mount /media/backup/sda5.dd -o loop /mnt

(С опцией loop программа mount автоматически «подцепит» файл-образ на свободное loop-устройство, после чего смонтирует файловую систему)

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

Sudo umount /mnt

dd - копирование всего жесткого диска

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

Создание образа

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

Перед началом операции убедитесь, что ни один из разделов данного жесткого диска не смонтирован. Сделать это можно запустив команду mount без параметров.

Выберите раздел, на котором вы собираетесь разместить файл-обарз. Разумеется, это должен быть раздел другого жесткого диска. Также убедитесь в наличии достаточного количества свободного места на этом разделе (например, с помощью утилиты df) - объем свободного места должен соответствовать объему копируемого жесткого диска (при сжатии образ получится меньше, но это зависит от типа хранимых данных).

Смонтируйте бэкап-раздел

Sudo mount /dev/sdXY /mnt

Теперь можно приступать

Sudo dd if=/dev/sdX bs=1M conv=noerror,sync | lzma -cv > /mnt/hdd.dd.lzma

(здесь «sdX» - диск, а не раздел! для копирования без сжатия команда аналогична приведенной выше для бэкапа раздела)

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

Sudo umount /mnt

Восстановление из образа

Внимание! Данный способ предполагает полный откат к состоянию на момент создания архива с заменой всех данных!

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

Убедитесь, что ни один раздел восстанавливаемого диска не используется. Смонтируйте бэкап-раздел

Sudo mount /dev/sdXY /mnt

Можно приступать к процедуре

Bzip2 -dc /mnt/hdd.dd.bz | sudo dd of=/dev/sdX bs=1M conv=sync,noerror

Или же для несжатого образа

Sudo dd if=/mnt/hdd.dd.bz of=/dev/sdX bs=1M conv=sync,noerror

По завершении отмонтируйте бэкап-раздел

Sudo umount /mnt

Если вы хотите распаковать образ на другой жесткий диск, он должен иметь размер не меньше оригинального. В случае, если новый диск большего объема, вы сможете расширить разделы либо создать новый раздел на свободном месте с помощью parted/fdisk/gparted/etc

Не используйте оба жестких диска («дубликат» и «оригинал») одновременно! При подключении обоих дисков в системе будет по два раздела на каждый UUID, что приведет к проблемам в работе или невозможности загрузки

Монтирование образа

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

Если образ сжатый - распакуйте его. Теперь «подцепите» образ на loop-устройство

Sudo losetup -fv /media/backup/sda.dd

(С ключом -f программа автоматически найдет свободное loop-устройство, иначе необходимо явно указывать его)

losetup выведет на экран имя использованного устройства - если вы не работаете с другим файлами-образами (iso, шифрованными контейнерами и пр.), это скорее всего будет /dev/loop0

Теперь мы имеем устройство, являющееся для системы жестким диском, но не имеем доступа к его разделам. Добраться до разделов поможет программа kpartx (может потребоваться установка одноименного пакета)

Sudo kpartx -av /dev/loop0

(Ключ -a - добавить разделы для заданного устройства; -v - информативный вывод)

Программа выведет имена созданных устройств для разделов диска: loop0p1 для первого раздела, loop0p2 - для второго, по аналогии с разделами обычного диска. Файлы устройств будут находиться в папке /dev/mapper

Теперь можно работать с разделами и ФС на них. Например, смонтировать бывший sda5 и записать на него файлы

Sudo mount /dev/mapper/loop0p5 /mnt

По заверешнии отмонтируйте раздел

Sudo umount /mnt

Удалите устройства-разделы с помощью kpartx

Sudo kpartx -dv /dev/loop0

и освободите loop-устройство

Sudo losetup -v -d /dev/loop0

Все! Изменения записались, а ваш образ снова стал обычным файлом

cp

Здесь мы рассмотрим бэкап с помощью утилиты cp , т.е. с использованием простого копирования. Вообще-то, это не самый оптимальный способ, и подходит он скорее для копирования системы на другой жесткий диск / раздел / компьютер, нежели для создания резервной копии.

С другой стороны, данный способ имеет ряд преимуществ:

    Универсальность - cp вы найдете в любой Linux-системе

    Низкая требовательность к ресурсам (вследствие отсутствия сжатия и простоты механизма)

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

Создание копии

Создайте точки монтирования для корневого и бэкап-разделов

Sudo mkdir /mnt/{root,backup}

Смонтируйте оба раздела

Sudo mount /dev/sdXY -o ro /mnt/root sudo mount /dev/sdXY /mnt/backup

Смонтируйте разделы для /usr, /boot и пр., если таковые имеются

Sudo mount /dev/sdXY -o ro /mnt/root/home

Создайте на бэкап-разделе папку для своего бэкапа

Sudo mkdir /mnt/backup/ubuntu

Можно начинать

Sudo cp -av /mnt/root/* /mnt/backup/ubuntu

(ключ -a включает копирование ссылок «как есть», сохранение всех возможных атрибутов файлов и рекурсивный режим. ключ -v - вывод информации о происходящем)

По завершении процесса отмонтируйте все разделы

В дальнейшем вы сможете заархивировать ваши данные любым удобным способом

Восстановление из копии

Внимание! Данный способ предполагает полный откат к состоянию на момент создания архива с заменой всех данных!

Создайте точки монтирования для разделов

Sudo mkdir /mnt/{root,backup}

Смонтируйте бэкап-раздел

Sudo mount /dev/sdXY -o ro /mnt/backup

Отформатируйте корневой раздел и разделы /usr, /boot и пр., если таковые имеются. (Про форматирование разделов с сохранением UUID см. в разделе про )

Sudo mkfs.reiserfs -l "root" /dev/sdXY sudo mkfs.ext2 -L "boot" /dev/sdXY sudo mkfs.ext4 -L "home" /dev/sdXY

Смонтируйте свежесозданные ФС

Процесс копирования происходит аналогично, только в обратном направлении

Sudo cp /mnt/backup/ubuntu/* -av /mnt/root

По завершении копирования отредактируйте fstab , исправив UUID разделов

Отмонтируйте разделы

Sudo umount /mnt/backup /mnt/root/{usr,home,}

squashfs

sudo mkfs.reiserfs -l "root" /dev/sdXY sudo mkfs.ext2 -L "boot" /dev/sdXY sudo mkfs.ext4 -L "home" /dev/sdXY

Смонтируйте свежесозданные ФС

Sudo mount /dev/sdXY /mnt/root sudo mount /dev/sdXY /mnt/root/usr sudo mount /dev/sdXY /mnt/root/var

Можно приступать! Для распаковки образа используется утилита unsquashfs

Sudo unsquashfs -d /mnt/root -f /mnt/backup/ubuntu-root.sqfs

(Ключ -d задает путь для распаковки, с ключом -f программа будет использовать существующие папки вместо попыток создать новые)

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

По завершении отредактируйте fstab , заменив UUID разделов на новые (если вы форматировали разделы с теми же UUID, пропустите этот шаг)

Sudo nano /mnt/root/etc/fstab

Сохраните файл и отмонтируйте все разделы

Sudo umount /mnt/backup /mnt/root{/usr,/var,}

Монтирование образа

squashfs монтируется как любой другой образ - через loop-устройство . Поддержка squashfs ядром включена во множестве дистрибутивов, в том числе и в Ubuntu, так что достаточно будет просто воспользоваться командой mount с опцией loop

Sudo mount /media/backup/ubuntu-root.sqfs -o ro,loop /mnt

(Опция ro не обязательна, т.к. записать туда все равно ничего не получится)

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

По завершении отмонтируйте образ как обычную ФС

Sudo umount /mnt

rsync

Подобно cp , rsync работает с файлами, а не с блочными устройствами. Особенность rsync в том, что он не копирует файлы, которые уже есть в точке назначения. По умолчанию он проверяет размер и время изменения файлов, но можно проверять и хэш (обычно это делается, когда нужна повышенная безопасность).

Простое использование

Синтаксис rsync подобен cp:

Rsync -a /mnt/root /mnt/backup

Параметра -a очень часто бывает достаточно, он обеспечивает самое нужное: рекурсивное копирование директорий, сохранение информации о владельце и группе и т.д. Для отображения подробной информации о копировании используется ключ -v , с ним будьте внимательны, в потоке данных можно пропустить сообщение об ошибке. Ключ -x гарантирует, что rsync не выйдет за пределы указанной файловой системы.

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

«Умное» копирование позволяет сократить время простоя системы. Запускаем rsync прямо на работающей системе, данные в которой постоянно изменяется, rsync копирует данные, скажем, в течение нескольких часов. Затем переводим систему в read-only, снова запускаем rsync , теперь он копирует только те файлы, которые изменились за эти несколько часов. Через несколько минут мы имеем полную копию исходной ФС. Время простоя при этом сократилось на порядок по сравнению с оффлайн-копированием. А в некоторых случаях будет достаточно и одного онлайн-копирования без перевода системы в read-only.

Сохранение предыдущих копий

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

Суть состоит в том, что в современных файловых системах (в том числе Ext4) адресация файла производится в два этапа: имя файла указывает на уникальный номер файла (индексный дескриптор или i-node), а этому номеру сопоставлены сами данные. Любое имя файла это, по факту, жёсткая ссылка на этот номер. Следовательно, файл (набор данных) может иметь несколько имён и быть разных каталогах, а это позволяет устранить избыточность в случае необходимости дублирования файлов (ведь жёсткая ссылка занимает мало памяти). Сами данные не удаляются до тех пор пока не будет запрошено удаление последней жёсткой ссылки.

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

Синхронизация содержимого каталога для текущей резервной копии с каталогом источником:

Rsync \ --archive \ --delete --delete-excluded \ # удаление из резервной копии несуществующих в источнике и исключённых файлов --progress \ # выводить информацию о прогрессе передачи "/home/user/Files/" \ # каталог источник "/backup/latest/" \ # каталог для текущей резервной копии --exclude ="/Public/" # исключение ненужных каталогов

В каталоге « /backup/latest/ » будет создана копия всех необходимых файлов и каталогов из источника и удалено всё лишнее.

Создание ещё одной текущей резервной копии без избыточности:

cp \ --archive \ # сохранять всю дополнительную информацию о файлах --link \ # использовать жёсткие ссылки для файлов - устранение избыточности "/backup/latest/" \ # источником является полученная выше текущая резервная копия "/backup/$(date +%Y-%m-%d_%H-%M-%S) /" # пункт назначения - каталог с датой в имени для удобства (см. man date)

При следующем создании резервной копии rsync удалит в каталоге « /backup/latest/ » файлы которые были удалены/исключены/изменены в каталоге источнике (измененные файлы сначала удаляются, а затем записывается новая версия). Однако удалены будут лишь имена файлов (те же жёсткие ссылки), сами файлы (данные) сохранены, поскольку на них были созданы жёсткие ссылки в соседнем каталоге командой «cp».

Прочие инструменты

Существует масса приложений для создания бекапов в Linux. Можно воспользоваться поиском по слову «backup» в Центре приложений Ubuntu, чтобы найти доступные в Ubuntu программы для работы с резервными копиями.

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

Кстати, в сети можно найти и русскоязычные руководства

Parted Magic

Parted Magic - еще один отличный, но платный дистрибутив, содержащий целую коллекцию средств для бэкапа и восстановления информации, работы с дисками и разделами, а также восстановления утерянных данных. Он поддерживает множество ФС, LVM2 и RAID (как аппаратный, так и программный) и содержит в себе таки средства как fsarchiver , GParted , вышеупомянтый Clonezilla, и все, что потребуется для описанных в этой статье способов. Кроме того, в состав дистрибутива входит веб-браузер и некоторое другое дополнительное ПО. Дистрибутив переведен на несколько языков, включая русский, и имеет полноценный графический интерфейс.

LParted

LParted - полнофункциональный LiveCD, предназначенный в первую очередь для работы с разделами жестких дисков (HDD), безвозвратного удаления или восстановления данных и тестирования оборудования. Основан LiveCD на Lubuntu Linux. LParted является функциональным аналогом Parted Magic.

Сюда бы добавить про SystemRescueCD и прочие

Ещё немного о сохранении данных

    Для важных данных можно сделать зеркальный раздел на двух дисках. Для этого совсем не обязательно иметь RAID-контроллер и диски одинакового размера - можно, например, собрать зеркало из 80-гигабайтного старого винта и 80-гигабайтного же раздела на новом. Зеркалирование можно реализовать с помощью LVM или программного RAID. Однако, такой способ бесполезен в случае, например, попадания на шину +5В напряжения ~220В или падения метеорита на системный блок компьютера.

    Гики-айтишники, имеющие дома свой сервер, могут расширить идею зеркалирования и использовать DRBD. Тот же RAID-1, но жёсткие диски находятся в разных компьютерах, что повышает надёжность.

    Современное удобное решение - бэкапить данные в «облака», например, с помощью Ubuntu One, Dropbox, http://www.adrive.com/ и других.

    Ни зеркалирование, ни репликация на Ubuntu One не спасут от случайного нажатия Delete, поэтому в любом случае делайте «классические» бэкапы. И в один прекрасный ужасный день все ваши труды и старания будут вознаграждены.

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

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

Сначала нужно понять как работает команда dd и что она делает. Фактически, это аналог утилиты только для блочных данных. Утилита просто переносит по одному блоку данных указанного размера с одного места в другое. Поскольку в 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 позволяет отключить реагирование на ошибки. Дальше, вы можете создать образ жесткого диска или раздела на нем и сохранить этот образ на диск. Только смотрите не сохраните на тот же жесткий диск или раздел, чтобы не вызвать рекурсию:

dd if=/dev/sda of=~/disk.img

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

dd if=~/disk.img of=/dev/sda

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

  • с - один символ;
  • b - 512 байт;
  • kB - 1000 байт;
  • K - 1024 байт;
  • MB - 1000 килобайт;
  • M - 1024 килобайт;
  • GB - 1000 мегабайт;
  • G - 1024 мегабайт.

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

dd if=/dev/sda of=~/disk.img bs=5M

Следующий параметр - это 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

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

Если образ диска слишком большой, можно перенаправить весь вывод нестандартный поток вывода утилиты gzip:

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 предназначена для задействования одноименной утилиты, предназначенной для низкоуровневого копирования и преобразования данных. Ее название расшифровывается как «data duplicator» или «дупликатор данных». Данная утилита используется главным образом для записи образов установочных дисков дистрибутивов Linux на флеш-накопители и создания образов оптических носителей, тем не менее, круг ее функций не ограничивается перечисленными операциями. Например, dd может использоваться для простого копирования файлов или изменения регистра символов текстовых строк. Вообще, рассматриваемая утилита является в какой-то мере уникальной, ведь она предполагает использование собственного формата передачи параметров.

Стандартный синтаксис команды выглядит следующим образом:

$ dd if=<имя исходного файла> of=<имя целевого файла> [параметры]

Несложно заметить, что для передачи параметров утилите используется формат записи <имя параметра>=<значение параметра> . Утилита может читать исходные данные из стандартного потока ввода и выводить результирующие данные с помощью стандартного потока вывода в случае отказа от использования параметров if и of , но в подавляющем большинстве случаев данные параметры являются необходимыми для указания имен файлов с соответствующими данными. Утилита читает и записиывает данные блоками, причем размер блока может изменяться с помощью параметра bs (по умолчанию используются блоки размером в 512 Кб). Существуют отдельные параметры для задания размеров читаемых и записываемых блоков, а именно, ibs и obs . Количество читаемых блоков может ограничиваться в помощью параметра count . Для пропуска заданного количества блоков исходного файла может использоваться параметр skip , целевого файла - параметр seek . Для указания флагов чтения и записи через запятую может использоваться параметр iflag

  • append - активация режима дописывания данных в целевой файл.
  • direct - режим обработки данных в обход кэша файловых систем (повышает скорость).
  • dsync - режим записи данных с синхронизацией (повышает надежность).
  • sync - режим записи данных и метаданных с синхронизацией (повышает надежность).
  • fullblock - чтение лишь полных блоков.
  • nonblock - активация режима неблокируемого ввода/вывода (повышает скорость).
  • noatime - отключение механизма обновления меток времени элементов файловой системы (повышает скорость).
  • nofollow - отказ от перехода по символьным ссылкам.

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

  • lcase - перевод символов строки в кодировке ASCII в нижний регистр.
  • ucase - перевод символов строки в кодировке ASCII в верхний регистр.
  • nocreat - вывод сообщения об ошибке в случае отсутствия целевого файла.
  • excl - вывод сообщения об ошибке в случае существования целевого файла.
  • notrunc - отказ от урезания целевого файла.
  • swab - смена мест каждых двух байтов из исходного файла.
  • noerror - продолжение работы даже в случае возникновения ошибок.
  • fdatasync - активация режима записи данных в целевой файл перед завершением работы утилиты.
  • fsync - активация режима записи данных и метаданных в целевой файл перед завершением работы утилиты.

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

Создание резервной копии данных дискового накопителя

Предположим, мы используем жесткий диск, представленный файлом устройства /dev/sda , и нам нужно создать посекторную резервную копию всех размещенных на нем данных, сохранив ее в файле в разделе съемного диска с интерфейсом USB, представленном файлом устройства /dev/sdb1 и смонтированным в директорию /mnt/sdb1 . Обычно такие файлы резервных копий называются дампами или образами дисков. Наш файл образа диска будет носить имя backup.img . Это команда, с помощью которой его можно создать:

# dd if=/dev/sda of=/mnt/sdb1/backup.img

В данной команде с помощью параметра if задается путь к исходному файлу, а с помощью параметра of - к целевому.

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

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

# dd if=/mnt/sdb1/backup1.img of=/dev/sda

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

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

Перед клонированием жесткого диска вы должны убедиться в том, что у вас имеется жесткий диск того же объема, что и исходный. Эта же операция может выполняться и в случае флеш-накопителей с интерфейсом USB аналогичных объемов. Предположим, что исходный флеш-накопитель представлен файлом устройства /dev/sdb , а целевой - файлом устройства /dev/sdc . В этом случае вы можете клонировать исходный накопитель с помощью следующей команды:

# dd if=/dev/sdb of=/dev/sdc

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

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

Для передачи файла образа диска по сети на другой компьютер с именем target может использоваться следующая команда:

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

Сжатие файла образа диска

Для того, чтобы резервная копия раздела диска занимала меньше места, вы можете сжать ее с помощью компрессора, такого, как bzip2 :

# dd if=/dev/sdb | bzip2 backup.img.bz2

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

Для создания образа оптического диска CD, DVD или BD достаточно поблочно прочитать его содержимое и сохранить это содержимое в файле:

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

Сохранение файла с поврежденного носителя или создание образа такого носителя

Если ваш любимый фильм или музыкальный трек больше не читается из-за повреждения носителя, вы можете попробовать скопировать его с помощью утилиты dd , игнорируя поврежденные блоки:

# dd if=movie.avi of=/home/alex/movie.avi conv=noerror,sync

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

# dd if=/dev/sdb of=/home/alex/movie.iso bs=2048 conv=noerror,sync

Запись образа установочного диска на флеш-накопитель с интерфейсом USB

Для установки дистрибутива Linux с флеш-накопителя с интерфейсом USB необходимо записать на этот флеш-накопитель образ установочного диска формата ISO. Для этой цели может использоваться аналогичная команда:

# dd if=/home/alex/Fedora-Workstation-Live-x86_64-26_Alpha-1.7.iso of=/dev/sdc

Важно помнить, что даже в случае наличия на флеш-накопителе разделов следует указывать не путь к файлу устройства одного из разделов, а путь к файлу устройства самого накопителя, в нашем случае это /dev/sdc .

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

Утилита dd является отличным инструментом для исследования файловых систем. Для анализа содержимого жесткого диска с выводом данных из отдельных блоков, в нашем случае, блока 1001 на разделе, представленном файлом устройства /dev/sdc1 , достаточно использовать следующую команду:

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

Для того, чтобы увидеть первые 40 байт вашего жесткого диска в шестнадцатеричном представлении следует использовать команду:

# dd if=/dev/sda bs=1 count=40 | hexdump -C

В данном случае с помощью параметра bs задается размер блока диска.

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

Для тестирования производительности дискового накопителя, представленного, к примеру, файлом устройства /dev/sda в условиях чтения блоков различных размеров может использоваться аналогичная команда:


1000000+0 records in
1000000+0 records out

# dd if=/dev/sda of=/dev/null bs=4096 count=1000000
1000000+0 records in
1000000+0 records out
4096000000 bytes (4.1 GB) copied, 29.8747 s, 137 MB/s

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

# dd if=/dev/sda of=/dev/null bs=512 count=1000000
1000000+0 records in
1000000+0 records out
512000000 bytes (512 MB) copied, 4.25186 s, 120 MB/s

# dd if=/dev/sda of=/dev/null bs=512 count=1000000
1000000+0 records in
1000000+0 records out
512000000 bytes (512 MB) copied, 0.417317 s, 1.2 GB/s

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

# dd if=/dev/sda of=/dev/null bs=512 count=100000 iflag=direct
100000+0 records in
100000+0 records out
51200000 bytes (51 MB) copied, 5.01053 s, 10.2 MB/s

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

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

$ dd if=/home/alex/test.txt /home/alex/test_copy.txt

Для создания образа жесткого диск не обязательно использовать утилиты на подобии Acronis True Image или Norton Ghost, достаточно простой утилиты dd, которая входит в состав большинства Unix-подобных операционных систем (Linux, FreeBSD, Solaris и т.д.) В статье рассмотрен простой способ создания резервной копии образа жесткого диска при помощи dd. Первым делом необходимо подготовиться к резервному копированию. В данной статье введем следующие обозначения:

  • /dev/sda - диск, образ которого необходимо создать;
  • /dev/sdb - диск на который будет записан образ.

При необходимости нужно подставить собственные значения.

Подготовка к созданию образа жесткого диска

Первым делом необходимо загрузиться с любого доступного Live-CD диска, имеющего утилиту dd, и войти в командную строку в качестве суперпользователя. Создаем точку монтирования для проведения резервного копирования.

mkdir /mnt/backup

Монтируем жесткий диск на который необходимо сохранить образ.

Создание образа жесткого диска

dd if=/dev/sda of=/mnt/backup/sda.img bs=8M conv=sync,noerror

  • if=/dev/sda - копируем весь жесткий диск sda;
  • of=/mnt/backup/sda.img - копируем в /mnt/backup/sda.img;
  • bs=8M - задаем размер кэша жесткого диска для ускорения процедуры копирования (иначе данные будут сбрасываться малыми порциями по 512 байт);
  • conv=sync,noerror - указываем dd на необходимость копирования по типу бит-в-бит с игнорированием ошибок чтения.

Для сокращения размера образа жесткого диска его можно сжать любым архиватором.

dd if=/dev/sda bs=8M conv=sync,noerror | gzip -c > /mnt/backup/sda.img

Восстановление образа жесткого диска

Для восстановления образа жесткого диска необходимо проделать процедуру обратную процедуре создания этого образа.

dd if=/mnt/backup/sda.img of=/dev/sda bs=8M conv=sync,noerror

При использовании сжатия параллельно необходимо разархивировать образ.

gunzip -c /mnt/backup/sda.img | dd of=/dev/sda conv=sync,noerror bs=8M

Миграция системы на другой жесткий диск

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

dd if=/dev/sda of=/dev/sdb bs=8M conv=sync,noerror

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

Статистика копирования в dd

Главный минус в dd - это отсутствие наглядного представления статистики выполнения процедуры копирования. Однако этот минус можно легко обойти. Достаточно подключиться к другому терминалу.

Определить номер процесса, под которым запущена dd.

Периодически посылать данному процессу команду kill -USR1 номер_процесса_dd .

watch -n 5 kill -USR1 номер_процесса_dd

  • watch -n 5 - выполнять команду каждые 5 секунд;
  • kill -USR1 номер_процесса_dd - показать статистику копирования.

Это настраиваемый параметр, определяющий тип и применение создаваемого загрузочного диска на USB-носителе.

В утилите Rufus доступны четыре метода загрузки, один из которых следует выбрать из выпадающего списка. В списке они обозначены как MS-DOS, FreeDOS, ISO-образ, DD-образ. Первые два доступны только для компьютеров и устройств, имеющих BIOS – их нужно выбрать из выпадающего списка в строке «Схема раздела и тип системного интерфейса».

Такой метод загрузки в Rufus создаёт загрузочную флешку с операционной системой MS-DOS. Это дисковая операционная система, которая может потребоваться в следующих случаях:

  • для обновления и перепрошивки BIOS, эту процедуру безопаснее выполнять из-под DOS;
  • для диагностики и тестирования компьютера или ноутбука, поскольку большинство утилит для глубокой диагностики оперативной памяти или жёсткого диска работают только под DOS;
  • если необходимо получить доступ к файлам на жёстком диске при отсутствующей или испорченной операционной системе;
  • при использовании старых консольных программ (например, для программирования периферийных устройств), которые под Windows могут работать некорректно;
  • если нужен доступ к файловой системе жёстких дисков компьютера или ноутбука на более низком уровне.

FreeDOS – операционная система, аналогичная MS-DOS, которая распространяется бесплатно на условиях свободной лицензии и доступна в Rufus. Также позволяет обновить BIOS, починить жёсткий диск при помощи специальных программ, тестировать оперативную память (RAM) и прочее. Действия производятся специальными командами из командной строки.

Метод загрузки ISO-образ следует выбирать для перенесения готового ISO-образа загрузочного диска на USB-накопитель. ISO-образ следует создать предварительно, воспользовавшись предназначенными для этого программами. Этот метод можно использовать в операционных системах Windows, Linux, и других. Полученный загрузочный диск можно затем использовать для аварийного восстановления операционной системы и средств диагностики жёстких дисков.

Метод загрузки DD-образ в Rufus

Используется для создания загрузочных дисков из образов, созданных в операционной системе Linux программой DD. Принципиальное отличие этого метода загрузки в том, что программа DD по сути не создаёт образ, а делает побитовую копию заданной директории.

Программа Rufus не является чем-то уникальным в области создания загрузочных носителей, главным её достоинством является простота пользования.