Понадобилось поднять еще один комп старенький для 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