Работа с образами дисков: команды dd, ddrescue.
Life-Hack - Linux/Хакинг/Хакер/ИБ/OsintУтилита dd (от англ. «data duplication») — это мощный инструмент командной строки, который позволяет копировать и конвертировать данные между различными источниками и назначениями. Она широко используется в Linux и является незаменимым инструментом для работы с дисками и образами дисков.
Копирование содержимого диска в образ
dd if=/dev/sda of=/home/user/image.img
В этом примере утилита dd копирует содержимое диска /dev/sda в файл /home/user/image.img. Этот файл будет содержать полный образ диска, включая файловую систему и данные.
Создание загрузочного USB-накопителя
dd if=/path/to/iso/file.iso of=/dev/sdb bs=4M status=progress
Этот пример демонстрирует, как создать загрузочный USB-накопитель из образа диска ISO. Утилита dd записывает содержимое файла ISO на накопитель /dev/sdb, используя блочный размер 4M и отображая прогресс операции.
Запись образа на диск
dd if=/home/user/image.img of=/dev/sda
В этом примере утилита dd записывает содержимое образа /home/user/image.img на диск /dev/sda. Это может быть полезно, если вы хотите быстро восстановить диск из образа или скопировать содержимое диска на другой диск.
Удаление данных с диска
dd if=/dev/urandom of=/dev/sda bs=4M status=progress
В этом примере утилита dd записывает случайные данные с /dev/urandom на диск /dev/sda. Это может быть полезно, если вы хотите полностью удалить данные с диска перед его утилизацией или продажей.
В то время, как утилита dd является универсальным инструментом для копирования данных, утилита dd_rescue предназначена исключительно для копирования файловых систем с потенциально поврежденных носителей. При использовании стандартных параметров dd_rescue работает примерно так же, как и утилита dd с параметрами conv=noerror,sync, но при этом выполняет операции чтения гораздо быстрее. При этом dd_rescue поддерживает следующие дополнительные функции:
- Переключение между двумя размерами блоков при копировании данных для восстановления максимального объема данных.
- Обратное копирование данных, то есть, копирование данных до и после поврежденной области.
Базовый синтаксис команды выглядит следующим образом:
# dd_rescue [параметры] <файл устройства> <файл образа>
Утилита поддерживает большое количество различных параметров, но при этом отлично работает даже в том случае, если пользователь не использует их. Наиболее важными параметрами являются параметр -b, позволяющий задать размер блока устройства, параметр -B, позволяющий задать размер блока, используемый в случае обнаружения ошибки, параметр -d, позволяющий осуществлять копирование в обход механизма кэширования файловых систем, параметр -r, активирующий режим обратного копирования данных, параметр -k, активирующий режим zero-copy на уровне ядра ОС для повышения скорости операций копирования, а также параметр -o, позволяющий создать файл с номерами поврежденных блоков по аналогии с утилитой badblocks.
Простейший пример использования утилиты заключается в восстановлении данных с неисправного жесткого диска. Предположим, что в нашем случае таким жестким диском является диск, представленный файлом устройства /dev/sda1. В случае неполадок жесткого диска система будет работать как и прежде, но время от времени будут выводиться сообщения о невозможности чтения данных из поврежденных секторов. Это означает, что диск нуждается в замене, а доступные данные из его разделов должны быть немедленно скопированы на исправный жесткий диск, на котором впоследствии могут быть предприняты действия, направленные на восстановление файловых систем. (Попытки их восстановления на неисправном жестком диске с большой вероятностью закончатся ничем, причем дополнительная активность этого диска может привести к повреждению большего объема хранящихся на нем данных.)
В случае использования утилиты dd обычно выполняются следующие подготовительные действия:
- На новом жестком диске создается целевой раздел (например, он будет представлен файлом устройства /dev/sdb1) того же размера, что и раздел на неисправном жестком диске.
- Утилита dd используется для копирования данных из исходного раздела неисправного жесткого диска в целевой раздел нового жесткого диска с игнорированием ошибок:
# dd if=/dev/sda1 of=/dev/sdb1 bs=4096 conv=noerror,sync
Таким образом можно восстановить уцелевшие данные, но вам в любом случае придется передавать утилите фиксированное значение, соответствующее размеру блока. Так как dd работает с параметрами conv=noerror,sync, при выявлении ошибки в процессе копирования данных все следующие за ней данные блока будут заменены нулевыми байтами. Блоки больших размеров будут копироваться быстрее, но при каждой ошибке часть данных из этих блоков будет игнорироваться. Блоки меньших размеров минимизируют потери данных, но копирование этих блоков занимает больше времени во-первых, потому, что процесс чтения и записи небольших по размеру блоков данных является менее эффективным и во-вторых потому, что в случае выхода поврежденного сегмента за пределы блока небольшого размера время будет теряться на попытки чтения поврежденных секторов, которые в противном случае были бы просто пропущены.
Утилита dd_rescue может выполнять те же действия, что и утилита dd в примере выше, но при этом позволяет восстанавливать больший объем данных, чем dd с параметром bs=4096 и быстрее работает с блоками меньшего размера. А это аналогичная команда:
# dd_rescue /dev/sda1 /dev/sdb1
Данная команда будет копировать данные блоками по 64 Кб до момента обнаружения ошибок — в этом случае будут использоваться блоки размером в 512 байт до того момента, пока множество таких блоков не будет скопировано без ошибок, после чего утилита снова начнет копировать данные блоками размером в 64 Кб.