Принесли на днях компьютер, который выполнял ранее роли офисного маршрутизатора, почтового сервера, офисной же файлопомойки и 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/
И так для каждого образа…
В общем, критически важную часть файлов удалось спасти.
На этом все.