Do spisu tresci tematu 5

5.3.7 Blok identyfikacyjny




Spis tresci


Wprowadzenie

Blok identyfikacyjny (z j. ang. superblock) opisuje system plikow. Mozna w nim znalezc informacje o wielkosci systemu plikow, maksymalnej mozliwej liczbie plikow, wolnych miejscach itp. Jadro gdy chce np. zapisac jakis plik na dysk musi wczytac blok identyfikacyjny z dysku do pamieci, aby siegnac do jego danych. Po ewentualnym wprowadzeniu potrzebnych zmian blok identyfikacyjny zostaje zapisany na dysk. Dane z bloku identyfikacyjnego potrzebne sa takze do zamontowania systemu plikow.


Struktury danych

W Linuxie 2.0 w plikach naglowkowych (include) sa trzy struktury zwiazane z blokiem identyfikacyjnym: super_block (znajdujaca sie w pliku linux/fs.h), ext2_sb_info (w linux/ext2_fs_sb.h) oraz ext2_super_block (w pliku linux/ext2_fs.h). Wszystkie te struktury w momencie montowania systemu plikow sa tworzone w pamieci operacyjnej, przy czym struktura ext2_super_block jest ladowana z dysku. Do tworzenia struktur w pamieci wykorzystywana jest funkcja ext2_read_super (zaimplementowana w pliku fs/ext2/super.c). Struktura super_block zawiera pola niezalezne od typu systemu plikow, oraz pola zalezne zgromadzone w strukturze u. Jedna ze skladowych tej unii jest stuktura ext2_sb_info. Struktura ta, a takze struktura ext2_super_blok przechowuja dane dotyczace jednego konkretnego systemu plikow, ktorym jest ext2, uzywany przez Linuxa 2.0.

Z kazda grupa blokow jest zwiazana nadmiarowa kopia super bloku. Na poczatku kazdej grupy zapamietana jest struktura ext2_super_block. Dzieki,temu latwiej jest odtworzyc straty, gdy zniszczy sie jedna z kopii super bloku.

Wszystkie bloki identyfikacyjne przechowywane sa w tablicy super_blocks. Nalezy jednak dodac, ze w tej tablicy umieszcza sie dokladnie jeden super bloku kazdego zamontowanego systemu plikow. W tablicy super_blocks przechowuje sie bloki identyfikacyjne struktury super_block. Wielkosc tablicy, a zarazem maksymalna liczbe super blokow zaladowanych do pamieci okresla stala

#define NR_SUPER 64


Struktura super_block

Najwazniejszymi informacjami w strukturze super_block sa:

struct super_block {
        kdev_t s_dev;              /* nr urzadzenia, na ktorym jest super blok */
        unsigned long s_blocksize; /* wielkosc kazdego bloku dyskowego*/
        unsigned char s_blocksize_bits;
        unsigned char s_lock;      /* czy zalozona blokada super bloku */
        unsigned char s_rd_only;   /* czy mozna zmieniac zawartosc sb */ 
        unsigned char s_dirt;      /* czy kopia sb w pamieci jest rozna od dyskowej */
        struct file_system_type *s_type;  /* patrz nizej */
        struct super_operations *s_op;    /* patrz nizej */
        struct dquot_operations *dq_op;   /* patrz nizej */
        unsigned long s_flags;     /* flagi wykorzystywane przy montowaniu systemu plikow */
        unsigned long s_magic;     /* liczba charakterystyczna dla systemu plikow */
        struct inode * s_mounted;  /* wskaznik do i-wezla, pod ktory ma byc zamontowany sys. plikow */
        struct wait_queue * s_wait;/* wskaznik do kolejki dostepu do super bloku */
        .................
        union {                    
                struct ext2_sb_info ext2_sb;
                struct msdos_sb_info msdos_sb;
                .................       
        } u;
};

Pole s_type jest wskaznikiem do struktury file_system_type. Jest ona lista, ktorej pola przechowuja dane o typie systemu plikow. Pola s_op i dq_op sa wskaznikami do struktur super_operations i dquot_operations. Struktury te zawieraja funkcje niezbedne do obslugi systemu plikow. Sa to m. in. funkcje: read_inode (czyta dane z i-wezla), notify_change (zaznacza, gdy zostalo cos zmienione w i-wezle), write_inode, write_super, remount_fs (odmontowuje system plikow), alloc_block, alloc_inode, free_block, free_inode itp.


Struktura ext2_sb_info.

Informacje znajdujace sie w strukturze ex2_sb_info to m.in.:

