Безопасно и надежно создавайте идеальные копии дисков, разделов и файловых систем с помощью инструмента Linux dd.

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

К счастью, есть для этого инструмент “dd“, – это простой и мощный инструмент для копирования и создания образов.

Использование dd, может сделать идеальные побайтные образы, практически всего что есть на вашем компьютере. Но прежде чем вы начнете перебрасывать разделы с одного конца на другой, я должен упомянуть, что в этой старой шутке администратора Unix есть доля правды: « dd означает« disk destroyer – разрушитель диска »». Если вы введете хотя бы один неправильный символ в команду dd, вы можете мгновенно и навсегда уничтожить весь накопитель ценных данных. И да, орфография имеет значение.

Помните: перед нажатием клавиши Enter, сделайте паузу и подумайте очень внимательно!

Основные операции с dd

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

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

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

dd if=/dev/urandom of=/dev/null bs=100M count=5

Параметры:

  • if : указывает на источник, то есть туда, откуда мы копируем. Указывает файл, который может быть обычным файлом или файлом устройства.
  • of : указывает файл назначения. То же самое мы можем записать как в обычный файл, так и непосредственно в устройство.
  • bs : количество байтов, которые должны быть записаны за один раз. Вы можете думать об этом аргументе как о размере фрагмента данных, которые будут записаны или прочитаны, а количество фрагментов регулируется следующим параметром.
  • count : только число, которое указывает: сколько частей будет скопировано.

Таким образом, описанная команда считывает 5 * 100 мегабайт с устройства /dev/urandom на устройство /dev/null. Оказывая этой команде ощутимую нагрузку, получается, что система сгенерирует 500 мегабайт случайных значений и запишет их в  устройство null. Конечно единственное, что будет делать эта команда, это нагрузит процессор на несколько секунд.

Рассмотрим примеры из практики:

Создание образа диска: 

dd if=/dev/cdrom of=image.iso

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

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

dd if=/dev/cdrom of=image.iso conv=noerror

Параметр «conv» позволяет подключить несколько фильтров, применимых к потоку данных. Фильтр «noerror» просто отключает отключение программы при возникновении ошибки чтения. Таким образом, некоторые данные с диска еще можно прочитать. Точно так же я сохранил данные со своей погнутой флешки Corsair: я нашел правильную позицию, когда был контакт, и сделал дамп файловой системы.

Кстати, такие образы можно подключить с помощью команды mount с ключом «-o loop»:

mount -o loop image.iso /mnt/image

Если что-то не работает, процесс делится на 2 уровня:

losetup -e /dev/loop0 image.iso

mount /dev/loop0 /mnt/image

Если это все еще не работает, то файловая система образа полетела, и восстановить ее вряд-ли удастся.

Работа с носителями

Очень простое, но не оптимальное решение для клонирования жесткого диска:

dd if=/dev/sda of=/dev/sdb bs=4096

Все то же побитовое копирование с размером буфера 4 КБ. Недостатком этого метода является то, что при заполнении любых разделов копируются все биты, что не выгодно при копировании разделов с небольшой полнотой. Чтобы сократить время копирования при манипулировании большими объемами данных, вы можете просто перенести MBR на новый носитель (я опишу как), перечитать таблицу разделов ядра (используя тот же fdisk), создать файловые системы и просто скопировать файлы (не забывая сохранять права доступа к файлам).

Кроме того, вы даже можете сделать резервную копию раздела в сети. Уничтожение ключей ssh ​​сработает по такой схеме:

dd if=/dev/DEVICE | ssh [email protected] "dd of=/home/user/DEVICE.img".

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

dd if=/dev/zero of=/dev/DEVICE

Я думаю понятно, что нужно заменить DEVICE – на ваше устройство.

Вы можете сделать это с тем же самым dd, но преобразовав данные в шестнадцатеричный формат:

dd if=/dev/sda | hexdump -C

Операции с MBR

MBR находится в первых 512 байтах жесткого диска и состоит из таблицы разделов, загрузчика и пары дополнительных байт. Иногда необходимо выполнить резервное копирование, восстановление и т. д. Резервное копирование работает следующим образом:

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

Теперь можно легко восстановить данные:

