ext2 je UN*Xový filesystém. Je východiskem jourálového filesystemu ext3


ext2 editovat

  • Hubička: školičky – Filesystemy, lde, man 8 debugfs;

Potřebuju prozkoumat, jak vlastně vypadá ten e2fs. Podle Hubičky to pořád ještě tak moc nechápu.

Zkusím to na ubo /dev/hda4

fdisk /dev/hda


Disk /dev/hda: 64 heads, 63 sectors, 1023 cylinders
Units = cylinders of 4032 * 512 bytes

   Device Boot   Start      End   Blocks   Id  System
/dev/hda1            1      229   461632+   c  Win95 FAT32 (LBA)
/dev/hda2          230      290   122976    6  DOS 16-bit >=32M
/dev/hda3          291     1015  1461600    5  Extended
/dev/hda4   *     1016     1023    16128   83  Linux native
/dev/hda5          291      697   820480+  83  Linux native
/dev/hda6          698      730    66496+  83  Linux native
/dev/hda7          731      763    66496+  82  Linux swap
/dev/hda8          764      999   475744+  83  Linux native
/dev/hda9         1000     1015    32224+  83  Linux native

Zajímá mě ten nejmenší /dev/hda4 což je root:

/dev/hda4 on / type ext2 (rw,errors=remount-ro)

   Device Boot   Start      End   Blocks   Id  System
/dev/hda4   *     1016     1023    16128   83  Linux native

Nr AF  Hd Sec  Cyl  Hd Sec  Cyl   Start    Size ID
 4 80   0   1 1015  63  63 1022 4092480   32256 83

8 cylindrů * 2016 kB = 16128 kB = 16128 bloků

ubo:~# df
Filesystem         1024-blocks  Used Available Capacity Mounted on
/dev/hda4              15615   14034      775     95%   /

15615 bloků celkem pro data
16128 - 15615 = 513 jiných než datových = 2 grupy * 256 + bootblok
Used + Available = 14809
15615 - 14809 = 806 to je 5% datových rezervovaných pro roota
775   + 806   = 1581 je skutečně volných

ubo:~# dumpe2fs /dev/hda4
dumpe2fs 1.12, 9-Jul-98 for EXT2 FS 0.5b, 95/08/09
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          b6a33a60-427c-11d2-8fb5-e318a2d49bb8
Filesystem magic number:  0xEF53
Filesystem revision #:    0 (original)
Filesystem features:      (none)
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              4032
Block count:              16128		; všechny bloky na celé partition
Reserved block count:     806		; datové bloky reservované pro roota
Free blocks:              1581		; volné datové vč. reservy pro roota
Free inodes:              1595
First block:              1		; superblok 0.grupy (za bootblokem)
Block size:               1024
Fragment size:            1024		; stejná velikost => bez fragmentování
Blocks per group:         8192		; všech dohromady
Fragments per group:      8192
Inodes per group:         2016
Inode blocks per group:   252		; tj. 8 inodů v bloku
Last mount time:          Mon May 17 20:28:25 1999
Last write time:          Fri Jun 18 06:33:52 1999
Mount count:              4
Maximum mount count:      20
Last checked:             Tue Apr  6 10:12:16 1999
Check interval:           15552000 (6 months)
Next check after:         Sun Oct  3 10:12:16 1999
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)


Group 0: (Blocks 1 -- 8192)
  Block bitmap at 3 (+2), Inode bitmap at 4 (+3)
  Inode table at 5 (+4)
  903 free blocks, 1133 free inodes, 124 directories
  Free blocks: 274, 482-483, 519-526, 531-539, 541-548, 564-569, 579-590, 650-663, 677-681, 687-689, 691, 695-984, 1020-1067, 1069-1416, 1440-1449, 1460-1477, 1578-1622, 1652-1681, 2990, 3728-3741, 3833-3858, 5323-5324, 7704-7705
  Free inodes: 490-530, 549, 578, 585-586, 672-673, 822, 881, 883, 885, 909, 919, 922-924, 937, 939-955, 957, 959-2016
Group 1: (Blocks 8193 -- 16127)
  Block bitmap at 8195 (+2), Inode bitmap at 8196 (+3)
  Inode table at 8197 (+4)
  678 free blocks, 462 free inodes, 20 directories
  Free blocks: 8464-8469, 8669, 8754-8761, 8795-8797, 8800, 8807-8808, 8812-8823, 8826-8838, 8843-8846, 8851, 8856-8859, 8866, 8870-8919, 8921-9147, 9152-9162, 9195-9201, 9220-9221, 9314, 9318-9320, 9324-9326, 9329, 9377, 9436, 10699, 10701, 12206-12217, 12224-12238, 12292-12308, 12312-12340, 12710-12745, 12819-12829, 13025-13028, 13035-13046, 13051-13055, 13068, 13070-13072, 13075-13082, 13093-13103, 13106-13109, 13117-13119, 13127, 13129-13130, 13170-13171, 13191, 13775, 13789-13806, 13808-13847, 13925-13928, 13930-13968, 13970-13976, 13978-13984, 14139-14143, 14158, 14161-14162, 14245-14249, 16121-16127
  Free inodes: 3121, 3130, 3162, 3165, 3177-3180, 3184, 3191, 3210, 3212-3214, 3218, 3237, 3240, 3246, 3250, 3254, 3258, 3262, 3266, 3270, 3274, 3278, 3282, 3286, 3290, 3294, 3298, 3302, 3306, 3310, 3314, 3318, 3322, 3326, 3330, 3334, 3338, 3342, 3346, 3350, 3483, 3488, 3493, 3495, 3497, 3502-3503, 3505, 3507-3508, 3512, 3516-3517, 3519, 3521, 3527, 3530, 3583, 3589, 3592, 3595-3596, 3604, 3608, 3616, 3618-3623, 3627-3628, 3635-3637, 3639-3640, 3647, 3654-4032

