ext4

naplózó fájlrendszer Linuxhoz


Az ext4 (fourth extended file system) naplózó fájlrendszer Linuxhoz, az ext3 utóda.

ext4 (fourth extended file system)
FejlesztőTheodore Ts'o et al.
Partícióazonosító0x83
Struktúra
KönyvtárszerkezetH-fa, táblázat
Fájlszerkezetbitkép (szabad hely), táblázat (metaadatok)
Hibásszektor-szerkezettáblázat
Korlátok
Maximális fájlméreta fájlrendszer mérete
Maximális fájlszám64 000
Fájlnév maximális hossza255 B
Maximális kötetméret1 EiB
Tiltott karakterek a fájlnevekben\0 (NULL) és „/”
Képességek
Dátumhatárok1901. december 14. – 2514. április 25.
Dátumfelbontás1 ns
Támogatott operációs rendszerekLinux

Az ext4 eredetileg az ext3 visszafelé kompatibilis bővítéseinek sora volt, melyek nagy részét a Cluster File Systems készítette a Lustre fájlrendszerhez 2003–2006 közt a tárhelyhatárok növelésére és más teljesítményjavításokhoz.[1] Azonban más Linux-mag-fejlesztők stabilitási okokból nem fogadták el a kiterjesztéseket,[2] és javasolták az ext3-kód leágazását, annak ext4-re való átnevezését és az ott történő fejlesztéseket a meglévő ext3-használók érintése nélkül. Ezt elfogadták, és 2006. június 28-án Theodore Ts'o, az ext3 karbantartója bejelentette az ext4 tervét.[3]

Az ext4 előzetes verzióját tartalmazta a Linux 2.6.19.[4] 2008. október 11-én az ext4-et stabilnak jelölő változtatások kerültek a Linux 2.6.28 repozitóriumokba,[5] az ext4 fejlesztése befejeződött, bevezetése ajánlott lett. E verzió 2008. december 25-én jelent meg.[6] 2010. január 15-én a Google közölte, hogy tárhely-infrastruktúráját ext2-ről ext4-re frissíti.[7] 2010. december 14-én azt is közölte, hogy az Android 2.3 YAFFS helyett ext4-et használ.[8]

Használat

Az ext4 számos Linux-disztribúció, például a Debian és az Ubuntu alapértelmezett fájlrendszere.[9]

Jellemzők

