netch: (Default)
[personal profile] netch
Вынес из комментариев чтобы сохранилось.

Вначале требуется просканировать диск на два типа сигнатур:
- суперблока (основного или запасных копий) (struct fs), признак: по смещению 0x15C внутри блока диска - последовательность 19 01 54 19 (для UFS2). Выглядит это в hd следующим образом:
00010550  00 00 00 00 00 00 00 00  00 00 00 00 19 01 54 19  |..............T.|

- заголовка полосы (struct fs), признак: по смещению 4 внутри блока диска - последовательность 55 02 09 00.
соответственно,
00008000  00 00 00 00 55 02 09 00  11 0c 97 40 00 00 00 00  |....U.....≈@....|

Программа которой я пользуюсь (точнее, несколько раз писал её заново для таких случаев... там пол-экрана) найдя сигнатуру суперблока вычитает из номера блока 2 (потому что смещение в суперблоке - 0x55C), сигнатуру полосы - не меняя. Кроме того, по смещению 12 (0xC) от начала полосы записан последовательный номер полосы (0, 1, 2, ...) в LE32, а в суперблоке по смещению 44 (0x2C) - количество полос в разделе (последняя может быть неполной), опять же в LE32. Размер полосы - в суперблоке по смещению 0xA0, в LE32, но в каких единицах - неясно.

Вот пример сканирования на диске который до разметки был девственно чист:

$ dd if=/dev/da1s1e bs=64k | hd | egrep '50  .* 19 01 54 19  |00  .*55 02 09 00  '
00010550  00 00 00 00 00 00 00 00  00 00 00 00 19 01 54 19  |..............T.|
00014550  00 00 00 00 00 00 00 00  00 00 00 00 19 01 54 19  |..............T.|
00018000  00 00 00 00 55 02 09 00  ba c5 8f 44 00 00 00 00  |....U......D....|
005e0550  00 00 00 00 00 00 00 00  00 00 00 00 19 01 54 19  |..............T.|
0b7d8550  00 00 00 00 00 00 00 00  00 00 00 00 19 01 54 19  |..............T.|
0b7dc000  00 00 00 00 55 02 09 00  62 50 89 44 01 00 00 00  |....U...bP.D....|
16f9c550  00 00 00 00 00 00 00 00  00 00 00 00 19 01 54 19  |..............T.|
16fa0000  00 00 00 00 55 02 09 00  62 50 89 44 02 00 00 00  |....U...bP.D....|
22760550  00 00 00 00 00 00 00 00  00 00 00 00 19 01 54 19  |..............T.|
22764000  00 00 00 00 55 02 09 00  61 50 89 44 03 00 00 00  |....U...aP.D....|
2df24550  00 00 00 00 00 00 00 00  00 00 00 00 19 01 54 19  |..............T.|
2df28000  00 00 00 00 55 02 09 00  61 50 89 44 04 00 00 00  |....U...aP.D....|


Здесь почти нет "ложных срабатываний" от старой разметки. На 10550 (суперблок на 10000) - сигнатура основного суперблока, в UFS2 он идёт с позиции 64K. На 14550 - первого запасного перед первой полосой (сам суперблок на 14000). 18000 - начало первой полосы (номер 0). 005e0550 - ложное срабатывание, потому что не поддержано заголовком полосы. 0b7d8550 - сигнатура запасного суперблока перед полосой 1, 0b7dc000 - начало полосы 1. И так далее.

Получив такой список, далее надо определить шаг между полосами (он вычисляется на основании данных суперблока как-то слишком хитро, я пока не понял эту науку) и где начинается первая полоса (если её данные затёрты), а перед ней - 16K до основного суперблока и ещё 64K до начала раздела. (Эти все цифры для UFS2; для UFS1 они другие и меньше.) Эта часть самая тонкая и неавтоматизируемая - надо вычислить вероятностно, где же правильная группа данных; если диск несколько раз переразмечался - может оказаться несколько подходящих рядов. Тогда надо попробовать все подряд (в порядке возрастания адреса основного суперблока, чтобы меньше затирать) В данном случае шаг B7C4000 (в байтах).

Далее:
- подготовить разметку диска (PT и bsdlabel) так чтобы начало раздела было в найденном месте.
- если нет основного суперблока диска, скопировать туда вручную один из запасных. (Если было несколько рядов запасных суперблоков и групп цилиндров, сохранить старое содержимое диска в этом месте.)
- примонтировать (в readonly!) раздел и проверить, то ли найдено (хоть частично).
- уточнить по выводу df и dumpfs размер раздела, подкорректировать данные в PT & bsdlabel по необходимости.
- если выбран нужный раздел и намерен работать с этим диском дальше не только сняв с него данные - пропустить через `fsck -y' (будучи готовым к огромному объёму ругательств.

Disclaimer: scan_ffs мне не пошла. Если перетёрто начало раздела - она несёт чушь которую невозможно адекватно интерпретировать.

Date: 2006-06-14 08:50 am (UTC)
From: [identity profile] zorick-ua.livejournal.com
Кгм, а кто автор сего опуса?

Date: 2006-06-14 09:25 am (UTC)
From: [identity profile] zorick-ua.livejournal.com
не, Нечаев, ты паравоз видел!

Date: 2006-06-14 09:09 am (UTC)
From: [identity profile] blacklion.livejournal.com
Хмм. Полезно. Спасибо.
Кстати, а что думает testdisk про такие диски? Разнесенный в хлам NTFS он мне спас.

Date: 2006-06-14 09:40 am (UTC)
From: [identity profile] blacklion.livejournal.com
Этот, да. Геометрию он мне правильно определить не смог, но когда задал вручную, он всё сделал и даже XP'вый загрузчик чистый правильно прописал мне...

Date: 2006-07-09 06:26 am (UTC)
From: [identity profile] the--listener.livejournal.com
В общем случае, если есть хоть малейшая вероятность, что кроме суперблока повреждено что-то еще, стоит пройти по всем cyl-groups и проверить на соответствие как суперблок, так и все иноды. Все, что не соответсвует границам разумности - беспощадно тереть. Иначе, первый же fsck, в лучшем случае, вылетит по невозможности выделить буфер в ~3GB, в худшем - добьет то, что поддавалось восстановлению.

Date: 2011-07-14 01:16 pm (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
он вычисляется на основании данных суперблока как-то слишком хитро, я пока не понял эту науку
там все тривиально -- шаг тождественно равен количеству фрагментов в полосе (fs_fpg), полосы идут строго от начала раздела. да, во все полосы включается место под загрузчик, суперблок (размером 1 блок fs) и его копия (размером 1 блок fs). но для всех полос выше нулевой место под загрузчик и суперблок используется под данные. на нумерацию фрагментов это все не влияет -- она сплошная от начала раздела.

Profile

netch: (Default)
netch

December 2023

S M T W T F S
     12
3456789
10111213141516
171819 20212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 08:49 pm
Powered by Dreamwidth Studios