Pořád nemůžu objevit, kde jsou ty superbloky.

Čtu linux-gazette 21, ext2.html. Konečně něco rozumnýho:

1) Partition - jeden e2fs zabírá jednu celou partition. Jasný.

2) Groups - skupiny. Každá partition je rozdělená na skupiny. Každá skupina obsahuje v následujícím pořadí:

superblock - informace o celém disku - identické v každé skupině
group descriptor - obsahuje pointery na:
block bitmap
inode bitmap
inode table
data blocks


Inody - první 13 pointerů přímých, pak 3 další pro nepřímou adresaci.

Dál čtu:

Louis-Dominique Dubeau: Analysis of the Ext2fs structure – v podstatě jen popis tabulek.

Dále mluvíme o logických blocích což můžou být 1,2,4,8 atd. násobky fyzických bloků.

Fragment je také 1,2,4,8,... násobek fyzického bloku, ale ne větší, než logický blok. To je proto, aby se využilo jinak nevyužité místo v blocích. Ale většinou (nebo alespoň pro začátek a jednoduchost) můžeme uvažovat, že fyzický i logický blok i fragment budou stejně velké, a to 1kB.

Bloky na celé partition se číslují od 0 do n-1.

Blok 0 je bootovací blok.

Takže mám teď 16128 bloků v partitions, nultý je boot, zbývá 16127. Obvykle grupa má 2^14 = 8192 bloků celkem.

  • 0. grupa 1-8192
  • 1. grupa zbývají bloky 8193-16127 což je jen 7935 bloků


Kolik bloků je co dlouhé, jaké jsou to bloky? Budu uvažovat 1.grupa:

počet   od - do:
-------------------------------------
		     0.grupa:
   1     1           superblock
   1     2           group descriptor
   1     3           block bitmap, využitých 2016/8 = 252 bytes
   1     4           inode bitmap, využitých 7936/8 = 992 bytes
 252     5 -   256   inode table, v každém bloku 8 inodů = 2016 inodů
7936   257 -  8192   data blocks

		     0.grupa:
   1  8193           superblock
   1  8194           group descriptor
   1  8195           block bitmap
   1  8196           inode bitmap
 252  8197 -  8448   inode table, v každém bloku 8 inodů
7679  8449 - 16127   data blocks (je jich míň než v 0.grupě)

Celkem datových bloků: 7936 + 7679 = 15615

V každé grupě je 256 bloků jiných než datových, tj. 512 celkem, plus boot block = 513


Takže struktury těch bloků:

Superblok editovat

struct ext2_super_block {

  __u32   s_inodes_count;         /*   0        Inodes count */
  __u32   s_blocks_count;         /*   4        Blocks count */
  __u32   s_r_blocks_count;       /*   8        Reserved blocks count */
  __u32   s_free_blocks_count;    /*  12        Free blocks count */

  __u32   s_free_inodes_count;    /*  16        Free inodes count */
  __u32   s_first_data_block;     /*  20        First Data Block */
  __u32   s_log_block_size;       /*  24  1024  Block size */
  __s32   s_log_frag_size;        /*  28  1024  Fragment size */

  __u32   s_blocks_per_group;     /*  32  8192  Blocks per group */
  __u32   s_frags_per_group;      /*  36  8192  Fragments per group */
  __u32   s_inodes_per_group;     /*  40  2016  Inodes per group */
  __u32   s_mtime;                /*  44        Mount time */

  __u32   s_wtime;                /*  48        Write time */
  __u16   s_mnt_count;            /*  52        Mount count */
  __s16   s_max_mnt_count;        /*  54        Maximal mount count */
  __u16   s_magic;                /*  56  EF53  Magic signature */
  __u16   s_state;                /*  58        File system state */
  __u16   s_errors;               /*  60        Behaviour when detecting err.*/
  __u16   s_pad;                  /*  62  */

  __u32   s_lastcheck;            /*  64        time of last check */
  __u32   s_checkinterval;        /*  68        max. time between checks */
  __u32   s_creator_os;           /*  72        OS - Linux*/
  __u32   s_rev_level;            /*  76        Revision level */

