Заговор от битых кластеров (добавляем информацию для восстановления архивов с помощью par2)

Алексей Свешников

2008-07-30

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

Итак, к делу: регулярно, при записывании данных на диск, остается некоторое количество свободного места. Лет 5 назад можно было положить диск на полочку, пометив, что еще 30 мегабайт можно забить каким-нибудь хламом, но сейчас стоимость болванки - 10 рублей, и такой аргумент не действует. И, соответственно, привычку оставлять место "на потом" надо искоренять. Мне кажется, наиболее разумным было бы добавить на диск данные для восстановления — т.н. корректирующие коды Рида-Соломона, которые могут пригодится в случае, если диск будет поврежден.

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

#sudo aptitude install par2
#man par2
#cd backups
#ls
dump.sql.gz
#par2 create -v -r10 -n1 -m500 dump.sql.gz
#ls
dump.sql.gz dump.sql.gz.par2 dump.sql.gz.vol000+100.par2

Эта команда добавит 10% избыточной информации к данным, запишет все это в один файл, При этом программе par2 разрешено использовать 500 мегабайт оперативной памяти. Файлы *.par2 следует записать на диск вместе с дампом.

Мне эта программа понравилась, я захотел ее проверить в боевых условиях. Сделал архив размером около 400 Мб, добавил данные для восстановления, файлы *.par2 — еще 200Мб (50% избыточность, по умолчанию - 5%). Все это я записал на CD-RW, в котором потом сделал, простите, дырку. В итоге стандартными средствами удавалось прочитать только первые 150 Кб данных. Чтобы восстановить файл, нужно сначала все считать, пускай с ошибками — для этого есть программа dd_rescue, которая является практчески полным аналогом dd с одним исключением — она умеет игнорировать ошибки чтения:

#sudo dd_rescue -Av -b 1048576 -B 1048576 /dev/scd0 brokencd.iso

(-A — заполнять нулями те участки файла, которые считать не удалось, v - verbose, -b - размер блока данных, -B - размер блока данных для проблемных областей диска.)

# sudo mount -o loop brokencd.iso mnt # монтируем получившийся образ диска
# cp mnt/* dump; cd dump # копируем содержимое
# par2 r archive.par2 # приводим в изначальный вид

На этом эксперимент завершился - все данные с диска восстановлены. Даже скучно.

Но пример, мне кажется, весьма красноречив :)