Восстановление UFS2
Jun. 14th, 2006 11:27 amВынес из комментариев чтобы сохранилось.
Вначале требуется просканировать диск на два типа сигнатур:
- суперблока (основного или запасных копий) (struct fs), признак: по смещению 0x15C внутри блока диска - последовательность 19 01 54 19 (для UFS2). Выглядит это в hd следующим образом:
- заголовка полосы (struct fs), признак: по смещению 4 внутри блока диска - последовательность 55 02 09 00.
соответственно,
Программа которой я пользуюсь (точнее, несколько раз писал её заново для таких случаев... там пол-экрана) найдя сигнатуру суперблока вычитает из номера блока 2 (потому что смещение в суперблоке - 0x55C), сигнатуру полосы - не меняя. Кроме того, по смещению 12 (0xC) от начала полосы записан последовательный номер полосы (0, 1, 2, ...) в LE32, а в суперблоке по смещению 44 (0x2C) - количество полос в разделе (последняя может быть неполной), опять же в LE32. Размер полосы - в суперблоке по смещению 0xA0, в LE32, но в каких единицах - неясно.
Вот пример сканирования на диске который до разметки был девственно чист:
Здесь почти нет "ложных срабатываний" от старой разметки. На 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 мне не пошла. Если перетёрто начало раздела - она несёт чушь которую невозможно адекватно интерпретировать.
Вначале требуется просканировать диск на два типа сигнатур:
- суперблока (основного или запасных копий) (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 мне не пошла. Если перетёрто начало раздела - она несёт чушь которую невозможно адекватно интерпретировать.
no subject
Date: 2006-06-14 08:50 am (UTC)no subject
Date: 2006-06-14 08:53 am (UTC)no subject
Date: 2006-06-14 09:25 am (UTC)no subject
Date: 2006-06-14 09:35 am (UTC)no subject
Date: 2006-06-14 09:09 am (UTC)Кстати, а что думает testdisk про такие диски? Разнесенный в хлам NTFS он мне спас.
no subject
Date: 2006-06-14 09:34 am (UTC)Я правильно понял о чём речь?
http://www.cgsecurity.org/wiki/TestDisk
no subject
Date: 2006-06-14 09:35 am (UTC)no subject
Date: 2006-06-14 09:40 am (UTC)no subject
Date: 2006-07-09 06:26 am (UTC)no subject
Date: 2006-07-09 07:30 am (UTC)no subject
Date: 2011-07-14 01:16 pm (UTC)там все тривиально -- шаг тождественно равен количеству фрагментов в полосе (fs_fpg), полосы идут строго от начала раздела. да, во все полосы включается место под загрузчик, суперблок (размером 1 блок fs) и его копия (размером 1 блок fs). но для всех полос выше нулевой место под загрузчик и суперблок используется под данные. на нумерацию фрагментов это все не влияет -- она сплошная от начала раздела.