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 мне не пошла. Если перетёрто начало раздела - она несёт чушь которую невозможно адекватно интерпретировать.

Profile

netch: (Default)
netch

December 2023

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

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

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