Com base na resposta do @ derobert , escrevi um programa ( gist ) que analisará um fluxo de entrada dd
e examinará cada setor em busca de algo parecido com o início de uma partição ext.
Funcionará pelo menos o mais rápido que dd
puder ler no seu disco rígido. Uma versão resumida está abaixo.
O uso mais simples é justo sudo dd if=/dev/xxx | ext2scan
, embora você provavelmente deseje modificar o dd
comando para melhorar o tamanho do bloco ou escolher uma região para pesquisar.
#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++;
}
}
Nota: encontrará não apenas o início das partições, mas também superblocos dentro delas.
Em ambos os casos, eu recomendaria o uso dumpe2fs
para analisar os resultados. Você pode despejar o início do superbloco suspeito em um arquivo (pelo menos os seis primeiros setores, de acordo com meu teste informal) e, se for um superbloco, dumpe2fs
informará (entre outras coisas) a localização relativa dos outros superblocos .