dd_rescue FreeBSD

Что делать, если жесткий диск посыпался и при любых операциях с ним возникают input/output error ? Можно спасти данные
Проблема:
При любых операциях с жестким диском на консоль выводятся ошибки input/output error, система отключает диск (deattached device).
При попытке сделать fsck появляются ошибки "Unreadable sector" - sector **** couldn't be read .
Но - положительный момент - диск виден в биосе и определяется корректно.
Решение:
В несколько этапов. Восстанавливать данные будем пораздельно, так как в моем случае нужная информация (база данных и бэкапы) лежала в разделе /var ( устройство /dev/ad2s1e ). Но, в принципе, данный метод можно использовать для всех разделов, или даже для диска целиком. Правда, в этом случае время восстановления может быть достаточно большим.


1. Подключаем диск к гарантированно работающему серверу с FreeBSD (я использовал сервер с FreeBSD 6.2).
На сервере нам понадобится жесткий диск такого же объема как "осыпавшийся", а лучше большего.
2. Форматируем чистый диск под один большой раздел и монтируем его в директорию /mnt/newdisk .
3. Устанавливаем полезную утилиту dd_rescue


serv# cd /usr/ports/sysutils/dd_rescue && make install clean
Утилита dd_rescue интересна тем, что умеет менять размер считываемого блока при ошибке на устройстве, а также тем, что умеет делать реверсивный проход, тем самым увеличивая объем корректной информации. Подробности - в dd_rescue -h .


4. Создаем образ раздела в файле на новом диске.
serv# dd_rescue -v -l /mnt/newdisk/log_var /dev/ad2s1e /mnt/newdisk/var.dd
и смотрим на процесс. В моем случае раздел в 10 Гб копировался примерно 40 минут.
Дальше проделываем ту же самую операцию, но уже с реверсивным проходом:
serv# dd_rescue -v -r -l /mnt/newdisk/log_var /dev/ad2s1e /mnt/newdisk/var.dd
В итоге получаем копию раздела /var в файле var.dd


5. Создаем из файла устройство:
serv# mdconfig -a -t vnode -f /mnt/newdisk/var.dd -u 0
У нас получилось устройство /dev/md0


6. Отключаем soft-updates на полученном устройстве (этот шаг довольно часто необходим, так как иначе при fsck может удалиться большая часть данных):
serv# tunefs -n disable /dev/md0


7. Пробуем сделать fsck
serv# fsck /dev/md0
В моем случае оказался поврежден еще и супер-блок.
Восстанавливаем его по методике , описанной ранее, в статье "Incorrect Superlblock, восстановление superblock`a"


8. После этого fsck проходит корректно.


9. Монтируем устройство /dev/md0 и переносим данные на новый диск.


Mount /dev/md0 /DATA


Дополнения.


1. Почему dd_rescue а не простое dd ?
Во первых, двойной проход, во вторых - при использовании простого dd полученный образ раздела мониторвался, но на fsck машина жестко вешалась.


2. Утилиты и полезные команды:
dd_rescue - с этим ясно
mdconfig -a -t vnode -f /mnt/newdisk/var.dd -u 0 - создание блочного устройства из образа файла (нужно при монтировании раздела из образа).
mdconfig -d -u 0 - удаление этого устройства.
tunefs -n disable /dev/md0 - отключение soft-updates
Лучшие умы планеты советуют использовать специальную утилиту dd_rescue, с помощью которой можно провести копирование диска с двух сторон: первый проход с начала диска, второй - с конца. В результате на новом диске окажется вся информация за исключением проблемного участка.


Делаем первый проход:
# dd_rescue -v -y 1G -l sda.log -o sda.bb /dev/sda /dev/sdb


Когда диск начнет безумно шелестеть, нажмем <Ctrl+C>, чтобы завершить копирование, и запускаем процесс копирования с конца:
# dd_rescue -r -v -y 1G -l sda.log -o sda.bb /dev/sda /dev/sdb


Останавливаем процесс копирования после продолжительного шелеста диска и отключаем умирающего. Другая проблема - утрата таблицы разделов, которую еще совсем недавно было принято решать с помощью шестнадцатеричного редактора. Сегодня же проще применить утилиту gpart:
# gpart -W /dev/sda /dev/sda
Альтернатива gpart - testdisk, более мощная и гибкая программа с псевдо-графическим интерфейсом.

dd_rescue -v -l /data/newdisk/log_var //dev/ad4s1d

Обновлено: 12.03.2015