  __u16   s_def_resuid;           /*  80  Default uid for reserved blocks */
  __u16   s_def_resgid;           /*  82  Default gid for reserved blocks */
  __u32   s_reserved[235];        /*  84 + 940 = 1024 Padding to the end */
};
ubo:~# debugfs /dev/hda4
debugfs 1.12, 9-Jul-98 for EXT2 FS 0.5b, 95/08/09
debugfs:  show_super_stats
Filesystem is read-only
Volume name = (none)
Last mounted directory = (none)
Filesystem UUID = b6a33a60-427c-11d2-8fb5-e318a2d49bb8
Last mount time = Mon May 17 20:28:25 1999
Last write time = Fri Jun 18 06:33:52 1999
Mount counts = 4 (maximal = 20)
Filesystem OS type = Linux
Superblock size = 1024
Block size = 1024, fragment size = 1024
Inode size = 128
4032 inodes, 1595 free
16128 blocks, 1581 free, 806 reserved, first block = 1
8192 blocks per group
8192 fragments per group
2016 inodes per group
2 groups (1 descriptors block)
 Group  0: block bitmap at 3, inode bitmap at 4, inode table at 5
           903 free blocks, 1133 free inodes, 124 used directories
 Group  1: block bitmap at 8195, inode bitmap at 8196, inode table at 8197
           678 free blocks, 462 free inodes, 20 used directories


Group descriptor editovat

struct ext2_group_desc
{
  __u32   bg_block_bitmap;        /*   0  Blocks bitmap block */
  __u32   bg_inode_bitmap;        /*   4  Inodes bitmap block */
  __u32   bg_inode_table;         /*   8  Inodes table block */
  __u16   bg_free_blocks_count;   /*  10  Free blocks count */
  __u16   bg_free_inodes_count;   /*  12  Free inodes count */

  __u16   bg_used_dirs_count;     /*  16  Directories count */
  __u16   bg_pad;                 /*  18  */
  __u32   bg_reserved[3];         /*  20 - 31 */
};


Inode table editovat

1 položka = 128 bytes, tj. 1 blok = 8 položek

struct ext2_inode {       /* offset bytes */

  __u16   i_mode;         /*   0  File mode */
  __u16   i_uid;          /*   2  Owner Uid */
  __u32   i_size;         /*   4  Size in bytes */
  __u32   i_atime;        /*   8  Access time */
  __u32   i_ctime;        /*  12  Creation time */

  __u32   i_mtime;        /*  16  Modification time */
  __u32   i_dtime;        /*  20  Deletion Time */
  __u16   i_gid;          /*  24  Group Id */
  __u16   i_links_count;  /*  26  Links count */
  __u32   i_blocks;       /*  28  Blocks count */

  __u32   i_flags;        /*  32  File flags */
  union {
    struct {
    __u32  l_i_reserved1;
    } linux1;
  } osd1;                 /*  34  OS dependent 1 */
  __u32   i_block[EXT2_N_BLOCKS];
                          /*  36  16*4=64bytes Pointers to blocks */
  __u32   i_version;      /* 100  File version (for NFS) */
  __u32   i_file_acl;     /* 104  File ACL */
  __u32   i_dir_acl;      /* 108  Directory ACL */
  __u32   i_faddr;        /* 112  Fragment address */
  union {
    struct {
      __u8    l_i_frag;   /* 116  Fragment number */
      __u8    l_i_fsize;  /* 117  Fragment size */
      __u16   i_pad1;     /* 118 */
      __u32   l_i_reserved2[2]; /* 120 - 127 */
    } linux2;
  } osd2;                  /* OS dependent 2 */
};

Ty uniony jsou závislé na OS - vyházel jsem hurd a masix, nechal jsem jen linuxové.

i_mode:
-------
4 vpravo
   posledni 3 byty jsou zname pristupy rwxrwxrwx. To zpracovava jadro
   Bit 9 urcuje jestli soubor je VTX. Ale stejne nevim co to znamena..
   Bit 10 rike ze soubor ma nastaveny group flag. Take nevim proc..
     snad pro optimalizaci rozlozeni na disku
   Bit 11 nastavuje set user id. To je znamy flag, ktery umozni procesu
     orepnout si effective usera na root.
2 vlevo
   01 - soubor je FIFO
   02 - znakove zarizeni
   04 - je adresar
   06 - blokove zarizeni
   10 - normalni soubor
   12 - symbolic link
   14 - socket

Adresář editovat

struct ext2_dir_entry {
  __u32   inode;                  /*  0  Inode number */
  __u16   rec_len;                /*  4  Directory entry length */
  __u16   name_len;               /*  6  Name length */
  char    name[EXT2_NAME_LEN];    /*  8  File name */
};

Max. délka položky: 8 + 255 = 263 bytes zaokrouhleno nahoru 264. Ale neukládá se celá, ale jen využitá délka, zaokrouhlená na násobek čtyř bytů. Poslední položka adresáře (v bloku?) má rec_len nevyplněné. Mazání: k rec_len předchozí položky se přičte rec_len mazané položky.