Ext4 fájlrendszer bemutatása

Ext4

Frissítve: 2015-06-16

A 2.6.28-as kernelben az ext4 mellől el lett távolítva a fejlesztői figyelmeztetés. Ez azt jelenti, hogy nagyjából stabil, így elérkezettnek láttam az időt egy kis bemutatásra, így a Linux Kernel Newbies ext4-ről szóló cikkét fordítottam magyarra (szabadon). Kérem bocsássátok meg, ha nem lett túl magyaros vagy itt-ott az eredeti szöveghez képest ferdítettem. :)

Nem biztos, hogy mindenki megérti, miről is akarok én itt beszélni, illetve nem biztos, hogy megérti a szöveg kifejezéseit, így nem árthat a Wikipédia idevágó cikkét elolvasni.

Bevezetés

Az ext4 a legtöbbet használt linuxos fájlrendszernek, az ext3-nak a továbbfejlesztése. Az ext4 mélyebb átalakulást jelent, mint az ext2 ext3-ra fejlesztése, mivel az ext2-ből jóformán csak a naplózás hozzáadásával lett ext3. Az ext4-ben viszont fontos, adatstruktúrát érintő változtatások vannak, amik az adatok tárolását befolyásolják. Ezeknek a változtatásoknak és az optimalizált tervezésnek hála a fájlrendszernek jobb a teljesítménye, megbízhatóbb lett és újabb funkciókkal gazdagodott.

Az ext4 jellemzői

Kompatibilitás

Bármely meglévő ext3 fájlrendszer egyszerűen konvertálható ext4-re. Mindössze néhány parancsot kell kiadnod a csak olvasható módon (lásd később) felcsatolt fájlrendszeren. Ez azt jelenti, hogy formázás nélkül tudod javítani a fájlrendszered teljesítményét, csökkenteni annak limitációit és új funkciókat is kapsz hozzá. Mindezt formázás és az operációs rendszer, illetve a hozzátartozó szoftverkörnyezet újratelepítése nélkül.

Ha éles rendszeren van szükséged az ext4 előnyeire, akkor frissítheted a fájlrendszered. Ez a művelet biztonságos és nem veszélyezteti az adataidat (nyilvánvalóan a kritikus adatokról javasolt mentést készíteni, még akkor is ha nem frissíted a fájlrendszered :)). Az ext4 csak az új adatoknál fogja használni az új adatstruktúrát, a régiek érintetlenek maradnak és szükségszerűen lehet írni/olvasni őket. Ez természetesen azt jelenti, hogy amint konvertáltad a fájlrendszered ext4-re, nem tudsz visszatérni ext3-ra. Bár a következő fejezetben leírtak segítségével van rá mód, hogy ext3-at csatolj ext4-ként az új lemezformátum használata nélkül, így ha kell, újra ext3-ként tudod csatolni. Ezzel azonban elveszted az ext4 legtöbb előnyét.

Nagyobb fájlrendszer és fájlméretek

Az ext3 jelenleg maximum 16 TB-os fájlrendszer és 2 TB-os fájlméretet támogat. Az ext4 48-bites blokk címzést használ, így 1 EB (Exabyte) a fájlrendszer maximális mérete, amelyen legfeljebb 16 TB méretű lehet egy fájl. 1 EB = 1 048 576 TB (1 EB = 1024 PB, 1 PB = 1024 TB, 1 TB = 1024 GB). Miért 48 bit és nem 64 bit? Van néhány, az ext4 céljai közt nem szereplő, megoldatlan korlátozás, melyet még meg kell oldani ahhoz, hogy teljesen 64 bit képes legyen. Azonban az adatstruktúra tervezésekor ez is szempont volt, így egy jövőbeli, 64 bitre történő frissítés nem lesz probléma. Addig is 1 EB elég lesz (de tényleg! :)). Megjegyzés: A cikk írásának idejében (2011-05-19), a stabil e2fsprogs még nem tartalmazza a 16 TB-nál nagyobb fájlrendszerek létrehozásához szükséges kódot.

Alkönyvtárak skálázhatósága

