Ext2
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
editovatstruct 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
editovatstruct 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
editovat1 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ář
editovatstruct 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.