2 июл. 2008 г.

Делаем образы дисков с помощью dd и gzip

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

Недавно в ходе нескольких экспериментов выяснил, что такой образ диска можно сильно сжать с помощью GZip.

Например, заполненный на около 5Гб NTFS-раздел объемом 31Гб в сжатом состоянии занимает всего 1.7Гб. Единственное неудобство в том что на моем AMD Athlon 1700+ создание этого образа заняло 50 минут, а подсчет md5-суммы раздела-оригинала и упакованного образа по 12 минут. На системах с более производительным центральным процессором данный процес займет гораздо меньше времени.

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

В ходе тестов на различных разделах степень компрессии несколько шокировала. Например, FAT-16 раздел размером 40Гб был сжат до 30МБ (контрольные суммы проверил - они совпали)!!!

Создаем образ:
#dd if=/dev/sda1 bs=8096 | gzip -9cf > sda1.dd-image.gz

Это занимает время. За процессом можно наблюдать на той же консоли с помощью периодической посылки USR1 сигнала процессу dd.
Для этого на другой консоли выполняем:

#ps | grep dd
определяем pid процесса dd и подставляем его в следующую команду
#watch -n 15 "kill -USR1 $pid_of_dd"

Распаковка образа:
#gunzip -c sda1.dd-image.gz | dd of=/dev/sda1 bs=8096

также можно подсчитать md5-сумму для раздела, чтобы после восстановления проверить правильность распаковки образа:
#dd if=/dev/sda1 bs=8096 | md5sum - > sda1.dd-image.md5

Параноики (бывают ситуации когда лучше потратить время на еще одну перепроверку) могут еще и проверить правильность создания образа:
#gunzip -c sda1.dd-image.gz | md5sum

Приятной всем работы ;)

13 комментариев:

Анонимный комментирует...

В натуре затейник, как сделал то разел FAT-16 на 40 гигов?
У нег ж ограничение на 2 гига, ну или с шаманством 4 предел.
Где опечатка? жир32 на 40 или жир16 на 4?

brandy комментирует...

Действительно,
FAT-16 раздел размером 40Гб. Точно ФАТ-16? даже если ФАТ-32... ФАТ-32 точно умеет 40 гиг адресовать? Может таки НТФС?

Unknown комментирует...

brandy, по ограничениям на размер FAT-16 ничего не скажу, а вот FAT-32 точно помню, что винда (хотя это винда) делала разделы и по 80 гиг...

а вообще на той машине стоит UnixWare (не я ее туда засунул), может тот раздел не FAT-16, но обозначен он именно так...

Unknown комментирует...

Правда мог только размер партиции попутать... проверить пока немогу - машина в ремонт ушла :)

brandy комментирует...

Та может действительно, показало что FAT16, хотя на самом деле был FAT32.

brandy комментирует...

И еще:
#dd if=/dev/sda1 bs=8096 | md5summ - > sda1.dd-image.md5

после md5summ минусик не нужен вроде? Только перенаправление вывода?

Unknown комментирует...

Конечно не md5summ, a md5sum (поправил).

А насчет минуса - читал ман, прежде чем писать, там говорится что можно с минусом, можно без. Я решил минус указывать для так сказать надежности ;)

Анонимный комментирует...

То что 40 гигов вжались в 30 мег просто повезло. Зависит только от содержимого раздела. Если раздел будет забит фильмами ави или музыкой мрз, почти ничего не сожмется.

И еще, bzip2 медленнее, но намного эффективнее жмет.

Leoric комментирует...

это смотря насколько 40 гигов заполнены. пустые сектора сжимаются практически в ноль :)

Unknown комментирует...

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

Анонимный комментирует...

Для поиска PID по названию, наверное, лучше использовать pidof

Кстати, странно, но "у меня все работает"(с) и для bzip'а. Конечно маловероятно, но может системно специфичное(у меня Дэбиан, на чем проверял автор не знаю).
Может стоить попробовать скормить так:

dd if=... | bzip2 - > file

Вроде бы тире должно быть указателем на stdin.

На дисках я не проверял, но файл bzip'ом и сжать и восстановить можно, только имя теряется (не самая важная инфа для диска).

Unknown комментирует...

У меня стоит Slackware 12.

Пробовал bzip2 впервую очередь. и именно по тому что жмет лучше.
Сейчас не скажу пробовал ли в качестве параметра ему скармливать "-", но провозившись 2 часа так и не получил результата..

Анонимный комментирует...

Для создания образов ntfs лучше применять утилиту ntfsclone (из ntfsprogs) в сочетании с gzip или bzip2. Эта утилита создает образы, совместимые с dd, но заменяет неиспользуемое пространство на диске (например, сектора, на которых раньше хранились стертые файлы) нулями, что экономит место на диске, на котором хранятся образы.