Az ext4 jelenleg az egy könyvtárban lévő alkönyvtárak számát 32 000 darabban maximalizálja. Az ext4 esetén nincs korlátozás.

Extent

A hagyományos, Unix alapú fájlrendszerek – ahogy az ext3 is – közvetett block megfeleltetést használnak ahhoz, hogy nyilvántartsák, melyik blokk tartozik a fájl adott részéhez. Ez nem hatékony nagy fájloknál, főleg mikor nagy fájlokat törlünk vagy ürítünk. Azért, mert a megfeleltetés minden egyes blokkhoz tartalmaz egy bejegyzést, és a nagy fájlokhoz sok blokk tartozik → a sok megfeleltetés kezelése pedig lassú. A modern fájlrendszerek megközelítését „extent”-nek nevezzük, aminek a legjobb fordítása talán a „hatáskör” lehet. Az extentek alapvetően egy tucat, megszakítás nélkül egymást követő blokk. Azt mondja, hogy „Az adat a következő n blokkban van”. Például, egy 100 MB-os fájl lefoglalható egy darab, 100 MB méretű extentbe, ahelyett hogy közvetett megfeleltetéssel létrehoznánk 25 600 blokkot (4 KB blokkonként). A nagy állományok több extentbe darabolódnak. Az extentek javítják a teljesítményt és csökkenti a töredezettséget, mivel az extentek elősegítik az állományok folyamatos elhelyezését a lemezen.

Több blokk elhelyezése ~ Multiblock allocation

Mikor az ext3-nak új adatot kell írnia a lemezre, a blokkelhelyező dönt arról, hogy melyik szabad blokkokba kerüljön az adat. Az ext3 blokkelhelyező azonban egyszerre csak egy blokkot (4 KB) tud elhelyezni. Ez azt jelenti, hogyha az előző pontban említett 100 MB-ot kell a rendszernek kiírnia, akkor a blokkelhelyezőt 25 600 alkalommal (és ez csak 100 MB!) kell meghívnia. Ez nem csak pazarló, de még csak nem is ad lehetőséget a blokkelhelyezőnek arra, hogy optimalizálja az elhelyezési rendet, ugyanis fogalma sincs arról, hogy mennyi adat kerül majd lefoglalásra. Mindössze egy blokkról tud. Az ext4 „több blokk elhelyezőt” ~ „multiblock allocator” (mballoc) használ, ami egy hívással több blokkot is el tud helyezni, ahelyett hogy egyet foglalna le hívásonként. Ezzel rengeteg felesleges munkát spórol meg, így javítja a teljesítményt, és a gyakorlatban kifejezetten hasznos a késleltetett elhelyezés és extent használatakor. Ez a képesség nem befolyásolja a lemez formátumot. Érdemes megjegyezni, hogy az ext4 blokk/inode elhelyezője további javításokat is tartalmaz, amelyekről részletesen itt olvashatsz.

Késleltetett elhelyezés ~ Delayed allocation

A késleltetett elhelyezés egy teljesítményt javító funkció (amely nem változtatja meg a fájlrendszer felépítését). Néhány, az XFS, ZFS, btrfs vagy Reiser 4-hez hasonló modern fájlrendszerekben megtalálható. Funkciója, hogy addig késleltesse a blokkok lefoglalását, ameddig csak lehetséges, szemben a hagyományos (ext3, Reiser 3, stb.) fájlrendszerekkel, amelyek azonnal lefoglalják a blokkot, amint csak lehetséges. Például, ha egy folyamat write()-tal ír, a fájlrendszer kódja azonnal lefoglalja az adatokhoz szükséges blokkokat – még akkor is, ha azok nem kerülnek azonnal kiírásra, hanem előtte még egy ideig a gyorsítótárban maradnak. Ennek a megközelítésnek azonban hátránya van. Például, amikor egy folyamat folyamatosan ír egy fájlba, az nő, a sikeres írásokkal blokkokat foglal az adatoknak, ugyanakkor fogalma sincs róla, hogy ez egy állomány, ami nő. Mikor a folyamat kiadja az írás parancsot, az adatok nem kerülnek azonnal kiírásra, hanem egy ideig még a gyorsítótárban maradnak és csak később kerülnek kiírásra. Ez lehetőséget ad a blokk lefoglalónak, hogy olyan helyzetekben is optimalizálja a lefoglalás folyamatát, ahol a régebbi rendszerek nem tudják. A késleltetett elhelyezés nagyon jól működik együtt a fentebb említett két funkcióval: az extentekkel és a több blokk elhelyezővel. Ugyanis sok esetben, mikor a fájl véglegesen kiírásra kerül, az extentekben kerül eltárolásra, amit az mballoc lefoglaló végez el. Így ugyanolyan esetekben a teljesítmény sokkal jobb, a töredezettség pedig sokkal kisebb.

