Matematicko-fyzikální fakulta UK Linux kernel, 2007
Osnova 1 Úvod 2 3 Ext2 Ext3 Ext4 ReiserFS XFS
Filesystem Wikipedia : Denition File system is a method for storing and organizing computer les and the data they contain to make it easy to nd and access them. vlastní data mohou být na datových médiích (Data Storage Device) - HDD, CDROM, ashdisk,... na vzdálených serverech - NFS, SMB,... virtuální - procfs, sysfs,...
Filesystémy z pohledu uºivatele soubory, cesty : /home/petr/le.txt le descriptory : fd = open(le,...) atributy : vlastník, skupina, práva, mtime,... oset : write, read, lseek directory handle : DIR *d = opendir(/dir/) directory entry : struct dirent *de = readdir(d)
Linux a lesystémy linux podporuje mnoho lesystém diskové : ext2, ext3, ext4, ReiserFS, XFS, Minix, ISO9660, UDF, FAT, NTFS, MSDOS clusterové : GFS2, OCFS2, sí ové : NFS, SMB, CIFS, Coda, AFS virtuální : procfs, sysfs podporu pro dal²í FS lze p idávat za b hu - moduly seznam aktuáln podporovaných FS v /proc/lesystems
1 Úvod 2 3 Ext2 Ext3 Ext4 ReiserFS XFS
virtual lesystem switch abstraktní vrstva nad jednotlivými souborovými systémy specikuje interface mezi kernelem a FS p edává poºadavky (syscally) odpovídajícím FS
High-level architektura
Datové struktury VFS pouºívá obecné datové struktry (nezávislé na jednotlivých FS) superblock - lesystém inode - soubor na disku le - otev ený soubor dentry - adresá ová poloºka obsahují informace o objektu a tabulku metod pro manipulaci s tímto objektem programování FS znamená p edev²ím denici metod pro manipulaci s t mito objekty zp sobem, jenº je dán strukturou FS
Superblock struct super_block reprezentuje lesystém typicky bývá na ten z disku, m ºe být ale vytvo en pouze v pam ti struktury tvo í spojový seznam první poloºka uloºena v prom nné super_blocks dal²í jsou p ipojeny pomocí pointeru s_list seznam chrán n pomocí spinlocku : sb_lock data specická pro konkrétní FS : s_fs_info (nap. ext2_sb_info) s_dirt : p íznak udávající, zda je t eba superblock zapsat na disk (zda byl modikován) s_blocksize : velikost bloku
Superblock II s_type : pointer na strukturu reprezentující typ lesystému (nap. ext2) - viz dále struct lesystem_type s_op : tabulka metod pro manipulaci se superblockem struct super_operations magic number mount ags synchroniza ní primitiva seznam v²ech inod seznam zm n ných inod seznam inod ekajících na zápis na disk...
Inode struct inode inode reprezentuje objekt FS : soubory, adresá e, FIFO, symlinky,... p i azen unikátní identikátor v rámci FS (i_ino) název souboru není sou ástí inode m ºe být reprezentován na disku (FS na blokových za ízeních) nebo existuje pouze v pam ti (virtuální FS)
Inode II inode obsahuje : informace o vlastníkovi souboru, právech typ (soubor, adresá, symlink,...) asy modikace délka souboru íta odkaz... také tabulky metod pro operace : s inode : struct inode_operations s otev enými soubory : struct le_operations
File struct le reprezentuje soubor otev ený procesem struktura je vytvo ena v okamºiku otev ení souboru obsahuje : oset v souboru (kde bude pokra ovat tení/zápis) p ístupový mód (r, w,...) tabulku metod pro manipulaci se souborem - struct le_operations...
Dentry struct dentry (directory entry) reprezentuje název souboru/adresá e kernel vytvá í tyto struktury p i p ístupu k soubor m, nap. p i otev ení souboru /tmp/le.txt jsou vytvo eny tyto dentries : dentry pro / dentry pro /tmp dentry pro /tmp/le.txt struktura obsahuje odkaz na odpovídající inode odkaz na rodi ovský adresá tabulku metod pro manipulaci s dentry - struct dentry_operations...
Seznam podporovaných FS kernel udrºuje seznam podporovaných FS ve struktu e struct le_system_type struct file_system_type { const char *name; int fs_flags; int (*get_sb) (struct file_system_type *, int, const char *, void *, struct vfsmount *) void (*kill_sb) (struct super_block *); struct module *owner; struct file_system_type * next; struct list_head fs_supers;... }; lze prohlíºet p es /proc/lesystems
Registrace FS pro registraci nového (typu) lesystému slouºí funkce int register_filesystem(struct file_system_type * fs) p edaná struktura obsahuje jméno FS odkaz na funkci pro na tení superblocku - read_super agy : zda FS existuje na blokovém za ízení (jinak je to virtuálni FS) obvykle volána z funkce init_module pro odebrání lesystému slouºí int unregister_filesystem(struct file_system_type * fs)
Mount mount = p ipojení FS do adresá ového stromu funkce long do_mount(char *dev_name, char *dir_name, char *type_page, unsigned long flags, void *data_page) vytvo í struct super_block a za adí ji do spojového seznamu k na tení superblocku volá funkci read_super p ipojený souborový systém je reprezentován strukturou struct vfsmount
struct super_operations tabulka obsahující seznam funkcí pro práci se superblockem, které poskytuje ovlada FS obsahuje bu adresu funkce nebo NULL - v tom p ípad se pouºije standardní funkce z VFS alloc_inode - alokuje pam t pro inode v etn místa pro data specická pro FS destroy_inode read_inode - na te inode z FS íslo inode vyplní VFS, zbytek struktury vyplní read_inode dirty_inode - VFS volá tuto metodu, ímº ozna í inode jako dirty write_inode - VFS volá pro zápis inode na disk jen pokud je inode dirty druhý parametr udává, zda má být zápis synchronní
struct super_operations II put_inode - voláno, kdyº se sníºí po et referencí na inode drop_inode - voláno, kdyº má být inode odstran n (po et odkaz klesne na 0) lze vyuºít generickou variantu generic_drop_inode - odstraní v²echny odkazy na inode a zavolá delete_inode() write_super - voláno pro zápis superblocku na disk sync_fs - zápis v²ech dirty inode na disk druhý parametr udává, zda se má volání zablokovat aº do dokon ení zápisu statfs - získání statistik lesystému, nap statfs syscall remountfs - voláno pro remount FS...
inode_operations II struktura obsahuje krom metod pro manipulaci s inode také poloºku struct file_operations *default_file_ops; výchozí tabulka metod pro manipulaci s objektem le p i otev ení nového souboru a vytvo ení objektu le jsou le_operations inicializovány touto tabulkou le_operations lze pak zm nit nap. p i otev ení speciálního souboru
inode_operations - adresá e create - vytvo í inode pro normální soubor v daném adresá i lookup - zkontroluje, zda objekt identikovaný dentry existuje v adresá i link - vytvo í new_dentry jako hardlink na old_dentry v daném adresá i unlink - odstraní soubor z adresá e symlink - vytvo í nový adresá rmdir - odstraní adresá mknod - vytvo í speciální za ízení
inode_operations II rename - p ejmenuje soubor readlink - p e te cestu k odkazovanému souboru ze symbolického odkazu do bueru follow_link - vrátí dentry, na n jº ukazuje symbolický odkaz truncate - zm ní velikost souboru permission - kontrola p ístupových práv - zda odpovídají zadanému vzoru
le_operations llseek - zm ní pozici ukazatele v souboru read - p e te data od pozice ukazatele a uloºi je do bueru je t eba aktualizovat hodnotu oset write - zapí²e count data z bueru na pozici ukazatele taktéº nutné aktualizovat oset readdir - vrátí dal²í poloºku z adresá e poll - kontroluje aktivitu na souboru, p ípadn se uspí select, poll ioctl - po²le p íkaz HW za ízení pouze pro speciální soubory
le_operations II mmap - mapuje soubor do adresního prostoru procesu open - otev e soubor vytvo í strukturu le k danému inode fsync - zapí²e data na disk readv - vektorové tení souboru tení do nesouvislých oblastí pam ti writev - vektorový zápis...
dentry_operations obvykle jsou ponechány NULL, tzn. kernel pouºije generické varianty d_revalidate, d_delete, d_release : generické varianty jsou prázdné funkce d_compare : porovná dva dentry generická varianta : strcmp VFAT : case insensitive strcmp d_hash - vytvo í hash z názvu d_iput - voláno, kdyº dentry ztratí sv j inode
Programování FS je t eba p ipravit struktury reprezentující privátní data naprogramovat callbacky, naplnit jimi struktury a p edat je kernelu net eba denovat v²echny callbacky - VFS m ºe pouºít generické varianty /usr/src/linux/fs/romfs/ /usr/src/linux/fs/ramfs/
1 Úvod 2 3 Ext2 Ext3 Ext4 ReiserFS XFS
Dentry cache directory cache, dcache cachuje adresá ové poloºky nalezení souboru p ímo na FS by trvalo neúm rn dlouho cachují se pouze poloºky krat²í neº 15 znak tvo ena hashovací tabulkou indexováno pomocí dvojice rodi ovský adresá - poloºka v tabulce jsou uloºena ísla odpovídajících inode a odkazy na bloková za ízení pro kaºdou poloºku v dentry cache existuje i odpovídající záznam v inode cache (dále) staré poloºky vyhazovány algoritmem LRU
Buer cache cachuje fyzické bloky diskových oddíl cache spole ná v²em oddíl m poloºky indexovány dvojicí blokové za ízení - íslo bloku spravuje bloky r zných velikostí (512-8192) spojový seznam volných blok staré bloky nahrazovány LRU algoritmem buery pravideln zapisovány na disk (bdush)
Inode cache cachuje inody (virtuální) hashovací tabulka, indexována dvojicí blokové za ízení - íslo inode pokud není poºadovaný inode nalezen, je t eba alokovat nový p i vy erpání maximálního po tu inode v cache musí být n jaký uvoln n nepouºívané inode (nulové po ítadlo referencí) pokud byl p ed uvoln ním modikován, jsou data zapsána na disk ko enové inode namountovaných FS mají po ítadla vºdy nenulová
1 Úvod 2 3 Ext2 Ext3 Ext4 ReiserFS XFS
fs_struct struktura p i azená kaºdému procesu struct task_struct {... struct fs_struct *fs; /* FS info */ struct files_struct *files; /* open files */... ( poloºky v fs_struct : root : dentry pro / pwd : dentry pro pracovní adresá...
les_struct specikuje soubory otev ené procesem struct files_struct { unsigned int max_fds; struct file ** fd; int next_fd;... } poloºka fd ukazuje na pole le deskriptor velikost pole je v max_fds velikost pole se dynamicky m ní podle pot eby, za íná na 32 dv poloºky v fd mohou ukazovat na stejný soubor
1 Úvod 2 3 Ext2 Ext3 Ext4 ReiserFS XFS
open(/tmp/le.txt) je t eba získat odpovídající inode analyzuje se cesta k souboru - ²t pí se podle / kdyº cesta za íná na /, je absolutní vyhledávání za íná v current->fs->root jinak je relativní vyhladávání za íná v current->fs->pwd
II p edchozím krokem byl získán dentry adresá e, ze kterého se za ne vyhledávat odpovídající inode je p e ten a tak je získána dentry dal²í ásti cesty postupuje se rekurzivn vyhledávání obvykle urychluje dentry cache komplikace : p ístupová práva mezilehlých adresá symbolické odkazy cyklické symbolické odkazy
path_lookup funkce, která provádí vlastní vyhledávání souboru parametrem je název souboru funkce vrací vícero informací z vyhledávání, nejd leºit j²í je dentry souboru po provedení path_lookup je t eba zavolat path_release výsledky vyhledávání uº nejsou t eba kompletní popis algoritmu : http://www.linux-security.cn/ebooks/ulk3- html/0596005652/understandlk-chp-12-sect-5.html
Ext2 Ext3 Ext4 ReiserFS XFS 1 Úvod 2 3 Ext2 Ext3 Ext4 ReiserFS XFS
Ext2 - historie Úvod Ext2 Ext3 Ext4 ReiserFS XFS second Extended File System následovník p vodního linuxového FS - Minix minix : mnoho omezení, nap. max velikost souboru 64MB mezikrok : Ext FS (Extended File System) ext2 : 1993 1992, Linux 0.96c
Ext2 - fyzická struktura Ext2 Ext3 Ext4 ReiserFS XFS FS je tvo en skupinou blok (Block Groups) Boot Sector BG1 BG2... BG3 kaºdá skupina blok obsahuje kopii superbloku a ást vlastního FS : block bitmap inode bitmap ást inode table datové bloky struktura skupiny blok : SB Block BM Inode BM Inode Table Data Blocks
Ext2 - fyzická struktura II Ext2 Ext3 Ext4 ReiserFS XFS datové bloky : direct, indirect, double indirect, triple indirect - viz. dále bitmapy : jeden bit pro kaºdý blok/inode (volný/vyuºitý) skupiny blok : spolehlivost (kopie superblocku) výkon - men²í vzdálenost mezi inode table a datovými bloky
Ext2 - datové bloky Úvod Ext2 Ext3 Ext4 ReiserFS XFS struct ext2_inode {... le32 i_block[ext2_n_blocks];... } inode m ºe p ímo obsahovat adresy 15 datových blok (EXT2_N_BLOCKS) 0..11 : prvních 12 datových blok souboru 12 : odkaz na blok, který obsahuje adresy dal²ích blok indirect block 13 : double indirect block 14 : triple indirect block
Ext2 - datové bloky II Úvod Ext2 Ext3 Ext4 ReiserFS XFS
Ext2 - superblock Úvod Ext2 Ext3 Ext4 ReiserFS XFS data specická pro Ext2 struct ext2_sb_info { unsigned long s_frag_size; unsigned long s_frags_per_block; unsigned long s_inodes_per_block; unsigned long s_frags_per_group; unsigned long s_blocks_per_group; unsigned long s_inodes_per_group;... } funkce ext2_read_super
Ext2 - Adresá e Úvod Ext2 Ext3 Ext4 ReiserFS XFS mapování jméno souboru <-> inode number spojový seznam, kaºdá poloºka obsahuje : inode number délka názvu souboru název souboru první dv poloºky jsou vºdy standardní. a..
Ext2 - zm na velikosti souboru Ext2 Ext3 Ext4 ReiserFS XFS nalezení volného bloku - problém fragmentace snaha alokovat nový blok ve stejné skupin blok p i alokaci nových blok je uzam en superblock inody mohou mít p id leny prealokované bloky - místo rezervované v bitmap pokud nelze uspokojit poºadavek na nové bloky pomocí prealokovaných blok, prohledávají se následující bloky : blok bezprost edn za posledním alokovaným blokem blok max 64 blok za posledním alokovaným blokem hledají se klastry 8mi volných blok v ostatních skupinách blok
Ext2 - features Úvod Ext2 Ext3 Ext4 ReiserFS XFS velikost FS aº 4TB 5% prostoru rezervováno pro roota volitelná velikost bloku (1k, 2k, 4k) fast symbolic links : jméno odkazovaného souboru m ºe být uloºeno p ímo v inodu bezpe né mazání soubor : náhodná data immutable, append-only soubory (chattr) tune2fs
Ext3 - úvod Úvod Ext2 Ext3 Ext4 ReiserFS XFS následník ext2 Stephen Tweedie, 1999 v kernelu od verze 2.4.15 (2003) stejný formát dat na fyzickém médiu jako ext2 rozdíly (oproti ext2) : ºurnál lze p evést online z ext2 bez nutnosti backup/restore jen p idání ºurnálu tune2fs -j /dev/hdax
Ext3 - ºurnálování Úvod Ext2 Ext3 Ext4 ReiserFS XFS zm ny na FS - velké IO operace, náchylné k soub h m p i výpadku stroje smazání souboru : odstran ní directory entry ozna ení datových blok a inode jako volné obnova (fsck) neºurnálovaného FS : sloºité procházení datových struktur a hledání nekonzistencí ºurnálování = logování zm n na FS, lze p ehrát po výpadku stroje zaru ena atomicita transakce lze ºurnálovat jen metadata, nebo i data
Ext2 Ext3 Ext4 ReiserFS XFS Ext3 - ºurnál vyuºívá Journaling Block Device layer (JBD) obecná vrstva, ale vyuºito jen ext3/4 ºurnál uloºen v inode - m ºe/nemusí být vid t fyzické ºurnálování - JBD ukládá celé zm n né bloky 3 úrovn ºurnálování : data=writeback : nejrychlej²í, ºurnálována jsou pouze metadata rychlé fsck, jinak srovnatelné s ext2 data=ordered : zaru uje konzistenci dat vynucením jejich zápisu p ed zápisem metadat ºurnálována jsou pouze metadata defaultní úrove data=journal : ºurnáluje se v²e, nejpomalej²í (data se musí zapisovat dvakrát)
Ext4 Úvod Ext2 Ext3 Ext4 ReiserFS XFS 2006, kernel 2.6.19 stále experimentální status zp tná kompatibilita s ext3 (jednosm rn ) odstra uje n které ²kálovací nedostatky ext3 extents max. velikost FS 16TB -> 1EB 48b ísla blok nové JBD (JBD2) max. velikost souboru 2TB -> 16TB... jednoduchá adresace souvislých fyzických blok výhoda pro velké soubory
ReiserFS Úvod Ext2 Ext3 Ext4 ReiserFS XFS Namesys, Hans Reiser ReiserFS 3, Reiser4 ºurnálování (metadata, data i metadata) tail-packing konce soubor uloºeny v separátním oddílu sniºuje fragmentaci, zvy²uje zát º metadata, adresá ové poloºky, seznamy datových blok a tails jsou uloºeny spole n v B+ stromu univerzální object-id
XFS Úvod Ext2 Ext3 Ext4 ReiserFS XFS SGI, 1994 - IRIX 5.3 2000 - GPL 64b FS ºurnálování : metadata logický ºurnál m ºe probíhat na samostatné partition FS rozd len na stejn velké allocation groups spravují vlastní inody a volné místo ²kálovatelnost - kaºdé vlákno m ºe soub ºn pracovat ve své AG
XFS II Úvod Ext2 Ext3 Ext4 ReiserFS XFS extents volné místo : dvojice B+ strom pro kaºdou allocation group jeden indexován délkou volných extents druhý indexován za átky volných extents efektivní vyhledání volného místa velikost bloku 512B - 64k...
Konec Úvod Ext2 Ext3 Ext4 ReiserFS XFS