Восстановление файлов с сыпящегося винта (ОС FreeBSD)

Принесли на днях компьютер, который выполнял ранее роли офисного маршрутизатора, почтового сервера, офисной же файлопомойки и VPN-сервера для нескольких внешних подключений.
Проблема заключалась в том, что начал сыпаться винт. К слову, на машинке установлена FreeBSD, которая проработала там довольно солидный срок.
Так вот, в связи с неизбежной гибелью винта, невозможным стал вход в систему даже в single-user режиме.
Естественно, первым делом был скачан LiveCD Frenzy (версия 1.3, если что).

Загрузка прошла удачно, но dmesg оказался засранным вот такими сообщениями:

ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: FAILURE - READ_DMA status=51 error=84 LBA=63
ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: FAILURE - READ_DMA status=51 error=84 LBA=63
ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: FAILURE - READ_DMA status=51 error=84 LBA=63
ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: FAILURE - READ_DMA status=51 error=84 LBA=63

Сначала я выставил режим доступа к устройству в PIO4:

atacontrol mode ad0 pio4

Далее смонтировал корень файловой системы:

mkdir /mnt/root
mount -o ro /dev/ad0s1 /mnt/root

… и посмотрел содержимое /etc/fstab (поскольку с данным компьютером я столкнулся впервые, и как был разбит жесткий диск не имел понятия):

cat /mnt/root/etc/fstab
# See the fstab(5) manual page for important information on automatic mounts
# of network filesystems before modifying this file.
#
# Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1b none swap sw 0 0
/dev/ad0s1a / ufs rw 1 1
/dev/ad0s1h /spool ufs rw 2 2
/dev/ad0s1e /tmp ufs rw 2 2
/dev/ad0s1g /usr ufs rw 2 2
/dev/ad0s1f /var ufs rw 2 2
proc /proc procfs rw 0 0

Естественно, первым желанием было перемонтировать корневую в rw-режим, зачрутиться и смонтировать все остальное. Но увы:

ls /dev | grep ad0
ad0
ad0s1
mount -o rw /dev/ad0s1 /mnt/root/
mount: /dev/ad0s1 : Operation not permitted

Тем не менее, был слегка удивлен (объяснить не могу — опыта да знаний не так уж много) когда после неудачного монтирования в rw-режиме увидел:

ls /dev|grep ad0
ad0
ad0s1
ad0s1a
ad0s1b
ad0s1e
ad0s1f
ad0s1g
ad0s1h

Отлично! В связи с тем, что ФС есть возможность монтировать только в ro-режим, в /mnt создал для каждой ФС отдельный каталог:

mkdir spool
mkdir usr
mkdir var

И, для того, чтобы убедится, что данные на этих ФС сохранились — примонтировал каждый из них:

mount -o ro /dev/ad0s1h /mnt/spool/
mount -o ro /dev/ad0s1g /mnt/usr
mount -o ro /dev/ad0s1f /mnt/var

Однако, некоторое время спустя, при копировании нужных файлов с этих ФС, получил панику ядра Frenzy (один 5-килобайтный файл, перед этим, копировался минуты две).
Пришлось перезагрузиться, выплонить часть вышеуказанных действий, покурить_и_подумать.
Решил схитрить, поднял на рабочей машинке nfs-kernel-server. Расшарил один из каталогов для Frenzy.
На самой Frenzy решил использовать утилиту dd, с целью создания образов разделов, переноса их на одну из FreeBSD-машин, монтировании их там и, собственно, извлечении данных.

dd if=/dev/ad0s1h of=/root/spool.img
dd if=/dev/ad0s1g of=/root/usr.img
dd if=/dev/ad0s1f of=/root/var.img
mkdir /mnt/share; mount freebsd.local:/srv /mnt/share
cp /root/spool.img /mnt/share/
cp /root/usr.img /mnt/share/
cp /root/var.img /mnt/share/

Далее, уже на FreeBSD-машине, выполнил ряд действий, необходимых для монтирования образов:

mdconfig -a -t vnode -f spool.img -u 5
mdconfig -l -u md5
mkdir spool
mount -r /dev/md5 spool/

И так для каждого образа…
В общем, критически важную часть файлов удалось спасти.
На этом все.

Добавить комментарий

Ваш адрес email не будет опубликован.