Sulla base della risposta di @Derobert , ho scritto un programma ( gist ) che analizzerà un flusso di input da dde scansionerà ogni settore alla ricerca di qualcosa che assomigli all'inizio di una partizione ext.
Funzionerà almeno la più veloce ddpossibile leggere dal tuo disco rigido. Una versione ridotta è di seguito.
L'uso più semplice è giusto sudo dd if=/dev/xxx | ext2scan, anche se probabilmente vorrai modificare il ddcomando per migliorare la dimensione del blocco o scegliere una regione da cercare.
#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: troverà non solo l'inizio delle partizioni, ma anche superblocchi al loro interno.
In entrambi i casi, consiglierei di utilizzare dumpe2fsper analizzare i risultati. Puoi scaricare l'inizio del sospetto superblocco in un file (almeno i primi sei settori, secondo il mio test informale), e se si tratta di un superblocco, dumpe2fsti dirà (tra le altre cose) le posizioni relative degli altri superblocchi .