linux user group brescia

immagine del castello

Archivio della mailing list

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