Что делать, если жесткий диск посыпался и при любых операциях с ним возникают 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 и переносим данные на новый диск.
Дополнения.
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
Примерно так.
Надеюсь что поможет, так как помогло мне ![]()
З.ы. делайте бэкапы на внешние серверы
а вновь инициализированного рейда (зеркало) можно восстановить данные таким образом?
если диски были проинициализированы заново - эти действия не помогут.
В зависимости от контроллера инициализация происходит по разному, иногда затирается таблица разделов, и тогда, восстановив ее, можно вытянуть и данные. А иногда диски при инициализации переписываются посекторно …
Но в любом случае - это не вариант описанный в статье.