Клонирование диска в Linux с помощью команды dd
Всем нравится иметь копию диска, чтобы иметь возможность восстановиться. Даже если вы не хотите копию сейчас – вы захотите, когда ваш первый жесткий диск сломается. Он используется для клонирования всех данных с исходного диска эталонного дампа на диски нескольких хостов. Это сэкономит вам огромное количество времени. А вот какие есть варианты действий по клонированию диска — смотрим:
- иметь достаточно большой диск, чтобы сохранить дамп вашего хост-диска в файле на этом диске
- подключите несколько дисков к вашему локальному хосту и скопируйте его набор за набором
- подключить несколько дисководов к удаленным хостам и передать данные дисков хоста по сети на диски удаленных хостов
Все эти параметры доступны в командной строке Linux, их легко установить и понять. «Всё является файлом» в Linux: от драйвера диска к файлу с точки зрения прикладного уровня
«Все является файлом» в Linux
Давайте посмотрим, как выглядят разделы и файлы диска в Linux:
Тело скрипта:
#!/usr/bin/env bash ls -l /dev/sda5 ls -l just_a_file
ls — это команда для вывода списка выбранных файлов по именам: /dev/sda5 — это специальный файл, связанный с разделом диска, а just_a_file — это файл в файловой системе, отображаемый консолью. В чем разница на выходе? Первая буква « b » показывает, что /dev/sda5 — это файл блочного устройства, а не просто файл. Давайте посмотрим изнутри Linux: глобальная концепция хранения данных и манипулирования ими в Linux — « все есть файл ». Это означает, что даже устройства с точки зрения Linux могут быть представлены в виде файлов. В глубине кода ОС вы можете обнаружить, что файл представляет собой абстрактный экземпляр, который имеет несколько хорошо структурированных функций, специфичных для даты, которую он содержит:
- функция чтения
- функция записи
- функция открытия (для корректного доступа к данным на нескольких считывателях/писателях)
- закрыть функцию
- функция ioctl (функция очень специфических действий для файлов драйверов устройств)
В этой концепции жесткий диск представлен в виде файла в папке /dev/ . Как файл, этот жесткий диск имеет определенную функцию чтения. Это чтение действует как любое чтение данных файла в любой программе прикладного уровня. Итак – мы можем прочитать запись HDD. Мы будем в логике, если в этом файле также определена функция записи.
Как обнаружить файлы на диске ?
Резонный вопрос — как определить файл и «размер файла» для копии. Это возможно с помощью утилит Linux « lsblk » и « df ». Первая утилита список файлов блочных устройств системы. Вторая утилита показывает размер устройства в блоках.
Тело скрипта lsblk:
#!/usr/bin/env bash lsblk
консоль выполнения скрипта lsblk:
При выводе в консоль мы видим файл диска « /dev/sda » с подфайлами, представляющими разделы этого диска: « /dev/sda1 », « /dev/sda2 », « /dev/sda3» .
тело скрипта df:
#!/usr/bin/env bash df /dev/sda
На выходе консоли мы видим размер файла нашего устройства в блоках по 1К.
dd — стандартная утилита дампа диска Linux
Теперь давайте посмотрим на стандартную утилиту Linux для создания дампа диска « dd ». « dd » работает с файлами (именно с потоками данных) на входе и выходе и просто получает данные из входного файла блок за блоком и передает эти данные в выходной файл . У утилиты «dd» есть несколько рабочих параметров — мы рассмотрим основные параметры и рассмотрим, как их использовать.
рабочий формат dd с основными широко используемыми параметрами:
dd [if=<input_file>] [of=<output_file>] [bs=<number_of_bytes_at_the_single_io_operation>] [count=<number_of_block_to_be_dumped>]
дд текущие заметки:
Параметр if можно уменьшить — в случае сокращения входные данные будут собираться из стандартного потока ввода приложения. Параметр « of » может быть уменьшен — в случае сокращения вывод направляется в стандартный поток вывода приложения. Параметр « bs » может быть уменьшен – в случае уменьшения будет выбран какой-либо системный параметр по умолчанию. Параметр « count » может быть уменьшен — в случае уменьшения все записи входного файла dd param будут сбрасываться в приемник параметров выходного файла dd.
(Для работы с dd у вас должны быть root-права. Пожалуйста, убедитесь, что вы собираетесь это делать — ваши данные могут быть повреждены неправильными действиями)
Использование dd для хранения дампа диска в файле:
Теперь мы переходим один за другим к случаям использования, чтобы посмотреть, как использовать « dd ». Во-первых, давайте рассмотрим сохранение образов дисков в файл. В нашем случае мы будем копировать клон образа диска устройства cdrom в файл, который укажем.
dd диск в тело скрипта клонирования файла:
#!/usr/bin/env bash dd if=/dev/sr0 of=cdrom_disk_dump_file ls -l cdrom_disk_dump_file rm cdrom_disk_dump_file
dd диск в файл скрипт клонирования, работающий в консоли:
Как мы видим при выводе в консоли, сырой дамп cdrom был скопирован в файл на нашем диске со скоростью 392Mb/s. Пропускная способность может варьироваться в зависимости от типа используемого диска и выбранного параметра « bs ». « 1457256 + 0 » - это количество блоков, скопированных и скопированных при запуске « dd ».
(обратите внимание, что /dev/sr0 — это имя компакт-диска в моей системе — ваша система может содержать другие имена)
Использование dd для хранения необработанного образа диска на другом диске, подключенном к хосту:
Как упоминалось ранее, очень полезно клонировать основной диск как есть: с одного диска на другой. « dd » также полезен в этом случае.
dd клонировать необработанный образ диска в другое тело сценария диска:
#!/usr/bin/env bash lsblk /dev/sda /dev/sdb sudo dd if=/dev/sda /dev/sdb bs=1k lsblk /dev/sda /dev/sdb
dd клонировать необработанный образ диска на другой сценарий диска, запущенный в консоли:
Как мы видим, на целевом диске копирования /dev/sdb нет данных. Но после копирования структура раздела /dev/sda становится равной структуре /dev/sdb .
Примечание. Обратите внимание, что здесь необходима команда «sudo», чтобы иметь права root для работы непосредственно с файлом dev.
Сохраните дамп диска на другом хост-диске, подключенном к сети.
В этом примере мы будем транслировать дамп нашего диска по сети с помощью утилиты nc . Эта утилита будет запущена на нашем хосте для передачи данных в сеть и получения их из сети. Он будет выполняться локально, но вы можете написать сценарии отправки и получения на разных хостах.
Скрипт отправки тела дампа диска:
#!/usr/bin/env bash lsblk /dev/sda /dev/sdb sudo dd if=/dev/sda | nc -l
dd здесь не имеет параметра « of » — в этом случае он будет писать в стандартный поток вывода . Этот поток перенаправляется на следующий стандартный входной поток вызова nc с помощью « | “. nc передает данные диска по TCP-соединению на порт 9000 « localhost » (вне текущего хоста). Нам нужен только соответствующий прослушиватель TCP на порту 9000, чтобы добиться успеха. Оно последует дальше.
Скрипт получения тела дампа диска:
#!/usr/bin/env bash lsblk /dev/sda /dev/sdb nc -l 9000 | sudo dd of=/dev/sdb bs=1M lsblk /dev/sda /dev/sdb
Здесь мы прослушиваем TCP-соединение на порту 9000 с помощью nc. Далее nc передает все данные соединения в стандартный поток вывода nc . Это передается в стандартный поток ввода dd с помощью « | ” команда перенаправления. dd не имеет здесь параметра « if » — в этом случае он получит стандартный поток ввода в качестве ввода (имеется в виду стандартный поток вывода nc ). В итоге мы видим, что структура разделов /dev/sdb совпадает с /dev/sda , как и ожидалось.