Unix-bestandssysteem
UFS ( Unix File System ) is een bestandssysteem dat voornamelijk wordt gebruikt in Unix en Unix-achtige besturingssystemen . Het is een afgeleide van het Berkeley Fast File System , dat zelf is ontwikkeld op basis van de FS die werd gebruikt door de eerste versie van Unix die door Bell Labs werd gemaakt .
Bijna alle afgeleiden van BSD , inclusief FreeBSD , NetBSD , OpenBSD , NEXTSTEP en Solaris , gebruiken een variant van UFS. Op macOS is het beschikbaar als alternatief voor HFS+ . In Linux is er gedeeltelijke ondersteuning voor UFS, terwijl het eerste bestandssysteem dat alleen voor linux wordt gebruikt, ext2 , ook is afgeleid van UFS.
Geschiedenis en evolutie
Vroege versies van het Unix-bestandssysteem werden eenvoudigweg FS genoemd. FS omvatte alleen het opstartblok, superblok, een groep inodes en datablokken. Dit bestandssysteem werkte goed voor de eerste kleine Unix-schijven, maar de vooruitgang van de technologie en de vergroting van de schijven, de hoofdbeweging heen en weer tussen groepen inodes en verwijzingen naar datablokken veroorzaakten thrash (thrashing is een situatie waarbij grote hoeveelheden computerbronnen worden gebruikt om een minimale hoeveelheid werk te doen, terwijl het systeem voortdurend in een staat van gebrek aan bronnen verkeert.). Marshall Kirk McKusick, toen een student van Berkeley, optimaliseerde de FS voor het 4.2BSD-besturingssysteem en noemde het FFS (Fast File System) door cilindergroepen uit te vinden. Dit splitst de schijf in vele kleine stukjes, elk met zijn eigen groep inodes en datablokken.
De bedoeling van BSD FFS is om te proberen de bijbehorende data- en metadatablokken in dezelfde groep cilinders te lokaliseren, en idealiter alle inhoud van een directory (zowel data als metadata voor alle bestanden), in dezelfde of in de nabijheid van een groep cilinders, waardoor fragmentatie wordt verminderd die wordt veroorzaakt door de verspreiding van de inhoud van een map over een hele schijf.
Enkele van de prestatieparameters in het superblok omvatten het aantal sporen en sectoren, schijfrotatiesnelheid, kopsnelheid en de uitlijning van sectoren tussen sporen. In een volledig geoptimaliseerd systeem zou de kop kunnen worden verplaatst naar aangrenzende sporen om afwisselend gedistribueerde sectoren te lezen, gedurende een periode van volledige schijfrotatie.
Naarmate schijven groter en groter werden, werden optimalisaties op sectorniveau overbodig (vooral met schijven die lineaire sectornummering en variabele sectoren per track gebruikten). Met grotere schijven en grotere bestanden is het lezen van fragmenten een probleem geworden. Om dit probleem op te lossen, verhoogde BSD oorspronkelijk de blokgrootte in het bestandssysteem van één sector naar 1k in 4.0BSD; en in SBB verhoogde het de blokgrootte in het bestandssysteem van 1k naar 8k. Dit alles heeft verschillende effecten gehad. De mogelijkheid dat bestandssectoren continu zijn, is groter. De hoeveelheid overhead voor het weergeven van bestandsblokken is afgenomen. Het aantal bytes dat kan worden weergegeven door een bepaald aantal blokken is toegenomen; aangezien het maximale aantal blokken wordt beperkt door een vaste blokbreedte, is dit ook toegestaan voor grote schijven.
Bij grote blokken kunnen schijven met veel kleine bestanden veel ruimte verspillen. Om deze reden heeft BSD fragmentatie op blokniveau toegevoegd (ook wel een suballocatieblok genoemd), waarbij het laatste gedeeltelijke blok met gegevens uit verschillende bestanden kan worden opgeslagen in een enkel blokfragment, in plaats van meerdere, meestal lege blokken (Allen 2005).
Implementatie en structuur
Een UFS-bestandssysteem bestaat uit de volgende componenten:
- de eerste sector van de schijf (512 bytes) bevat de partitietabel.
- een klein aantal blokken aan het begin van de partitie (1e tot 15e sector) zijn bedoeld om op te starten (en afzonderlijk van het bestandssysteem zelf geïnitialiseerd)
- een superblok met een magisch getal dat het bestandssysteem identificeert als UFS en andere vitale parameters die de geometrie van het bestandssysteem beschrijven en enkele statistieken.
- een reeks groepen cilinders. Elke groep bevat:
- een reservekopie van het superblok
- het aantal mappen
- het aantal inodes , die gegevens bevatten over de attributen van de bestanden die ze bevatten
- een header, die enkele statistieken bevat, waaronder de lijst met vrije blokken en inodes , de fragmentatie in groepen cilinders. Het is vergelijkbaar met het superblok, maar toegepast op elke groep cilinders
- het aantal datablokken in de cilindergroep
- de kaart van gratis blokken
- de kaart van de gebruikte inodes
De inodes zijn opeenvolgend genummerd: de eerste twee inodes zijn om historische redenen gereserveerd en worden onmiddellijk gevolgd door de inode van de hoofddirectory , die daarom altijd inode 2 is.
Bestanden die mappen beschrijven, bevatten alleen de namen en inode-aanwijzers van de items die ze bevatten. Alle metadata wordt opgeslagen in de inode zelf.
Heden en toekomst
Velen zijn degenen die UFS hebben aangepast aan hun eigen doeleinden door eigen extensies toe te voegen die niet compatibel zijn met andere versies. Verrassend genoeg zijn sommigen de oorspronkelijke blokgrootte en gegevensvelden blijven gebruiken. Sommige marges van compatibiliteit tussen verschillende versies, althans bij het lezen van het bestandssysteem, zijn gebleven.
FreeBSD 5.0 heeft UFS2 geïntroduceerd , dat ondersteuning biedt voor volumes van meer dan 1 TB .
Linux heeft het EXT2-bestandssysteem, helemaal opnieuw geschreven maar gebaseerd op de principes van UFS, terwijl het door het ontbreken van een uniforme UFS-standaard geen tool heeft om naar dit bestandssysteem te kunnen schrijven.
Sinds 2004 heeft Sun Microsystems "aanmelden" op Solaris 7 geïntroduceerd, waardoor de UFS een journaled File System is (zie journaling ). Solaris heeft ook verschillende extensies voor het manipuleren van grote bestanden en grote volumes.
Externe links
- Het UFS-bestandssysteem van Solaris Internals