Az fsck időfüggése inode-számtól (ext3 és ext4 összehasonlítása)
  • Nagy fájlrendszer: az ext4 elvileg 64 ZiB-os köteteket és 16 TiB-os fájlokat is képes támogatni 4 KiB-os blokkmérettel, 64 KiB-os csoportokkal pedig akár 1 YiB-os köteteket is támogathat, de a formátum korlátai miatt 1 EiB a gyakorlati felső határ.[10] A maximális fájl-, könyvtár- és fájlrendszerméret legalább a fájlrendszerblokkmérettel arányosan nő az ARM és PowerPC/Power ISA CPU-kon elérhető 64 KiB-os blokkméretig.
  • Extentek: Az ext2 és 3 által használt blokkhozzárendelések helyett az ext4-ben extentek vannak. Ezek összefüggő fizikai blokkokból álló tartományok, javítva a teljesítményt nagy fájloknál, és csökkentve a töredezettséget. Egy extent az ext4-ben legfeljebb 128 MiB lehet 4 KiB blokkmérettel.[1] Az inode közvetlenül 4 extentet tárolhat. Ha ennél többől áll egy fájl, a többi indexelése faszerkezetben történik.[11]
  • Visszafelé kompatibilitás:
    • Az ext4 kompatibilis az ext3-mal és az ext2-vel, lehetővé téve az ext3- és ext2-kötetek ext4-kénti csatlakoztatását. Ez kissé javítja a teljesítményt, mivel az ext4 egyes új funkciói használhatók ext3-mal és 2-vel, mint például az új blokkhozzárendelő algoritmus, formátumváltoztatás nélkül.
    • Az ext3 részben kompatibilis az ext4-gyel. Az ext4 nem csatlakozik ext3-ként rögtön, kivéve egyes funkciók (például ^extent, ^flex_bg, ^huge_file, ^uninit_bg, ^dir_nlink és az ^extra_isize) létrehozáskori letiltásával.[12]
  • Állandó előallokáció: Az ext4 előre hozzárendelhet egy fájlhoz tárhelyet. Ehhez a fájlhoz 0-k írandók a létrehozáskor. Az ext4-ben és egyes más fájlrendszerekben, például az XFS-ben a fallocate() használható. A terület-hozzárendelés biztos, a terület valószínűleg folytonos lesz. Ez adatfolyamoknál és adatbázisokban használatos.
  • Késleltetett terület-hozzárendelés: Az ext4 ürítéskori hozzárendeléssel (más néven késleltetett hozzárendelés) is rendelkezik. Ez azt jelenti, hogy az adat meghajtóra helyezéséig az ext4 késlelteti a hozzárendelést, ezzel szemben egyes fájlrendszerek azonnal hozzárendelnek blokkokat az adatokhoz, akkor is, ha írógyorsítótárba kerül az adat. Ez javítja a teljesítményt és csökkenti a töredezettséget több adat egyidejű hozzárendeelésével.
  • Korlátlan számú almappa: az ext4 nem korlátozza egy mappa almappáinak számát a mappa mérethatárain túl (ext3-ban egy mappában legfeljebb 32 000 almappa lehetett).[13] A nagyobb mappák melletti változatlan teljesítményhez az ext4 a Linux 2.6.23-tól H-fát (a B-fa speciális változata) használ, lehetővé téve 10-12 millió bejegyzéses mappák 2 szintű H-fában tárolását és 2 GB-os mappamérethatárt 4 KiB-os blokkok esetén, fájlnévtől függően. A Linux 4.12-ben megjelent a largedir funkcióval a 3 szintű H-fa és 2 GB feletti mappaméret, 6 milliárd bejegyzést lehetővé téve egy mappában.
  • Napló-ellenőrzőösszegek: Az ext4 ellenőrző összegeket használ[14] a naplóban a megbízhatóság javítására, hiszen ez az egyik leggyakrabban használt fájl. Ez ezenkívül elkerüli az I/O-várakozást naplózáskor, javítva a teljesítményt. A napló-ellenőrzőösszeget a Wisconsini Egyetemben megjelent IRON File Systems című cikk ihlette[15] (ezen belül a 6. szakasz, melynek címe „Transaction checksums”), a megvalósításban az IRON fájlrendszertől kissé eltérve (melyet eredetileg Sam Naghshineh javasolt a RedHat-találkozón).
  • Metaadat-ellenőrzőösszegek (a Linux 3.5 (2012) óta)[16][17]
  • Gyorsabb fájlrendszer-ellenőrzés: az ext4-ben az üres blokkcsoportok és szakaszok ekként vannak jelölve, lehetővé téve az e2fsck-nak ezek kihagyását és a fájlrendszer-ellenőrzéshez szükséges idő csökkenését. Ez a Linux 2.6.24-ben jelent meg.
  • Több blokk hozzárendelése: Ha az ext3-ban egy fájl megnő, a blokkhozzárendelést blokkonként hívja meg, így ha több egyidejű írás is van, a fájlok könnyen töredezhetnek. Az ext4 azonban késleltetett hozzárendelést használ, lehetővé téve az adatpufferelést és blokkcsoportok hozzárendelését. Így jobban dönthet a hozzárendelő a fájlok folytonos hozzárendelése kapcsán. Ez használható ezenkívül O_DIRECT módban nyitott fájlokkal, és nem változtatja meg a meghajtó formátumát.
  • Jobb időbélyegzők:
    • A gyorsabb számítógépek és a Linux egyre fontosabb alkalmazásai miatt a másodpercalapú időbélyegzők nem elegendőek, ezt az ext4 nanoszekundum-alapú időbélyegzővel oldja meg. Ezenkívül 2 bit került hozzá a másodpercek legértékesebb bitjéhez a 2038-as probléma elkerülésére további 408 évre.[18]
    • Az ext4 ezenkívül a létrehozási idő bélyegzőit is támogatja. Azonban ahogy Theodore Ts'o említette, bár könnyű hozzáadni létrehozásdátum-mezőt az inode-hoz (lehetővé téve ezek támogatását ext4-ben), nehezebb a megfelelő rendszerhívások (például a stat) és az ezeken alapuló könyvtárak (például a glibc) hozzáadását vagy módosítását. Ezek számos projekt koordinálását igénylik.[19] Így az ext4 által tárolt létrehozási idő csak statx API-val rendelkező programokon érhető el Linuxon.[20]
  • Projektkvóták: A Linux 4.4-ben (2016. január 8.) jelent meg a projektkvóták támogatása. Ez lehetővé teszi tárhelykvóták adott projektazonosítóhoz rendelését. Egy fájl projektazonosítója a fájlon tárolt 32 bites szám, melyet minden adott projektazonosítóval rendelkező szülőkönyvtár fájljai és alkönyvtárai örökölnek. Ez lehetővé teszi kvóták adott könyvtárfához rendelését függetlenül a fájlhozzáférési engedélyektől, például beállíthatók UID-en és GID-en alapuló kvóták. Bár ez hasonlít a könyvtárkvótákra, a különbség az, hogy azonos projektazonosítója lehet több felső szintű könyvtárnak, így az nem szigorúan hierarchikus.[21]
  • Átlátszó titkosítás: megjelent a Linux 4.1-ben (2015. június).[22]
  • „Lusta” inicializáció: a lazyinit lehetővé teszi az inode-táblák háttérben való tisztítását, felgyorsítva új fájlrendszer létrehozásakor. az inicializációt.[23] A Linux 2.6.37-ben (2010) jelent meg.[24]
  • Íráshatárok: ezek biztosítják a fájlrendszeri metaadatok megfelelő írását és rendszerezését. Ez teljesítménybeli költséget okoz, különösen fsyncet sokat használó, illetve sok kis fájlt létrehozó és törlő alkalmazások esetén. Akkumulátoros írógyorsítótár esetén a határok letiltása („barrier=0”) biztonságosan javíthatja a teljesítményt.[25]

