AngoLinux

Visalizzazione delle caratteristiche di un filesystem FAT, lette dal boot record

- A cura del Prof. Stefano Salvi -


Cominciamo ad analizzare la struttura di un file system.

Il testo dell'esercizio è il seguente:

Scrivere un programma in C che visualizzi tutte le caratteristiche del dispositivo e del file system lette dal boot sector di un dispositivo o partizione formattato con file system FAT.

NOTE:

  • Per accedere al floppy occorre aprire il dispositivo /dev/fd0 con la funzione open per i file non bufferizzati.
    Per avere i diritti su questo dispositivo occorre che il nostro utente sia associato al gruppo floppy.
    Per associare un'utente al gruppo floppy si deve utilizzare il comando gpasswd -a <utente> floppy. Il comando gpasswd richiede i privilegi di root.
  • Per accedere al primo disco fisso occorre aprire il dispositivo /dev/hda con la funzione open per i file non bufferizzati.
    Per avere i diritti su questo dispositivo occorre che il nostro utente sia associato al gruppo disk.
    Per associare un'utente al gruppo disk si deve utilizzare il comando gpasswd -a <utente> disk. Il comando gpasswd richiede i privilegi di root.
  • Per accedere alla prima partizione del primo disco fisso occorre aprire il dispositivo /dev/hda1 con la funzione open per i file non bufferizzati.
    Per avere i diritti su questo dispositivo occorre che il nostro utente sia associato al gruppo disk.
    Per associare un'utente al gruppo disk si deve utilizzare il comando gpasswd -a <utente> disk. Il comando gpasswd richiede i privilegi di root.
  • Per leggere dati da un file non bufferizzato si può usare la funzione read.
  • Il file header linux/msdos_fs.h contiene la definizione delle strutture utilizzate dal file system FAT. Utilizza alcuni tipi definiti in linux/types.h.

Una possibile soluzione è la seguente:
/* floppy1.c
 * Stefano Salvi - 25/9/02
 * Programma che legge il boot sector di un disco (floppy o hard disk) con file system FAT
 * e ne stampa le caratteristiche.
 */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/types.h>       
#include <linux/msdos_fs.h>

int main(int argc, char **argv)
{
int fd;				// File Descriptor per il dispositivo
struct fat_boot_sector boot;	// Record nel quale leggere il primo settore
char *device = "/dev/fd0";	// Nome del file (dispositivo) da aprire

  if (argc > 1)			// Se c'e' almeno un parametro
  {
    device = argv [1];		// Prende il primo parametro e lo usa come 'dispositivo'
  }

  if((fd=open(device,O_RDONLY))==-1)	// Apre il dispositivo
  {
    printf("Errore di apertura! Forse mancano i diritti sul dispositivo\n");
    return 1;
  }

  read(fd,&boot,sizeof(boot));		// Legge il boot sector

  // Stampa le caratteristiche interessanti
  printf("\nNum\t\t Description\t\t\t Variabile\n");
  printf("%s\t Volume Name\t\t\t (system_id[8])\n",boot.system_id);
  printf("%d\t\t bytes per logical sector\t (sector_size[2])\n",
    *(__u16 *)boot.sector_size); //dimensione settore  
  printf("%d\t\t sectors/cluster\t\t (cluster_size)\n",boot.cluster_size); //settori per cluster
  printf("%d\t\t reserved sectors\t\t (reserved)\n",boot.reserved);
  printf("%d\t\t number of FATs\t\t\t (fats)\n",boot.fats);
  printf("%d\t\t root directory entries\t\t (dir_entries)\n",*(__u16 *)boot.dir_entries);
  printf("%d\t\t number of sectors\t\t (sectors[2])\n",*(__u16*)boot.sectors);
  printf("%d\t\t media code\t\t\t (media)\n",boot.media);
  printf("%d\t\t sectors/FAT\t\t\t (fat_length)\n",boot.fat_length);
  printf("%d\t\t sectors per track\t\t (secs_track)\n",(__u16)boot.secs_track);
  printf("%d\t\t number of heads\t\t (heads)\n",boot.heads);
  printf("%d\t\t hidden sectors\t\t\t (hidden)\n",boot.hidden);
  printf("%d\t\t number of sectors\t\t (total_sect)\n\n",boot.total_sect);

  return 0;
}

Per provare il programma, scaricare il sorgente, compilarlo con il comando cc floppy1.c -o floppy1 ed eseguirlo con il comando ./floppy1.


[Home Page dell'ITIS "Fermi"] [Indice Quarta] [Precedente] [Successivo]

© Ing. Stefano Salvi - Released under GPL licence