Рубрика: FreeBSD Автор: Hottab :: Суббота 20 марта 2010 в 22:06

Что делать, если жесткий диск посыпался и при любых операциях с ним возникают 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

Примерно так.
Надеюсь что поможет, так как помогло мне :)
З.ы. делайте бэкапы на внешние серверы :)


2 комментариев »

  1. Comment от FreeOwl — 12 августа 2010 @ 12:48

    а вновь инициализированного рейда (зеркало) можно восстановить данные таким образом?

  2. Comment от Hottab — 29 сентября 2010 @ 20:34

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

    В зависимости от контроллера инициализация происходит по разному, иногда затирается таблица разделов, и тогда, восстановив ее, можно вытянуть и данные. А иногда диски при инициализации переписываются посекторно …

    Но в любом случае - это не вариант описанный в статье.

Оставить комментарий

CAPTCHA изображение Аудио версия
Перезагрузить изображение

Copyright © 2009 Горячий [TAB].