Korlátok

2008-ban az ext3 és ext4 fő fejlesztője, Theodore Ts'o kijelentette, hogy bár az ext4-nek számos jobb funkciója van, nem jelentős újítás: régi technológiát használ, és időleges megoldás. Szerinte a Btrfs jobb, mivel „jobban méretezhető, megbízhatóbb, és könnyebben kezelhető”.[26] A Btrfs-ben ezenkívül „számos hasonló ötlet van a reiser3/4-hez”.[27] Azonban az ext4 új funkciókat kapott, például titkosítást és metaadat-ellenőrzőösszegeket.

Az ext4 nem használja a „biztonságos törlés” attribútumot, mely törléskor a fájlok felülírását okozta volna. Egy ilyet tartalmazó változtatást javasoltak 2011-ben, de nem oldotta meg az érzékeny adatok naplóba kerülését.[28]

Késleltetett hozzárendelés és lehetséges adatvesztés

Mivel a késeltetett hozzárendelés megváltoztatja az ext3-hoz képest a viselkedést, e funkció további lehetséges adatvesztést okozhat, amennyiben a rendszer összeomlik vagy leáll az összes adat kiírása előtt. Így az ext4 a 2.6.30 verziótól ez eseteket az ext3-hoz hasonlóan kezeli.

Általában ez egy fájl tartalmát a módosítások kiírásának fsynckel való kényszerítése nélkül módosító program esetén fordul elő. Két gyakori módja van egy fájl módosításának Unix-alapú rendszeren:[29]

fd=open("file", O_TRUNC); write(fd, data); close(fd);

Ez esetben egy létező fájl nyitáskor megszűnik (az O_TRUNC paraméter miatt), majd új adatok kiírása történik. Mivel az írás eltarthat némi ideig, lehetséges ext3-mal is az adatvesztés, de ez ritka. Azonban mivel az ext4 képes hosszú ideig késleltetni a kiírást, ez gyakoribb lehet ekkor.
Számos probléma történhet:
  1. Ha az írás nem sikerül (például az íróprogram hibái vagy külső körülmények, például teli meghajtó miatt), mindkét fájlverzió elvész, és a fájl sérülhet, mivel csak egy részét írta ki a program.
  2. Ha más folyamatok férnek a fájlhoz annak írása közben, sérült változatot látnak.
  3. Ha más folyamatokban nyitva van a fájl, és nem várják annak megváltozását, ezek összeomolhatnak. Példa erre egy megosztott könyvtári fájl, mely futó programokba van leképezve.

Emiatt gyakran az alábbit használják inkább:

fd=open("file.new"); write(fd, data); close(fd); rename("file.new", "file");

Új ideiglenes fájl jön létre file.new néven az új tartalmakkal, majd annak az átnevezése történik meg a régi névre. A rename() révén történő felülírás atomiságát a POSIX szabványok biztosítják – vagyis vagy megmarad a régi fájl, vagy felülírja az új. Az ext3 alapértelmezett „rendezett” naplózása biztosítja, hogy a fájladatok a metaadatok előtt íratnak ki, biztosítva, hogy a régi és az új fájlok valamelyike megmarad. Az ext4 késleltetett hozzárendelése ezen elvárást nem teljesíti: a fájlírás hosszan késleltethető, és az átnevezés az új fájl tartalmainak kiírása előtt történik.

Az fsync() kockázatcsökkentésért való gyakoribb használata a legtöbb Linux-disztribúción alapértelmezett data=ordered paraméterrel csatlakoztatott ext3 fájlrendszereken teljesítménycsökkenést okozhat. Mivel mindkét fájlrendszer használatban lesz bizonyos időre, ez bonyolítja a fejlesztők feladatait. Az ext4 a Linux 2.6.30-tól észleli e gyakori eseteket, és kényszeríti a fájlok azonnali hozzárendelését. Ez az ext3 rendezett módjához hasonló szemantikát biztosít, és növeli az esélyét, hogy az egyik fájlváltozat túléli az összeomlást. Ez az új viselkedés az alapértelmezett, de letiltható a „noauto_da_alloc” beállítással.[29]

E változtatások a fő mag 2.6.30 verziójában vannak jelen, de egyes disztribúciók 2.6.28-on és 2.6.29-en is működőképessé tették.[30]

Ezek nem gátolják meg teljesen az adatvesztést, vagy segítenek az új fájlokkal. Az egyetlen biztonságos mód olyan szoftverek írása és használata, mely szükség esetén fsyncet használ. A teljesítményproblémák a fsyncet igénylő írási műveletek számának korlátozásával oldhatók meg.[31]

Megvalósítás

A Linux-mag egyszerűsített szerkezete: az ext4 a virtuális fájlrendszer és a blokkréteg közt van

A Linux-mag virtuális fájlrendszere a Linux-magon belüli alrendszer, több fájlrendszer egy szerkezetbe való integrálására tett kísérlet eredménye. A Sun Microsystems alkalmazottainak 1986-ban végzett munkájára visszavezethető ötlet[32] a minden fájlrendszerben közös rész kiemelése és önálló rétegbe helyezése, mely a fájlrendszereket hívja az adat tényleges kezeléséhez.

Minden fájlhoz vagy álfájlhoz tartozó rendszerhívás a Linux rendszermag virtuális fájlrendszeréhez kerül feldolgozásra. Ezek szabványos POSIX-hívások, például open, read, write, lseek stb.

Kompatibilitás Windowszal és macOS-szel

Jelenleg az ext4 teljes körűen támogatott Linuxon kívül is.

A Windows az ext4-hez a Windows 10 Build 20211 óta tud hozzáférni.[33][34][35] A 2016. augusztus 2-án a Windows 10 1607-es verziójában bevezetett Windows Subsystem for Linux (WSL) révén lehetséges ez. WSL is available only in 64-bit versions of Windows 10 from version 1607. Ezenkívül elérhető a Windows Server 2019-ben is. A WSL-architektúrában a WSL 2 2019. június 12-i kiadásával történt nagy változás.[36] A WSL 2 legalább Windows 10 Version 1903-at igényel (build 18362) x64-es, illetve legalább Version 2004-et (build 19041-től) ARM64-rendszerekre.[37]

A Paragon Linux File Systems for Windows nevű terméke[38] lehetővé teszi az ext2/3/4 írását-olvasását Windows 7 SP1-en, 8-on, 8.1-en, 10-en, Windows Server 2008 R2 SP1-en, 2012-n és 2016-on.

A macOS teljes ext2–4-írási/olvasási képességgel rendelkezik a kereskedelmi extFS for Mackel.[39] A szabad szoftverek, például az ext4fuse csak olvasást támogatnak korlátozott mértékben.

Jegyzetek

Fordítás

Ez a szócikk részben vagy egészben az ext4 című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Kapcsolódó szócikkek

További információk