netch (netch) wrote,
netch
netch

Category:

Восстановление UFS2

Вынес из комментариев чтобы сохранилось.

Вначале требуется просканировать диск на два типа сигнатур:
- суперблока (основного или запасных копий) (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 мне не пошла. Если перетёрто начало раздела - она несёт чушь которую невозможно адекватно интерпретировать.

Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 11 comments