dd if=mbr.img of=/dev/sda

Причины такого мошенничества с MBR могут быть разными, однако я хочу рассказать одну особенность, взятую из опыта: после восстановления давней копии MBR, где один из разделов был ext3, а позже стал FAT и использовался Windows, раздел перестал видеть Windows. Причиной является идентификатор раздела, который хранится в MBR. Если UNIX монтирует файловые системы в соответствии с суперблоком, то Windows руководствуется идентификаторами разделов из MBR. Поэтому вы всегда должны проверять идентификаторы разделов с помощью fdisk, особенно если на компьютере установлена ​​Windows.

Генерация файлов

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

С помощью dd создается файл, который забивается нулями (случайные числа не рациональны для оценки: длинные и бессмысленные):

dd if=/dev/zero of=image.crypted bs=1M count=1000

Был создан файл размером почти в ГБ. Теперь вам нужно сделать этот файл блочным устройством и одновременно передать его через механизм шифрования ядра linux. Я выберу алгоритм Blowfish. Загрузка модуля:

modprobe cryptoloop

modprobe blowfish Image 

ассоциация с блочным устройством с включенным шифрованием:

losetup -e blowfish /dev/loop0 image.crypted

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

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

mkfs.ext2 /dev/loop0 

mount /dev/loop0 /mnt/image 

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

umount /dev/loop0 

losetup -d /dev/loop0 

Теперь зашифрованный образ готов.

Мониторинг операций dd

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

Можете добавить опцию “status=progress” к dd, тогда команда будет выглядеть примерно так:

dd if=/dev/sda of=/dev/sdb status=progress

Или установите Pipe Viewer

sudo apt install pv

и вставьте его в dd. При этом последняя команда может выглядеть примерно так:

dd if=/dev/urandom | pv | dd of=/dev/sda1
4,14MB 0:00:05 [ 98kB/s] [      <=>                  ]

Это действительно не сложно, но будьте осторожны. Удачи!

Создание загрузочной флешки из терминала Linux

Давайте попробуем записать образ Ubuntu 20.04, на флешку, чтобы потом установить систему на компьютер.

Для начала нам нужно определить путь к нашей флешке, для этого откройте терминал и введите команду df

df

Вывод команды

[email protected]:~$ df
Файл.система 1K-блоков Использовано Доступно Использовано% Cмонтировано в
udev 4026960 0 4026960 0% /dev
tmpfs 811424 1864 809560 1% /run
/dev/sdb5 86040680 20839220 60787816 26% /
tmpfs 4057112 319416 3737696 8% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 4057112 0 4057112 0% /sys/fs/cgroup
/dev/loop0 96128 96128 0 100% /snap/core/8935
/dev/loop2 49536 49536 0 100% /snap/gtk-common-themes/1474
/dev/loop1 56320 56320 0 100% /snap/core18/1705
/dev/loop3 226816 226816 0 100% /snap/gnome-3-34-1804/21
/dev/loop4 49024 49024 0 100% /snap/snap-store/336
tmpfs 811420 20 811400 1% /run/user/122
tmpfs 811420 40 811380 1% /run/user/1000
/dev/sdc 2744448 2744448 0 100% /media/fox/flash

У моей флешки путь – /dev/sdc, а значит, я беру скачанный заранее образ Ubuntu, который расположен по адресу ~/Документы/Ubuntu 20.04, и ввожу команду в терминале

sudo dd if=~/Документы/ubuntu-20.04-beta-desktop-amd64.iso of=/dev/sdc status=progress

команда dd linux

Через несколько минут, я смогу загрузить свой компьютер с только что созданной флешки, и установить последнюю версию Ubuntu 20.04.

Я выписал основные идеи, но набор задач, которые можно решить с помощью небольшой программы, название которой состоит из двух букв, гораздо шире. Программа «dd» является ярким примером того, что ИТ называют «способом UNIX»: одна программа является частью механизма, выполняет только свою задачу и выполняет ее хорошо. В руках человека, который знает свое дело, у которого нестандартный подход к решению проблемы, такие небольшие программы помогут быстро и эффективно решать сложные задачи, которые, на первый взгляд, должны решаться большими специализированными пакетами.

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