Tartalomjegyzék

< Linux

Fájlrendszer adatstruktúra Linuxon

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:

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.

Irodalom