struct ext2_sb_info {
        unsigned long s_inodes_per_block;/* Liczba i-wezlow w kazdym bloku */ 
        unsigned long s_blocks_per_group;/* Liczba blokow w grupie blokow */
        unsigned long s_inodes_per_group;/* Liczba i-wezlow w grupie /*
        unsigned long s_itb_per_group;  /* Liczba blokow w ktorych jest tablica i-wezlow*/ 
        unsigned long s_db_per_group;   /* Liczba deskryptorow blokow w grupie */
        unsigned long s_groups_count;   /* Liczba grup w systemie plikow */
        struct buffer_head * s_sbh;     /* Bufor zawierajacy super blok */
        struct ext2_super_block * s_es; /* Wskaxnik do super bloku w buforze s_sbh */
        struct buffer_head ** s_group_desc; /* Wskaznik do tablicy deskryptorow grup */
        struct buffer_head * s_inode_bitmap[EXT2_MAX_GROUP_LOADED]; /* Wskaznik do naglowka bufora zawierajacego mape bitowa i-wezlow */
        struct buffer_head * s_block_bitmap[EXT2_MAX_GROUP_LOADED]; /* Wskaznik do naglowka bufora zawierajacego mape bitowa blokow */
        struct wait_queue * s_rename_wait; /* wskaxnik do kolejki procesow czekajacych na super blok */
        unsigned long  s_mount_opt;  /* opcje montowania systemu plikow */
        unsigned short s_resuid, s_resgid;     /* dane superusera */ 
        int s_inode_size;    /* rozmiar struktury i-wezla */
        int s_first_ino;     /* indeks pierwszego niezastrzezonego i-wezla */
        ..........
        
};

Tablica z mapa bitowa blokow jest indeksowana numerem zaladowanej grupy. Maksymalna liczba grup jednoczesnie zaladowanych do pamieci okreslona jest przez stala:

#define EXT2_MAX_GROUP_LOADED   8

Mapa bitowa przechowuje informacje o kazdym bloku. Jesli w miejscu dotyczacym tego bloku jest wartosc 0 to znaczy, ze dany blok jest wolny. W przeciwnym przypadku blok nie jest wolny. Analogiczna jest sytuacja z mapa bitowa i-wezlow.

W buforze s_sbh znajduje sie super blok pierwszej z grup zapisanych na dysku. (Chociaz w kazdej grupie jest kopia tego samego super bloku).


Struktura ext2_super_block.

Struktura ext2_super_block przechowuje:

struct ext2_super_block {
        __u32   s_inodes_count;         /* Liczba i-wezlow */
        __u32   s_blocks_count;         /* Liczba blokow */
        __u32   s_r_blocks_count;       /* Liczba blokow zastrzezonych */
        __u32   s_free_blocks_count;    /* Liczba wolnych blokow */
        __u32   s_free_inodes_count;    /* Liczba wolnych i-wezlow */
        __u32   s_first_data_block;     /* Numer pierwszego bloku z danymi */
        __u32   s_log_block_size;       /* Logarytm wielkosci bloku */
        __u32   s_blocks_per_group;     /* Liczba blokow w grupie */
        __u32   s_inodes_per_group;     /* Liczba i-wezlow w grupie */
        __u32   s_mtime;                /* Czas montowania systemu plikow */
        __u32   s_wtime;                /* Ostatni czas zapisu super bloku */
        __u16   s_mnt_count;            /* Liczba zamontowanych systemow plikow */
        __s16   s_max_mnt_count;        /* Maksymalna liczba zamontowan sys. plikow */
        __u16   s_errors;               /* Flagi mowiace jak ma sie zachowac system po wystapieniu bledow */
        __u32   s_lastcheck;            /* Czas ostatniego sprawdzania systemu plikow */
        __u32   s_checkinterval;        /* Maksymalny czas miedzy sprawdzaniami sys. plikow */
        __u16   s_def_resuid;           /* Domyslne uid superusera */
        __u16   s_def_resgid;           /* Domyslne gid superusera*/
        __u32   s_first_ino;            /* Numer pierwszego niezastrzezonego i-wezla */
        __u16   s_inode_size;           /* Wielkosc struktury i-wezla */
        __u16   s_block_group_nr;       /* Liczba grup w systemie plikow */
        ....................
};


Bibliografia

  1. Pliki zrodlowe Linuxa:
  2. Linux Kernel Hacker's Guide - czesc o systemie plikow.


Autor: Jacek Fijalkowski