[[oktatas:linux|< Linux]] ====== Fájlrendszer adatstruktúra Linuxon ====== * **Szerző:** Sallai András * Copyright (c) 2017, Sallai András * Szerkesztve: 2017, 2018, 2019 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Inode ===== Az inode, magyarul csomópont. A linuxos és a Unix szerű operációs rendszerekben minden információt egy inode-ban tárolunk egy fájlról, kivéve a nevét és az adatokat. Minden fájlhoz tartozik egy inode. Az inode a fájltól külön helyen tárolódik, nem a fájl mellett. Az inode számtalan információt (meta információk) tartalmaz egy fájlról, kivéve a nevét. A név külön tárolódik, a katalógusban (könyvtár bejegyzésben). Egy fájlhoz több név is tartozhat. A katalógus bejegyzések száma, viszont a linkben tárolódik. Minden inode rendelkezik egy azonosító számmal, amely egyedi a fájlrendszeren belül. Az inode száma a stat rendszerhívással kérdezhető le. Parancs is van ilyen: stat fajlnev Erre a célra használhatjuk az ls parancsot is: ls -li fajlnev ===== Könyvtár hierarchia ===== A számítógépen a fájlokat a rendezett eléréshez, hierarchikus könyvtár szerkezetben tároljuk. Egy fájl létrehozásakor a fájl neve és a fájlhoz tartozó inode azonosítószám a könyvtárhoz tartozó inode-ban tárolódik. ===== Az ext4 fájlrendszer ===== Az ext4 a partíciót logikai blokkok tömbjére osztja, amely csökkenti a könyvelést és növeli a teljesítményt. Elsődlegesen a blokk mérete 4KiB. A blokkok mérete 1 KiB és 64 KiB között lehet. A szektorok száma 2 hatványa, egy egész szám. A blokkok csoportokba vannak szervezve, amelyeket blokk csoportoknak nevezünk. Csatolási problémákat tapasztalhatunk, ha a blokk mérete nagyobb mint egy memória lap mérete. Egy i386 esetén a lapméret 4KiB, így ennél nagyobb blokk méret gondot okoz a csatolásnál. Alapértelmezetten egy fájlrendszer 2^32 darab blokkot tartalmaz. Ha a 64 bites lehetőség engedélyezett, a lehetséges blokk méret 2^64 blokk. 32 bites fájlrendszerek esetén a következő limitek érvényesek: ^ ^ 1 KiB ^ 2 KiB ^ 4 KiB ^ 64 KiB ^ | blokkok | 2^32 | 2^32 | 2^32 | 2^32 | | inode | 2^32 | 2^32 | 2^32 | 2^32 | | A fájlrendszer mérete | 4 TiB | 8 TiB | 16 TiB | 256 PiB | | Blokkcsoportonkénti \\ blokkok száma | 8192 | 16384 | 32768 | 524288 | | Blokkcsoportonkénti \\ inode-ok száma | 8192 | 16384 | 32768 | 524288 | | Blokkcsoport mérete | 8 MiB | 32 MiB | 128 MiB | 32 GiB | | Fájlonkénti blokkok száma \\ extent | 2^32 | 2^32 | 2^32 | 2^32 | | Fájlonkénti blokkok száma \\ közvetett blokkmegfeleltetés | 16 843 020 | 134 480 396 | 1 074 791 436 | 4 398 314 962 956 \\ valójában 2^32 a mezők \\ méretének korláta miatt | | Fájlméret \\ terjedelem | 4 TiB | 8 TiB | 16 TiB | 256 TiB | | Fájlméret \\ blokkleírók | 16 GiB | 256 GiB | 4 TiB | 256 TiB | 64 bites fájlrendszerek esetén a következő limitek érvényesek: ^ ^ 1 KiB ^ 2 KiB ^ 4 KiB ^ 64 KiB ^ | blokkok | 2^64 | 2^64 | 2^64 | 2^64 | | inode-ok | 2^32 | 2^32 | 2^32 | 2^32 | | A fájlrendszer mérete | 16 ZiB | 32 ZiB | 64 ZiB | 1 YiB | | Blokkcsoportonkénti \\ blokkok száma | 8192 | 16 384 | 32 768 | 524288 | | Blokkcsoportonkénti \\ inode-ok száma | 8192 | 16 384 | 32 768 | 524 288 | | Blokkcsoport mérete | 8 MiB | 32 MiB | 128 MiB | 32 GiB | | Fájlonkénti blokkok száma \\ extent | 2^32 | 2^32 | 2^32 | 2^32 | | Fájlonkénti blokkok száma \\ közvetett blokkmegfeleltetés | 16 843 020 | 134 480 396 | 1 074 791 436 | 4 398 314 962 956 \\ valójában 2^32 a mezők \\ méretének korláta miatt | | Fájlméret \\ terjedelem | 4 TiB | 8 TiB | 16 TiB | 256 TiB | | Fájlméret \\ blokkleírók | 16 GiB | 256 GiB | 4 TiB | 256 TiB | Amikor létrehozunk egy fájlt 4096 bájt méretű blokkokat foglalunk számára, mérettől függően. Egy inode-ban maximum 15 hivatkozás lehet. Így csak 61440 bájt méretű állományok lehetnének. Egy inode-on belül a hivatkozásoknak, ezért több fajtáját használjuk: * direkt hivatkozás -- közvetlenül adatblokkra hivatkozunk * indirekt hivatkozás * kétszeresen indirekt hivatkozás * háromszorosan indirekt hivatkozás Az indirekt hivatkozás egy újabb csomópontra mutat, amely adatokra tartalmaz hivatkozást. A kétszeresen indirekt hivatkozás mögött egy csomópont van, amely újabb csomópontokra mutat. A háromszorosan indirekt hivatkozás mögött az előzőekhez hasonlóan van egy újabb csomópont, amely mögött újabb és újabb csomópontok vannak három szinten, az ábrának megfelelően. {{:oktatas:linux:inode_retegek.png?400|}} Egy indoe-ban maximum 15 hivatkozás lehet. Ebből 12 lehet direkt hivatkozás, a többi az indirekt hivatkozásoknak van fenntartva. A fájlok (könyvtárak is) nevei a tartalmazó könyvtárak adatterületén tárolódnak. Az alábbi ábrán a /srv könyvtár első adatterületének részletét látjuk, ahol a fájlok inode száma és a fájl neve össze van kötve. {{:oktatas:linux:inode_adatblokk.png?400|}} Egy linuxos rendszerben a könyvtárak is fájlok, csak speciális fájlok. Így azok is a fájlokhoz hasonlóan tárolódnak. ===== Töredezettség vizuálisan ===== Az ext4 fájlrendszer a töredezettséget a blokkok csoportokba szervezésével, és menet közbeni töredezettség mentesítéssel igyekszik megoldani. Azért nem 100%-os sikerrel. A töredezettséget vizuálisan megtekinthetjük a fragview programmal: * https://github.com/i-rinat/fragview A használathoz telepítsük a szükséges függőségeket: # apt install libboost-dev libgtkmm-3.0-dev libglibmm-2.4-dev libsqlite3-dev Szükséges programok: # apt install git cmake g++ A nem csomagkezelővel a rendszerbe kerülő programok forráskódját a következő helyre szokás letölteni: /usr/local/src. Ezért lépjünk be ebbe a könyvtárba és töltsük le a fragview programot: # cd /usr/local/src # git clone https://github.com/i-rinat/fragview.git A git parancshoz, természetesen szükség van a git csomagra. A fordítás: $ cd fragview $ mkdir build && cd build $ cmake -DCMAKE_BUILD_TYPE=Release .. $ make A fordításhoz nem szükséges root jog, így egy felhasználó nevében is megtehetjük. Ha szeretnénk telepíteni is, akkor már root jog szükséges: # make install A program telepítés nélkül is használható. {{:oktatas:linux:fragview.png|}} ===== debugfs ===== A debugfs nagyszerű program a fájlrendszerek vizsgálatához, vagy egyszerűen csak azért, hogy megvizsgáljunk néhány tulajdonságot. Egy kísérlethez készítsünk egy 1 MiB méretű állományt: truncate -s 1M egy.txt Ellenőrizzük a fájl méretét: ls -l Az eredmény ehhez hasonló lehet: összesen 0 -rw-r--r-- 1 andras andras 1048576 szept 19 19:30 egy.txt Készítsünk ext2 fájlrendszert az állományon: /bin/mkfs.ext2 -F egy.txt Kapcsolódjunk fájlrendszerhez a debugfs programmal, írható módban: /sbin/debugfs -w egy.txt Megjelenik a debugfs várakozási-jele: $ /sbin/debugfs -w egy.txt debugfs 1.43.4 (31-Jan-2017) debugfs: A debugfs parancsokat vár. Nézzük meg a gyökérfájlrendszer inode tartalmát: debugfs: stat <2> A kimenet ehhez hasonló lehet: Inode: 2 Type: directory Mode: 0755 Flags: 0x0 Generation: 0 Version: 0x00000000 User: 0 Group: 0 Size: 1024 File ACL: 0 Directory ACL: 0 Links: 3 Blockcount: 2 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x5ba288ba -- Wed Sep 19 19:34:50 2018 atime: 0x5ba288ba -- Wed Sep 19 19:34:50 2018 mtime: 0x5ba288ba -- Wed Sep 19 19:34:50 2018 BLOCKS: (0):24 TOTAL: 1 A felületről a "Q" billentyűvel lehet kilépni, miután visszakapjuk a debugfs várakozási-jelet. További debugfs parancsokért írjuk be a help parancsot. A kimenet ehhez hasonló: Available debugfs requests: show_debugfs_params, params Show debugfs parameters open_filesys, open Open a filesystem close_filesys, close Close the filesystem freefrag, e2freefrag Report free space fragmentation feature, features Set/print superblock features dirty_filesys, dirty Mark the filesystem as dirty init_filesys Initialize a filesystem (DESTROYS DATA) show_super_stats, stats Show superblock statistics ncheck Do inode->name translation icheck Do block->inode translation change_root_directory, chroot Change root directory change_working_directory, cd Change working directory list_directory, ls List directory show_inode_info, stat Show inode information dump_extents, extents, ex Dump extents information blocks Dump blocks used by an inode --More-- Alul a --More-- felirat mutatja, hogy a szóköz billentyűvel lehet a többi parancsot megnézni. A legtöbb parancsnak létezik rövidített változata. A kilépés a debugfs-ből a "Q" billentyűvel lehetséges. A módosító parancs futtatásával az inode teljes felépítését megtekinthetjük. A parancs hosszú és rövid változata: modify_inode, mi A "/" könyvtár inode-ja: debugfs: mi <2> Mode [040755] User ID [0] Group ID [0] Size [1024] Creation time [1537378490] Modification time [1537378490] Access time [1537378490] Deletion time [0] Link count [3] Block count high [0] Block count [2] File flags [0x0] Generation [0x0] File acl [0] Directory acl [0] Fragment address [0] Direct Block #0 [24] Direct Block #1 [0] Direct Block #2 [0] Direct Block #3 [0] Direct Block #4 [0] Direct Block #5 [0] Direct Block #6 [0] Direct Block #7 [0] Direct Block #8 [0] Direct Block #9 [0] Direct Block #10 [0] Direct Block #11 [0] Indirect Block [0] Double Indirect Block [0] Triple Indirect Block [0] debugfs: Ha csak Entert ütünk minden érték után, nem változtatunk az inode értékein. Az inode helyének lekérdezése: debugfs: imap <2> Inode 2 is part of block group 0 located at block 8, offset 0x0080 debugfs: Törölt fájlok listája: lsdel Törölt fájl visszaállítása: undel További lehetőségekért nézzük meg a debugfs(8) kézikönyvet. ===== A /boot partíció ===== A korai boot menedzserek nem támogatták az ext3, ext4 partíciókat. Ezért azt szokták ajánlani, hogy legyen ext2. Manapság a GRUB2 támogatja az ext3 és ext4 partíciókat is, bármelyiket használhatjuk. Ha más fájlrendszert is használunk, mint például az xfs, akkor előfordulhat, hogy a GRUB nem támogatja, vagy a támogatás nem stabil, ezért ext fájlrendszert ajánlott használni a /boot partíció esetén. Mivel a boot partíció ritkán változik, ezért ext2 fájlrendszer megfelel a célnak, ami nem tartalmaz naplózást. Az alábbi webhelyen megtekinthetjük milyen fájlrendszereket támogat a GRUB: * https://www.gnu.org/software/grub/manual/grub/grub.html (2019) Keressük a "Support multiple filesystem types" részt. ===== Irodalom ===== * https://github.com/torvalds/linux/blob/master/fs/ext4/ext4.h (2019) * https://www.kernel.org/doc/html/latest/filesystems/ext4/overview.html#special-inodes (2019)