Понадобилось поднять еще один комп старенький для tftpd, bootpd и разной мелочи
Я присобачил винт в FreeBSD, зашел в sysinstall, разбил разделы на новом винте
(немного помучался с ad2s1e ad2s1a пока не додумался поменять mountpoint)
Вышел, проверил disklabel -r ad2, disklabel -r ad2s1 - все в порядке
Сделал dump/restore из / в /mnt/root и проч разделы.
поскольку новый винт маленький - решил порты там не держать а монтировать по NFS.
подмонтировал /usr/ports в /mnt/root/usr/ports сделал chroot в /mnt/root
там собрал необходимый софт и поменял конфиги вышел, размонтировал, выключил,
переставил, включил новую машину, посмотрел на загрузку, дождался загрузки sshd,
посмотрел на интерфейсы, залогинился локально, попинговал разные хосты
Посмотрел на часы и решил доделать на след. день
Сегодня пришел - новая машина грузится и работает а старая нет!
Подключил вчера_сделанный_винт, загрузился с него - а на старом
MBR и Partition table пустые и чистые!!! :(((
если бы винты были бы одинаково побитые я бы копию слил а так не
знаю как можно восстановить
Жалко все дистфайлы по новой тянуть
Можно ли таблицу разделов ручками восстановить???
Сообщение от idLe:
К сожалению, дельного совета дать не смогу, пожалуй только поделюсь
печальным опытом. Как-то я тоже умудрился запортачить таблицу
разделов на домашнем компе, скопировав загрузчик с обычного раздела
в MBR. Часа три потом мы маялись, пытаясь его восстановить, только
потом случайно наткнулись на дискетку с старым backup-ом mbr,
который делает винда при установке. Не знаю, что бы без нее делали
;).
> MBR я на место засун
Таблица разделов находится _внутри_ 512-байтной MBR, со смещением
1BEh и длиной 65 (41h) байт. Поэтому по логике, если вы
восстановили MBR, то и таблицу разделов.
Сообщение от Alex_M:
Впринципе восстановить данные можно, но надо знать формат таблицы
разделов (это не проблема - описано во многих местах, например
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 |К 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:
The data for partition 3 is:
The data for partition 4 is:
(числа будут другими!)
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
Спасаем файлы ...
Удачи...
Сообщение от tin:
Всем огрогмное спасибо..
Все оказалось проще, чем я мог предположить
Как известно kernel хранит копию partition_table в памяти
я подумал, что может он ее когда-нть в своп ложил и захотел
проверить
Я помню что
ad0s1a у меня был 256М размером, или 512000 блоков
ad0s1e - 256M столько-же
ad0s1f - 2G или 1024*1024*4 = 4194304 блоков
ad0s1g я добавлял позже и лежит он после свопа
в принципе этого бы хватило чтоб восстановить разделы
считаю смещение свопа 512000*2+4194304=5218304
логично, что ad0s1b (swap) лежит на винте со смещением 5218304 или
около того.
Дальше проще
dd if=/dev/ad0 of=/tmp/swap_img bs=512 count=2000 iseek=10192
strings /tmp/swap_img | grep "disk: ad0s1" -A25 -B25 > /tmp/result
теперь смотрю в /tmp/result и нахожу там мою таблицу в виде
type: ESDI
disk: ad0s1
label:
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 185
sectors/cylinder: 11655
cylinders: 5152
sectors/unit: 60046560
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # milliseconds
track-to-track seek: 0 # milliseconds
drivedata: 0
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 512000 0 4.2BSD 0 0 0 # (Cyl. 0 - 43*)
b: 512000 5218304 swap # (Cyl. 447*- 491*)
c: 60046560 0 unused 0 0 # (Cyl. 0 - 5151)
e: 512000 512000 4.2BSD 0 0 0 # (Cyl. 43*- 87*)
f: 4194304 1024000 4.2BSD 0 0 0 # (Cyl. 87*- 447*)
g: 54316256 5730304 4.2BSD 0 0 0 # (Cyl. 491*- 5151*)
Смотрю на смещения и размеры и понимаю что не ошибся
теперь disklabel-ом ее впихиваю
делаю fsck и все работает...
в общем не пришлось и систему переставлять
ps: правда корень пришлось-таки забрать с винтаб на который
я его в свое время записывал (вчера) и MBR вкатать стандартный из
sysinstall