Восстановление разделов,удалённых файлов на HDD,FLASH и т.д в Linux

Всем привет! Всех с Рождеством.
Праздники продолжаются, а значит есть время для статей.
Сегодня будем восстанавливать убитые, повреждённые разделы Вашего HDD,Flash и т.д

Если диск или раздел уже упал, то Вам понадобится загрузочный дистрибутив Linux.
Рекомендую System Rescue CD т.к он создан именно для этого.
Главное ничего не делать с жёстким диском.

Приступим:

1) Вставляем Ваш Flash, Live CD в реанимируемый ПК
Грузимся... Первое что потребуется - это определить файловые системы диска.
Для этого есть команда sfdisk -l
Подробнее можно посмотреть командой file -s
Пример:
localhost root ~ # sfdisk -l /dev/sda

Диск /dev/sda: 9729 цилиндров, 255 головок, 63 секторов/дорожку
Предупреждение: Таблица разделов выглядит так,
словно она была создана для C/H/S=*/240/63
(вместо 9729/255/63).
Для листинга будет подразумеваться эта геометрия.
Единицы = цилиндры по 7741440 байт, блоки по 1024 байт, начиная с 0

Устр-во Загр Нач Конец #цил #блоки Id Система
/dev/sda1 0+ 516 517- 3908488+ 82 Linux своп / Solaris
/dev/sda2 517 555 39 294840 83 Linux
/dev/sda3 556 5722 5167 39062520 83 Linux
/dev/sda4 5723 10336 4614 34881840 83 Linux

localhost root ~ # file -s /dev/sda1
/dev/sda1: Linux/i386 swap file (new style) 1 (4K pages) size 977121 pages

localhost root ~ # file -s /dev/sda2
/dev/sda2: ReiserFS V3.6 block size 4096 num blocks 73696 r5 hash

Посмотрели? Выбрали что нужно восстановить.

2) Создаём образ диска/раздела с помощью команды dd и ложем его на другой целый накопитель /dev/sdb1
Это нам даст шанс на ошибку, если что-то пойдёт не так. С образом Мы и будем работать, дабы не насиловать и без того порченный HDD.
Пример:
mount /dev/sdb1 /mnt/temp
dd if=/dev/sda1 of=/mnt/temp/disk.ima conv=noerror

Опция conv=noerror говорит о том, что dd следует продолжить считывание несмотря на ошибки чтения, которые, в большинстве случаев, присутствуют на поврежденных дисках.
Так-же можно поиграться с параметром bs для ускорения копирования

И ещё, образ можно скинуть по сети:
dd conv=noerror if=/dev/sd1 | ssh user@host ‘cat >
recover.img’

И сжать в добавок
dd conv=noerror if=/dev/sda1 | gzip | ssh user@host
‘gunzip > recover.img’

3) Образ получили. Теперь его нужно ассоциировать с виртуальным устройством, что-бы с ним работать как с обычным разделом/накопителем
Делается это командой losetup
Пример:
losetup /dev/loop1 /mnt/temp/disk.ima

И получим свой раздел, в качестве полноценного устройства.
Его можно просто смонтировать и работать. Или приступать к восстановлению.
Правда он доступен только для чтения.

Обойти это можно. Для этого нам понадобится создать файл, который будем использовать как виртуальный накопитель.
Делается это командой dd

Пример:

Создать файл размером 30мб
Размер задаётся тут count=30720
dd if=/dev/zero of=/tmp/virtualfs.ima bs=1024 count=30720

Затем его ассоциируем с /dev/loop2
losetup /dev/loop2 /tmp/virtualfs.ima

И просто форматируем, в какую FS хотите.
mkfs.ext3 /dev/loop2

После можно командой dd накатить на него образ раздела/диска или смонтировать и работать.
dd if=/mnt/temp/disk.ima of=/dev/loop2

4) А как-же быть если мы сняли образ целого HDD с его разделами?
Очень просто.
После того, как Вы смонтировали/ассоциировали образ нужно посмотреть его разделы
Делается это с помощью команды fdisk
Пример:
Даём команду fdisk [имя диска или утройства]
Затем жмём ключ p для просмотра разделов

$ fdisk -u /dev/loop3


Command (m for help): p

Disk /dev/loop1: 4194 MB, 4194816000 bytes
128 heads, 63 sectors/track, 1015 cylinders, total 8193000 sectors
Units = sectors of 1 * 512 = 512 bytes

Device                  Boot      Start       End                 Blocks               Id           System
/dev/loop3p1      *             63          8176895       4088416+      7            HPFS/NTFS

Command (m for help): q

Здесь нам нудны след. значения.
а) Units = sectors of 1 * 512 = 512 bytes т.е размер сектора 512 bytes
б) Начальный сектор раздела. В примере 63

Дальше всё просто. умножаем 63 на 512 и получаем число 32256

Даём команду :
losetup -o 32256 /dev/loop4 /mnt/temp/disk_full.ima

И получаем на /dev/loop4 выбранный раздел.

Затем монтируем его и пользуемся.

Удалить все ассоциации можно командой
losetup -d /dev/loop[0,1,2,3,4 и т.д]

5) Вроде всё.
После восстановления можно накатить образ обратно на диск или скопировать нужные файлы.
Про утилиты восстановления писать нет смысла, да и я ими пользовался то 1 раз в жизни когда раздел упал.

Почитать материалы можно по след. ссылкам:
http://boombick.org/blog/posts/17
http://www.faqs.org/docs/Linux-mini/Loopback-Root-FS.html
http://www.walkernews.net/2007/07/01/create-linux-loopback-file-system-on-disk-file/
http://qemu-forum.ipi.fi/viewtopic.php?p=12362

UPD:
Скрипт для автоматического монтирования разделов из образа диска, созданного с помощью dd


INFILE=/path/to/your/backup.img; MOUNTPT=/mnt/foo; PARTITION=1; mount "$INFILE" "$MOUNTPT" -o loop,offset=$[ `/sbin/sfdisk -d "$INFILE" | grep "start=" | head -n $PARTITION | tail -n1 | sed 's/.*start=[ ]*//' | sed 's/,.*//'` * 512 ]

Пояснение:
Делаете образ диска, например вот так:
dd if=/dev/sda of=/mnt/disk/backup.img

Опция PARTITION=1 задаёт количество разделов для монтирования (Узнать можно с помощью sfdisk -d yourfile.img).

Оригинал:
blog comments powered by Disqus