Gyors fsck

Az fsck egy nagyon lassú művelet, főleg az első lépés: a fájlrendszer inode-jainak az ellenőrzése. Az ext4-ben minden inode csoport végén van egy táblázat, ami nem használt inode-ok listáját tartalmazza (ellenőrzőösszeggel a biztonság kedvéért), így az fsck nem fogja ellenőrizni ezeket az inode-okat. A használt inode-ok számától függően, az eredmény legalább 2x, de akár 20x gyorsabb lehet az fsck (http://kerneltrap.org/Linux/Improving_fsck_Speeds_in_ext4, angol). Azonban meg kell jegyezni, hogy az fsck az, ami elkészíti a nem használt inode-ok listáját és nem az ext4. Ez azt jelenti, hogy az fsck-nak először el kell készítenie a nem használt inode-ok listáját és majd csak a következő alkalommal fog gyorsabban futni (amúgy is, sikeresen le kell futnia az fsck-nak, ha ext3-at akarsz ext4-re konvertálni). Továbbá van még egy funkció, aminek köze van az fsck gyorsításához és ez a „rugalmas blokk csoportok” ~ „flexible block groups”, amelyek tovább gyorsítják a fájlrendszerműveleteket.

Ellenőrzőösszeg a naplózáshoz

A naplózás a lemez legjobban használt része, így ez a legérzékenyebb a hardveres hibákra. A hibás naplózásból való visszaállítás pedig komoly adatsérüléshez vezethet. Az ext4 ellenőrzőösszeget társít a naplózáshoz, hogy meg tudja állapítani, az rossz vagy sérült-e. További előnye is van: egyfázisúvá tudja konvertálni az ext3 naplózás kétfázisú commit rendszerét, így bizonyos esetekben kb. 20%-kal javul a fájlrendszer műveletek sebessége, miközben nő a megbízhatóság. (Megjegyzés: A képesség azon része, ami javítja a teljesítményt, az az aszinkron logolás. Alapértelmezetten még ki van kapcsolva, de az elkövetkező kiadásokban bekapcsolják, ha elég megbízható lesz.)

„Nincs naplózás” mód.

A naplózás hivatott biztosítani a fájlrendszer integritását, ebben vannak naplózva a folyamatos változások. Tudjuk, hogy ennek egy kis teljesítménybeli ára van. Néhányaknak, akiknek különleges igényeik és feladataik vannak, futtathatják az ext4-et a naplózás, így a belőle adódó előnyök nélkül is. Az ext4-ben ki lehet kapcsolni a naplózást, ami némi teljesítmény javulást okoz.

Online töredezettség-mentesítés

Bár a késleltetett elhelyezés, az extentek és a több blokk elhelyezése segítenek a töredezettség csökkentésében, használat közben a fájlrendszer még mindig töredezhet. Például: három fájlt írsz egy könyvtárba, miközben folyamatosan írsz a lemezre. Később frissítened kell a középső állományt, amelyik egy kicsit megnőtt, így nincs elég hely számára. Nincs más választásod, mint a rendelkezésre álló területnél nagyobb töredéket máshova teszed, ami a lemez seekelését eredményezi. Vagy a nagyobb méretű, frissített állományt teljes egészében egy olyan, az eredeti fájloktól távol eső pontra helyezzük, ami, ha az adott alkalmazásnak mindhárom állományra szüksége van (pl. fájlkezelő bélyegképeket készít a könyvtárban lévő képekből), szintén seeket okoz. Másrészről a fájlrendszer csak bizonyos típusú töredezettséggel tud foglalkozni. Például nem tud róla, de muszáj egyben tartania a rendszerindítással kapcsolatos állományokat, pedig fogalma sincs arról, hogy melyek ezek. A probléma megoldására az ext4 támogatja az online töredezettség-mentesítést, amihez létezik az e4defrag eszköz, amellyel akár a különálló fájlokat, akár a teljes fájlrendszert lehet töredezettség-mentesíteni.

Inode-dal kapcsolatos fejlesztések

Nagyobb inode-ok: Az ext3 támogatja a konfigurálható inode méretet (az mkfs -l paraméterén keresztül), de az alapértelmezett mérete 128 byte. Az ext4 esetén az alapértelmezett értéke 256 byte. Erre a néhány plusz mező (ezredmásodperces időbélyeg vagy inode verziókövetés) miatt volt szükség, a maradék területen pedig a kiterjesztett attribútumok kerülnek tárolásra, amelyek elég kicsik ahhoz, hogy elférjenek. Így ezekhez az attribútumokhoz való hozzáférés sokkal gyorsabb lett, ami a kiterjesztett attribútumokat használó alkalmazások esetén a teljesítményt 3-7x-ére növelte.

Az inode fenntartás funkció lefoglal néhány inode-ot akkor, amikor a könyvtárat létrehozod, mert azt feltételezi, hogy a közeljövőben fájlok kerülnek a könyvtárba. Ez javítja a teljesítményt, mert mikor új fájlt hozol létre a nemrég létrehozott könyvtáradban, az az előre lefoglalt inode-okat használja. Így a fájl létrehozás és törlés is hatékonyabb.

Az ezredmásodperces időbélyegzés azt jelenti, hogy az inode-okban a „Módosítás ideje” mező ezredmásodperces pontosságú, szemben az ext3 másodperces pontosságával.

Tárhely tartós, előre lefoglalása

Ez a képességet az ext3 is támogatja az újabb kernelekben, illetve a glibc emulálja azokon a fájlrendszereken, ahol ez nem támogatott: lehetővé teszi az alkalmazásoknak a tárhely lefoglalását azelőtt, mielőtt azt valójában használatba vennék. Az alkalmazás megmondja a fájlrendszernek, hogy foglalja le előre a szükséges blokkokat és adatstruktúrákat a fájlrendszerben, azonban az oda tartózó adatokat csak később fogja beleírni. Ezt csinálják a fájlcserélő alkalmazások is, mikor „előre lefoglalják” a szükséges területet a letöltéshez, ami órákig vagy akár napokig is eltarthat. Azonban ez a funkció jóval hatékonyabban, a fájlrendszer általános API-jával van implementálva. Több felhasználása is van: először is, hogy elkerüljük, az alkalmazások (pl. fájlcserélők) maguk csinálják ugyanezt úgy, hogy feltöltik a fájlokat nullákkal. Továbbá csökkenti a töredezettséget, mivel a blokkok egyszerre kerülnek lefoglalásra, a lehető legfolyamatosabban. A harmadik fontos dolog, hogy ezzel az alkalmazás mindig biztos lehet abban, hogy a szükséges tárhelye mindig elérhető. Ez a valósidejű alkalmazásoknál fontos, ugyanis előre lefoglalás nélkül egy fontos művelet kellős közepén telítődhet a fájlrendszer. Ez a képesség a libc posix_fallocate() felületén keresztül érhető el.

Alapértelmezetten bekapcsolt korlátok (barriers)

Ez az opció némi teljesítményért cserébe javítja a fájlrendszer integritását (kikapcsolható a mount -o barrier=0 beállítással, amit teljesítményteszteknél javasolt is). Ebből az LVM cikkből idézve: mielőtt a fájlrendszer kódja ír a naplózás commit rekordjába, teljességgel meg kell bizonyosodnia arról, hogy minden művelet információja bekerült a naplózásba. Ha csak az írások megfelelő sorrendjét tartjuk be, az nem elég hatékony, napjaink lemezei hatalmas belső gyorsítótárakkal rendelkeznek és a jobb teljesítmény érdekében, újrarendezik a műveleteket. Ezért a fájlrendszernek utasítania kell a lemezt, hogy minden naplózási információt írjon ki, mielőtt a naplózás commit rekordját kiírná. Ha a commit rekord kerül először kiírásra, a naplózás sérülhet. A kernel blokk I/O alrendszerével lehetőség van a korlátok használatára. Röviden: a korlát alkalmazása után nem lehet írni a lemezre addig, amíg a korlát ki nem íródik az eszközre. Korlátok alkalmazásával biztosak lehetnek benne a fájlrendszerek, hogy a saját lemezen lévő struktúrájuk mindig konzisztens marad.

Hogyan használd az ext4-et?

Jelenleg minden fontos disztró támogatja, ahogy a GRUB is. Csak használd. Az ext4-re való váltás nagyon egyszerű, háromféle út is járható:

Új ext4 fájlrendszer létrehozása:

Ez a legegyszerűbb, és új telepítésekhez ez ajánlott: frissítsd (ha szükséges) az e2fsprogs csomagot ext4-re és hozz létre egy új fájlrendszert: mkfs.ext4

Meglévő, ext3 konvertálása ext4-re:

Szükséged van a tune2fs és fsck programokra, illetve a fájlrendszert le kell csatolnod. Futtasd ezt:
tune2fs -O extents,uninit_bg,dir_index /dev/konvertalandofajlrendszer
Miután lefuttattad a fenti parancsot az fsck-nak is futnia KELL. Ha nem futtatod, akkor az ext4 NEM FOGJA CSATOLNI a fájlrendszered. Szükség van az fsck futtatására ahhoz, hogy a fájlrendszered újra konzisztens legyen. Jelezni FOGJA, hogy ellenőrzőösszeg hibákat talált a csoport leírókban. Ez így van rendjén és pontosan ez az, mire szükségünk van, mert ezek újraépítésével már képesek leszünk a fájlrendszert ext4-ként csatolni, szóval ne ijedj meg. Minden alkalommal, mikor talál egy ilyen hibát, meg fogja kérdezni, hogy mit tegyen. Mindig mondj IGENt a kérdésre. Ha nem akarod, hogy kérdezősködjön, az fsck paramétereihez add hozzá a -p kapcsolót, ami bekapcsolja az „automatikus javítást”.
fsck -pDf /dev/konvertalandofajlrendszer
Van még valami, amit meg kell említenem: minden meglévő állományod az ext3-nál érvényes, régi, közvetett megfeleltetést fogja használni az adatok blokkjainak meghatározásához. Az online töredezettség-mentesítő képes ezt konvertálni az új, extent alapú formátumra (az ioctl-t használja, ami megmondja a fájlrendszernek, hogy írja újra a fájlt, extent formátumba. Biztonságos művelet, a fájlrendszer normál használata közben is kiadhatod a parancsot.).

A meglévő ext3 fájlrendszered csatolása ext4-ként, a lemezformátum megváltoztatása nélkül:

Csatolhatod a meglévő ext3 fájlrendszeredet ext4-ként úgy, hogy csak azokat a képességeket használod belőle, amelyek nem változtatják a lemezformátumot. Ez azt jelenti, hogy ha szükséges, újra ext3-ként is használhatod. Ezt a  mount -t ext4 /dev/particio /mnt/particio paranccsal teheted meg. Mindezt anélkül, hogy a fentebb említett konverziós eljárást végrehajtottad volna. Ezzel arra kényszeríted az ext4-et, hogy ne változtassa meg a lemezformátumot, azaz ne használja pl. az extent-eket, azonban a változtatást nem igénylő képességeket igen, úgy mint az mballoc-ot vagy a késleltetett elhelyezést. Így később ext3-ként is tudod csatolni. Nyilvánvaló, hogy így elveszted az ext4 képességeinek azon előnyeit, melyeket nem használhatsz.