Tartalomjegyzék
Fájlrendszer adatstruktúra Linuxon
- Szerző: Sallai András
- Copyright © 2017, Sallai András
- Szerkesztve: 2017, 2018, 2019
- Licenc: 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.
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.
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:
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ó.
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:
Keressük a „Support multiple filesystem types” részt.