> Буду рад любым советам!!!_____________________________________________
> Зараннее спасибо!_
Впринципе восстановить данные можно, но надо знать формат таблицы разделов (это не проблема - описано во многих местах, например http://www.microsoft.com/TechNet/prodtechnol/windows2000serv/reskit/serverop/part1/sopch01.asp?frame=true#b )и примерно помнить как был разбит диск. Предположим спасать будем /dev/ad2.
Нам потребуется какой нибудь HEX-редактор - можно воспользоваться hexedit или миднайт коммандером (F3 -> F4 -> F2)
Во первых надо найти начало FreeBSDшного слайса. Это можно сделать зная, что в начале находится загрузочный сектор раздела (его копия находится в /boot/boot1).
hexdump -C boot1
00000000 eb 3c 00 00 00 00 и т.д. (Внимание! Это - у меня на FreeBSD-5.1, но есть вероятность,что в другой версии boot1 будет слегка отличаться.)
Теперь поищем где находятся первые несколько байт в теле нашего пациента:
hexdump -C /dev/ad2 | grep "eb 3c 00"
Как только на экране появится строчка вроде этой
00007e00 eb 3c 00 00 00 00 00 00 00 00 00 00 02 00 00 00 |К<..............|
жмём CTRL-C - остальное нам не интересно.
Итак, обнаружили, что начало фришного слайса находится по смещению 00007e00 байт от начала диска. Разделим на размер сектора 512 байт (шестнадцатеричное - 200).
0x7E00 / 0x200 = 0x3F (т.е. сектор номер 63)
Теперь примемся за создание нового MBR.
Вернее его жалкого подобия т.к. восстановить информацию о разделах в формате CHS весьма и весьма затруднительно, не имея точной копии правильного MBR. А имея - не нужно всё остальное (диалектика, блин :-)). Поэтому мы ограничимся восстановлением записи в фришном слайсе только в формате LBA, что не даст нам возможности загрузиться с этого диска, но по крайней мере мы сможем его подмонтировать и спасти информацию.
Для этого нам необходимо вспомнить какой был номер у раздела и его размер (если точный размер забыт навсегда, то хотя бы приблизительный плюс добавим ещё немного для гарантии, что в этот размер влезет весь слайс. Нам ведь не надолго надо - только спасти файлы ;-], а потом всё равно нужно будет переразбить правильным образом).
Таблица разделов находится в MBR по смещению 0x01BE (446) и состоит из 4 записей по 16 байт.
В таблице разделов нас интересует следующее:
Таблица 1
Смещение Размер_поля
0x01BE BYTE #Указывает, что запись является загрузочной (0x80). Нам это не нужно, поэтому поставим 0.
0x01C2 BYTE #Номер раздела. FreeBSD слайс = 0xA5
0x01C6 DWORD #Номер первого сектора раздела. У нас 0x0000003F
0x01CA DWORD #Размер раздела (слайса) в секторах.
Предположим мы приняли размер слайса = 20 000 000 000
20 000 000 000 байт / 512 = 39062500 секторов (шестнадцатиричное 0x02540BE4).
Важное замечание: В таблице разделов все многобайтовые числа записываются в формате little endian, т.е. младший байт записывается слева, старший - справа. В нашем случае:
Номер первого сектора раздела (0x0000003F) => 3F 00 00 00.
размер слайса (0x02540BE4) => E4 0B 54 02
Последние 2 байта MBR должны быть всегда равны 0xaa55 (little endian => 55 aa) (не забудем в этом убедиться).
В качестве заготовки возьмём стандартный MBR, копия которого находится в /boot/mbr
cd /boot
cp mbr ad2.mbr
Теперь займемся собственно редактированием ad2.mbr. Я предпочёл воспользоваться клавишей F3 в мид. коммандере. F3 -> F4 -> F2.
Должно получиться что-то вроде этого (в предположении, что FreeBSD слайс находится в первой записи таблицы разделов. Если это не так - ко всем смещениям из таблицы 1 прибавить нужное колличество 16-байтовых блоков!
...
пропущено
...
000001A0 00 00 00 00 │ 00 00 00 00 │ 00 00 00 00 │ 00 00 00 00 ................
000001B0 00 00 00 00 │ 00 00 00 00 │ 00 00 00 00 │ 00 00 00 00 ................
000001C0 00 00 A5 00 │ 00 00 3F 00 │ 00 00 E4 0B | 54 02 00 00 ..╔...?...ДkT...
000001D0 00 00 00 00 │ 00 00 00 00 │ 00 00 00 00 │ 00 00 00 00 ................
000001E0 00 00 00 00 │ 00 00 00 00 │ 00 00 00 00 │ 00 00 00 00 ................
000001F0 00 00 00 00 │ 00 00 00 00 │ 00 00 00 00 │ 00 00 55 AA ..............U╙
Здесь 000001BE => 00 и т.д в соответствии с таблицей 1
Отредактировали - записываемся/выходим.
Остался последний штрих - заливка ad2.mbr в MBR пациента :
dd if=ad2.mbr of=/dev/ad2 bs=512 count=1
Убеждаемся что слайс восстановился:
fdisk /dev/ad2
******* Working on device /dev/ad2 *******
parameters extracted from in-core disklabel are:
cylinders=4960 heads=16 sectors/track=63 (1008 blks/cyl)
Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=4960 heads=16 sectors/track=63 (1008 blks/cyl)
Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
start 63, size 5078125 (2479 Meg), flag 0
beg: cyl 0/ head 0/ sector 0;
end: cyl 0/ head 0/ sector 0
The data for partition 2 is:
<UNUSED>
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
<UNUSED>
(числа будут другими!)
disklabel /dev/ad2s1
# /dev/ad2s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 524288 0 4.2BSD 2048 16384 32776
b: 1022688 524288 swap
c: 4999617 0 unused 0 0 # "raw" part, don't edit
d: 524288 1546976 4.2BSD 2048 16384 32776
e: 524288 2071264 4.2BSD 2048 16384 32776
f: 2404065 2595552 4.2BSD 2048 16384 28552
disklabel: partition c doesn't cover the whole unit!
disklabel: An incorrect partition c may cause problems for standard system utilities
(числа будут другими! На предупреждения внимания не обращаем!)
Всё! Вуаля!
Монтируем что нибудь:
mount /dev/ad2s1f /mnt/test
Спасаем файлы ...
Удачи...