KERNEL PANIC
Enrico Colombini
erix a mclink.it
Sab 30 Dic 2000 10:50:01 UTC
>In teoria, se uno ripristinasse con "fdisk" la tabella originaria, poi
>dovrebbe ritrovarsi i vecchi contenuti delle partizioni (sempre che
>windows non ci abbia pasticciato sopra). Se non hai i dati giusti
>per le partizioni la cosa diventa complicata.
L'ultima volta che mi e' capitato un crash che ha cancellato il settore di
boot (colpa di Windows e di problemi hardware) sono riuscito a ricostruire
la tabella delle partizioni, di cui ovviamente non avevo una copia
aggiornata ;-) e a darla poi in pasto a fdisk recuperando tutte le
partizioni e il loro contenuto.
Non e' una passeggiata, ma se i dati sono importanti... ecco piu' o meno
come ho fatto, visto naturalmente col senno di poi (in pratica non e' stata
cosi' lineare):
ho scritto i due programmini fpart.c e trysec.c sotto riportati, poi da
un'altra partizione (lo puoi fare da una partizione UMSDOS o da dischetto)
ho eseguito:
fpart > seclist
per avere una lista dei 'probabili' settori di boot. Poi ho eseguito:
trysec
(occhio alle costanti iniziali se la lista e' lunga - e' tutto quick &
dirty) per cercare di identificare quali fra i papabili fossero probabili
settori iniziali di partizioni Windows o Linux. Con un po' di aiuto dalla
memoria sulle dimensioni delle partizioni, sono riuscito a rimettere i dati
giusti in fdisk.
NOTA: i marker usati nelle tue partizioni possono essere diversi da "MSDOS"
e "LILO", dovresti guardare dentro ai settori iniziali di partizioni
contenenti sistemi operativi uguali a quelli che avevi tu. Temo che la
partizione di swap non sia facilmente identificabile.
Infine, con la stessa tecnica di fpart.c puoi scrivere un programmino che
scandisca /dev/hda alla ricerca di stringhe note presumibilmente
appartenenti ai tuoi dati; se sono in settori contigui, magari riesci a
recuperarli per intero.
Immagino ci sia in giro anche qualche editor esadecimale per andare a
vedere dentro /dev/hda senza dover scrivere del codice.
.Erix.
=== fpart.c ==================================================
#include <stdio.h>
#define SECSIZE 512
int main()
{
unsigned char buf[SECSIZE]; /*sector buffer*/
long sec = 0; /*sector number*/
FILE *fin; /*actually a disk*/
printf("\nSearching for possible boot records...\n");
fin = fopen("/dev/hda", "rb");
while (fread(buf, SECSIZE, 1, fin) == 1) {
sec++;
/* if (sec % 2048 == 0) { printf("%ld\n", sec); } */
if (buf[SECSIZE-2] == 0x55 && buf[SECSIZE-1] == 0xaa) {
printf("sec: %ld (%ldK = %ldM)\n", sec,
(sec * (long)SECSIZE) / 1024L,
(sec * (long)SECSIZE) / 1048576L);
}
}
printf("End of disk scan.\n");
fclose(fin);
}
=== trysec.c =================================================
#include <stdio.h>
#include <string.h>
#define SECSIZE 512
#define LINESIZE 1024
int main()
{
FILE *flist; /*candidate sectors list*/
FILE *fin;
char line[LINESIZE];
char buf[SECSIZE];
long sec;
int i;
flist = fopen("seclist", "rt");
fin = fopen("/dev/hda", "rb");
while (fgets(line, LINESIZE, flist) != NULL) {
if (sscanf(line, "sec: %ld", &sec) == 1) {
printf("%ld (%ldM)", sec, (sec * SECSIZE) / 1048576L);
fseek(fin, (sec - 1) * (long)SECSIZE, SEEK_SET);
fread(buf, SECSIZE, 1, fin);
for (i = 0; i < 64; i++) {
if (isprint(buf[i])) { printf("%c", buf[i]); }
}
if (strncmp(buf + 3, "MSDOS", 5) == 0) {
printf(": DOS?");
} else if (strncmp(buf + 6, "LILO", 4) == 0) {
printf(": Linux?");
}
}
printf("\n");
}
fclose(fin);
fclose(flist);
}
Maggiori informazioni sulla lista
Lug
|