Unix file system
UFS (Unix file system, někdy též zvaný Berkeley Fast File System, BSD FFS, FFS) je v informatice název pro souborový systém používaný mnoha unixovými operačními systémy. UFS přímo vychází z původního unixového souborového systému (neměl název, označoval se prostě jako „souborový systém“ – filesystem, FS).
Struktura UFS
Struktura logického disku s UFS vychází ze struktury původního FS:
- boot blok – informace nutné pro bootování
- skupina
- superblock – metadata souborového systému (identifikace, informace o logickém disku – počet i-nodů, volné místo, umístění kořenového adresáře, seznam volných bloků, …)
- bloky s i-nody – tabulka i-nodů
- datové bloky (alokační jednotky)
- další skupina (skupiny se opakují až do konce logického disku)
Od původního unixového FS se UFS liší hlavně existencí tzv. „skupin“ (groups). Logický disk je rozdělen do opakujících se částí – skupin, přičemž každá skupina obsahuje vlastní zálohu superbloku, určitý počet i-nodů a datových bloků.
Při zápisu dat se UFS snaží udržet pohromadě v jedné skupině i-nody a k nim příslušná data v alokačních jednotkách (pokud to jde). Výhodou tohoto přístupu je zmenšení nutnosti přesunu hlaviček pevného disku, což vede k nižší latenci a k rychlejšímu přístupu k uloženým datům (souborům). UFS má oproti původnímu FS také větší velikost alokačního bloku (8 kB).
Z UFS vychází spousta dalších souborových systémů, např. MINIX file system, ext, …
Historie a vývoj
Původní verze unixových souborových systémů byly známé pouze jako FS (File System). File System obsahoval pouze boot block, superblock, pár i-nodů a datové bloky. Na discích s menší kapacitou, pro které byl původní FS navržen, to fungovalo dobře. Postupem času, jak šla technologie kupředu a kapacita disků se zvětšovala, čtecí hlava se musela pohybovat častěji tam zpět mezi jednotlivými i-nody a datovými bloky, což způsobovalo větší a větší latence (prodlevy). Marshall Kirk McKusick, absolvent univerzity v Berkeley, optimalizoval BSD 4.2 FFS (Fast File System) na tzv. skupiny, které rozdělily disk na menší části, kde měla každá část vlastní i-nody a datové bloky.
Záměrem BSD FFS bylo pokusit se sdružit datové bloky a metadata (i-nody) do jedné skupiny a pokud možno i celý obsah adresáře (obojí, data i metadata pro všechny soubory) do jedné nebo do přilehlé skupiny. Tímto řešením dojde nejen ke snížení latence, ale i ke snížení fragmentace dat, která je jinak způsobená roztroušením obsahu jedné složky po celém disku.
Některé z parametrů v superbloku obsahují číslo stopy a sektoru, rychlost hlavy a zarovnání sektorů mezi stopy. U plně optimalizovaných systémů, by se hlava měla pohybovat při čtení pouze mezi sousedními stopami.
Disky se zvětšovaly a zvětšovaly a i toto řešení se stalo zastaralé. U velkých disků a velkých souborů, bylo čtení fragmentovaných dat velký problémem. Aby tomu tak nebylo, tak se u BSD zvýšila velikost jednoho bloku souborového systému z jednoho sektoru (512 bajtů) na jeden tisíc ve verzi 4.0 BSD a u FFS se změnila velikost z jednoho tisíce na 8 tisíc. Díky tomuto opatření vzrostla pravděpodobnost, že data v sousedících sektorech na sebe budou navazovat a sníží se tak celková režie.
Další možností bylo zvětšit fyzickou velikost disku, protože počet bloků je omezen fixní bitovou šířkou jednoho bloku. Každý soubor musí mít přiřazen alespoň jeden datový block, čímž u disků obsahujících mnoho malých souborů dochází k plýtvání místem (vnitřní fragmentace). Kvůli tomuto se přidala do BSD tzv. úroveň fragmentace bloku, díky tomu může být uložen poslední dílčí blok dat z několika souborů v jednom fragmentu namísto v soukromém skoro prázdném bloku.
Implementace
Prodejci některých unixových operačních systémů jako jsou např. SunOS/Solaris, System V Release 4, HP-UX a Tru64 přijali UFS. Většina z nich si UFS přizpůsobila na vlastní použití, přidáním některých rozšíření které se nijak zvlášť neliší od rozšíření jiných prodejců. Mnoho z nich nadále používají stejné velikosti datových bloků a šířky datových polí jako původní UFS, takže je zde umožněna kompatibilita napříč platformami.
Do operačního systému Solaris 7 Sun Microsistems přidali UFS Logging, který přinesl do UFS žurnálování filesystému, které je dosud dostupné v aktuální verzi Solarisu. UFS v Solarisu má další rozšíření pro velké soubory, pro disky s větší kapacitou a ještě další vlastnosti.
U 4.4BSD a Unixových systémů které jsou z toho odvozeny jako je např. FreeBSD, NetBSD, OpenBSD, a DragonFlyBSD, je implementace UFS1 a UFS2 rozdělena do dvou vrstev. Vrchní vrstva zajišťuje adresářovou strukturu a správu metadat (přístupové oprávnění, vlastnictví atd.) v i-node struktuře a spodní vrstvu, která se stará o datové kontejnery implementované jako i-nody. Důvodem tohoto bylo zachovat podporu, jak tradičního FFS, tak i LFS a aby se mohl sdílet kód a běžné funkce. Horní vrstva se nazývá "UFS" a spodní vrstva se nazývá "FFS" a "LFS".
Kirk McKusick implementoval tzv. realokaci bloků, techniku, která přeuspořádá bloky v souborovém systému ještě předtím, než dojde k samotnému zápisu, čímž dojde k menší fragmentaci dat. Také implementoval některé mechanismy, které udržují systém v konzistentním stavu aniž by došlo k poklesu výkonu, což byla nevýhoda dosavadního způsobu synchronizace. To mělo za následek snížení délky kontroly souborového systému po pádu systému nebo při výpadku proudu. Aby se tomuto problému předešlo byla do systému zavedena utilita fsck.