Лучшая система размещения статей
 Добавить в избранное |  Сделать стартовой 
Поиск По Сайту
Навигация
     Главная
     Форум
     Новости
     Обзор новостей
     Гостевая
     Статьи
     Файлы
     Магазин
     Пользователи
     Контакты
     О Проекте
     Карта Сайта
Вход
Логин:

Пароль:


Запомнить меня
Вам нужно Авторизоваться.
Забыли Пароль?
Регистрация
Атестат
Подписка на новости: Подписаться

Восстановление partition table в FreeBSD

Источник: www.opennet.ru
Добавлено: 2006-03-04 17:51:42

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

Впринципе восстановить данные можно, но надо знать формат таблицы
разделов (это не проблема - описано во многих местах, например
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

Понравилась статья? Поделись с друзьями!
Facebook Опубликовать в LiveJournal Tweet This


Оглавление   |  ?? ????

Оглавление        Вернуться к Статье

Скачай CMS сейчас!
Текущая версия системы управления сайтом WebCodePortalSystem:
v.7.1.00
Скачать CMS v.7.1.00
Обновление с версии 6.2.01

Сайт разработчика:
Новые бета версии

На Сайте
Гостей: 11
Пользователей: 0


10 новых статей
Наши Партнеры


Copyright WebCode-Command © 2003-2012
Работает под управлением WebCodePortalSystem v. 6.2.01
Rambler's Top100