Sulla base della risposta di @Derobert , ho scritto un programma ( gist ) che analizzerà un flusso di input da dd
e scansionerà ogni settore alla ricerca di qualcosa che assomigli all'inizio di una partizione ext.
Funzionerà almeno la più veloce dd
possibile 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 dd
comando 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 dumpe2fs
per 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, dumpe2fs
ti dirà (tra le altre cose) le posizioni relative degli altri superblocchi .