[[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)