Основываясь на ответе @ derobert , я написал программу ( gist ), которая будет анализировать входной поток dd
и сканировать каждый сектор на предмет чего-то похожего на начало раздела ext.
Он будет работать по крайней мере так же быстро, как dd
может читать с вашего жесткого диска. Сокращенная версия приведена ниже.
Самое простое использование - просто sudo dd if=/dev/xxx | ext2scan
, хотя вы, вероятно, захотите изменить dd
команду, чтобы улучшить размер блока или выбрать регион для поиска.
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main() {
unsigned char const MAGIC[2] = {0x53, 0xef};
unsigned char const ZEROS[512] = {0};
long long int sector = 0;
char buf[4][512];
int empty1, empty2;
while (read(STDIN_FILENO, buf[sector&3], 512) > 0) {
if (!memcmp(buf[sector&3] + 0x38, MAGIC, 2)) {
printf("Found a possible ext2 partition at sector %lld", sector-2);
empty1 = !memcmp(buf[(sector-2)&3], ZEROS, 512);
empty2 = !memcmp(buf[(sector-1)&3], ZEROS, 512);
if (empty1 && empty2) printf(" (first two sectors are empty :)\n");
}
sector++;
}
}
Примечание: он найдет не только начало разделов, но и суперблоки внутри них.
В любом случае, я бы порекомендовал использовать dumpe2fs
для анализа результатов. Вы можете записать начало подозреваемого суперблока в файл (по крайней мере, первые шесть секторов, согласно моему неформальному тесту), и если это суперблок, то dumpe2fs
вам сообщат (среди прочего) об относительном расположении других суперблоков ,