< Linux

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:

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ó.

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)