Bestandssystemen

Leer hoe een besturingssysteem bestanden opslaat zodat ze stroomuitval en crashes overleven. Gebruik de systeemaanroepen voor bestanden en directory's, van open en read tot fsync, rename, koppelingen en toegangsrechten. Bekijk hoe een eenvoudig bestandssysteem inodes, bitmaps en gegevensblokken indeelt, hoe het Fast File System verwante gegevens dicht bij elkaar houdt en hoe fsck en journaalregistratie de schijf na een crash consistent houden. Sluit af met loggestructureerde bestandssystemen en met hoe NFS en AFS bestanden via een netwerk delen.

GemiddeldLes 8 van 9 in Cursus Besturingssystemen: processen, geheugen, threads en bestandssystemen

Wat je leert

  1. Gebruik de systeemaanroepen waarop een programma vertrouwt om bestanden aan te maken, te lezen, te schrijven, te benoemen, te beschermen en te ordenen, en voorspel wat elke aanroep doet met bestandsposities, namen en gegevens op schijf.
    • Lees en schrijf bestanden via bestandsdescriptoren
      Open bestanden, lees en schrijf ze via bestandsdescriptoren, verplaats de bestandspositie en leg uit hoe processen geopende bestanden delen.
    • Maak schrijfbewerkingen duurzaam en wijzigingen atomair
      Dwing gegevens naar stabiele opslag wanneer ze een crash moeten overleven, en vervang de inhoud van een bestand zo dat lezers óf de oude óf de nieuwe versie zien.
    • Orden namen met directory's en koppelingen
      Maak directory's aan, geef ze weer en verwijder ze, en leg uit hoe harde koppelingen, symbolische koppelingen en het verwijderen van een bestand namen en inodes beïnvloeden.
    • Lees metadata, regel toegang en koppel bestandssystemen aan
      Lees de metadata van een bestand met stat, stel toegangsrechtenbits in en interpreteer ze, en leg uit hoe afzonderlijke bestandssystemen tot één directoryboom worden samengevoegd.
  2. Beschrijf de structuren op schijf van een eenvoudig Unix-achtig bestandssysteem, bereken waar een inode en de blokken van een bestand staan en volg de lees- en schrijfbewerkingen op schijf achter het openen, lezen en schrijven van een bestand.
    • Deel een schijf in met blokken, bitmaps, inodes en directory's
      Deel een schijf in in het superblok, toewijzingsbitmaps, de inodetabel en het gegevensgebied, zoek een inode op nummer en beschrijf hoe directory's en vrije ruimte worden opgeslagen.
    • Vind de gegevens van een bestand met pointers, indirecte blokken en extents
      Leg uit hoe directe pointers, indirecte blokken en extents van een inode bestandsposities aan schijfblokken koppelen en bereken het grootste bestand dat een pointerindeling ondersteunt.
    • Volg de schijf-I/O van bestandsbewerkingen en onderzoek het effect van caching
      Tel de bloklees- en schrijfbewerkingen achter het openen, lezen, aanmaken en schrijven van een bestand en leg uit hoe caching en schrijfbuffering dat verkeer veranderen.
  3. Onderzoek waarom vroege Unix-bestandssystemen traag waren op harde schijven en leg uit hoe de groepen, plaatsingsregels en het beleid voor grote bestanden van het Fast File System verwante gegevens dicht bij elkaar houden.
    • Leg uit waarom vroege Unix-bestandssystemen traag waren en hoe groepen dat verhelpen
      Herken de indelingsproblemen die schijfbandbreedte verspilden in het oorspronkelijke Unix-bestandssysteem en beschrijf hoe cilindergroepen en blokgroepen de schijf indelen.
    • Pas de plaatsingsregels van FFS toe en bepaal de deelgroottes voor grote bestanden
      Gebruik de plaatsingsregels van FFS voor directory's en bestanden, pas de uitzonderingsregel voor grote bestanden toe, bereken hoe groot een deel moet zijn om de positioneringskosten te amortiseren en beschrijf de overige verbeteringen van FFS.
  4. Leg uit waarom een crash midden in een wijziging een bestandssysteem kan beschadigen en vergelijk herstel achteraf met fsck, schade voorkomen met journaalregistratie en andere benaderingen.
    • Leg het probleem van consistentie na een crash uit
      Laat zien waarom één bestandsbewerking meerdere blokschrijfbewerkingen nodig heeft, noem wat een crash daartussen op schijf kan achterlaten en classificeer elke uitkomst.
    • Controleer en herstel een bestandssysteem met fsck
      Beschrijf wat de bestandssysteemcontrole na een crash onderzoekt en herstelt, en leg uit waarom een controle van de hele schijf slecht schaalt en niet elk probleem kan opsporen.
    • Bescherm wijzigingen met gegevensregistratie in een journaal en pas de wijzigingen uit het logboek opnieuw toe
      Schrijf een wijziging naar een journaal voordat je het bestandssysteem op de bestaande plaats wijzigt, leg uit waarom het vastleggingsblok als laatste wordt geschreven en herstel na een crash door vastgelegde transacties opnieuw toe te passen.
    • Verlaag de kosten van journaalregistratie en vergelijk andere benaderingen
      Leg uit hoe metadataregistratie in een journaal voorkomt dat gegevens twee keer worden geschreven, waarom geordende journaalregistratie gegevens vóór het vastleggen schrijft, hoe intrekkingsrecords een fout bij hergebruik van blokken voorkomen en hoe andere ontwerpen bestandssystemen consistent houden.
  5. Leg uit waarom alles sequentieel naar een logboek schrijven schrijfbewerkingen versnelt, hoe de inodevertaaltabel en het checkpointgebied het bestandssysteem gegevens in dat logboek laten vinden en hoe opruimen en herstel na een crash werken.
    • Schrijf sequentieel in segmenten en vind inodes via de inodevertaaltabel
      Leg de aanleiding voor een loggestructureerd bestandssysteem uit, bepaal de segmentgrootte voor een gewenste bandbreedte en volg hoe de inodevertaaltabel en het checkpointgebied een bestand vinden.
    • Maak ruimte vrij met de segmentopruimer en herstel na een crash
      Leg uit hoe LFS nog gebruikte blokken vindt en samenvoegt, kiest welke segmenten worden opgeruimd en herstelt na een crash, en hoe de ideeën voortleven in bestandssystemen met kopiëren bij schrijven en voor flashgeheugen.
  6. Leg uit hoe NFS en AFS veel clientmachines bestanden op servers laten gebruiken, hoe ze crashes afhandelen en hoe hun keuzes voor caching bepalen wanneer een client de wijzigingen van een andere ziet.
    • Leg uit hoe NFS met toestandsloze verzoeken van storingen herstelt
      Beschrijf de client-serverstructuur van NFS, hoe bestandshandles en idempotente verzoeken een client laten herstellen van servercrashes door verzoeken te herhalen en waarom de server schrijfbewerkingen vóór het antwoord moet vastleggen.
    • Vergelijk caching en consistentie bij NFS en AFS
      Leg uit hoe NFS en AFS bestandsgegevens op clients cachen, wanneer elk de wijzigingen van een client zichtbaar maakt voor anderen en welke werklasten gunstig zijn voor elk ontwerp.

Bestandssystemen: uitleg

6 hoofdstukken

1

Gebruik de interface voor bestanden en directory's

Bestandsbewerkingen maken verschillende soorten toestand zichtbaar: bytes, namen, bestandsposities van geopende bestanden en toegangsrechten. Volg een descriptor tijdens leesbewerkingen en bij gedeelde bestandsposities en onderscheid daarna een voltooide aanroep van duurzaam opslaan. Directory's en koppelingen verklaren waarom het verwijderen van een naam het object niet hoeft te verwijderen. Metadata en aankoppeling maken het beeld compleet van hoe een programma via één directoryboom een bestand bereikt en gebruikt.

1.1 Lees en schrijf bestanden via bestandsdescriptoren

Een bestand is een persistente reeks bytes. Het bestandssysteem slaat die bytes op zonder te bepalen of ze tekst, een afbeelding of machinecode voorstellen. Een directory geeft het bestand een leesbare naam; het inodenummer identificeert het binnen het bestandssysteem.

Open een bestand en controleer het resultaat

open(path, flags, mode) geeft een bestandsdescriptor terug, een niet-negatief geheel getal dat in latere aanroepen wordt gebruikt. Bij een fout geeft de aanroep -1 terug en stelt errno in. Kies O_RDONLY, O_WRONLY of O_RDWR voor de toegang. O_CREAT maakt een ontbrekend bestand aan, O_TRUNC maakt een bestaand bestand leeg en O_APPEND plaatst elke schrijfbewerking aan het huidige einde.

Voor een nieuw bestand vraagt mode toegangsrechten aan en verwijdert de umask van het proces bits. Zonder standaardtoegangscontrolelijst (ACL) op de directory is het resultaat mode & ~umask. Als je 0666 aanvraagt met umask 0022, krijg je 0644, oftewel rw-r--r--. Dit argument verandert de toegangsrechten van een al bestaand bestand niet.

Descriptoren horen bij een proces. Normaal zijn 0, 1 en 2 de standaardinvoer, standaarduitvoer en standaardfoutuitvoer. open kiest de laagste ongebruikte descriptor, vaak 3. Op Linux laat strace cat notes.txt de aanroepen zien: de invoer openen, die lezen, naar descriptor 1 schrijven en de invoer sluiten.

Volg de bestandspositie, niet het gevraagde aantal

read(fd, buf, n) geeft het daadwerkelijk gelezen aantal bytes terug, maximaal n. Bij een verzoek om een aantal groter dan nul voor een gewoon bestand betekent nul dat op of voorbij het bestandseinde geen bytes over zijn; -1 betekent een fout. write geeft ook een werkelijk aantal terug, dat lager kan zijn dan gevraagd. Controleer dat aantal voordat je verdergaat in een buffer of besluit dat de bewerking voltooid is.

Stel dat log.txt 300 bytes bevat. Vier verzoeken om 100 bytes geven 100, 100, 100 en 0 terug. De bestandspositie, de positie van de volgende bewerking, wordt 100, 200, 300 en 300. Het bestandseinde is een teruggegeven aantal, geen speciale byte die in het bestand is opgeslagen.

lseek(fd, 200, SEEK_SET) stelt de positie in op 200. Een daaropvolgende leesbewerking van 50 bytes geeft bytes 200–249 terug en laat de positie op 250 staan. SEEK_CUR meet vanaf de huidige positie; SEEK_END meet vanaf het bestandseinde. De positie verplaatsen verandert een getal in het geheugen. Het verplaatst geen schijfkop en leest zelf geen gegevens. pread en pwrite gebruiken een expliciete positie zonder deze bestandspositie te veranderen.

Bepaal welke descriptoren een bestandspositie delen

De descriptortabel van het proces verwijst naar vermeldingen in de tabel met geopende bestanden van de kernel. Elke vermelding bevat de toegangsmodus, bestandspositie, inodeverwijzing en verwijzingsteller.

Hoe descriptoren ontstaanGedrag van de bestandspositie
Twee afzonderlijke open-aanroepenOnafhankelijke posities, ook voor dezelfde inode
dup of dup2Eén gedeelde vermelding en bestandspositie
Descriptoren overgeërfd via forkOuder- en kindproces delen de vermelding en bestandspositie

Als een kindproces een gedeelde descriptor naar byte 10 verplaatst, begint de volgende leesbewerking van het ouderproces via die vermelding ook op 10. De inode identificeert het bestand, maar de vermelding bevat de bestandspositie: twee lezers kunnen een bestand delen zonder hun positie te delen. De shell gebruikt dup2 bij omleiding om de standaarduitvoer naar een andere vermelding te laten verwijzen. close geeft één descriptor vrij; de vermelding verdwijnt nadat de laatste verwijzing is vrijgegeven. Sluiten alleen dwingt gebufferde gegevens niet naar stabiele opslag.

Belangrijkste punten

  • Controleer het teruggegeven aantal bytes van elke read en write.
  • Een bestandspositie hoort bij een vermelding in de tabel met geopende bestanden, niet bij de inode.
  • Afzonderlijk geopende bestanden hebben afzonderlijke posities; gedupliceerde en overgeërfde descriptoren delen er één.
  • lseek verandert de bestandspositie zonder schijf-I/O uit te voeren.
  • close geeft een descriptor vrij; het garandeert geen duurzaamheid.

1.2 Maak schrijfbewerkingen duurzaam en wijzigingen atomair

Een geslaagde schrijfbewerking en een wijziging die een crash overleeft, beantwoorden verschillende vragen. Een schrijfbewerking meldt dat bytes zijn geaccepteerd. Duurzaamheid gaat over de vraag of ze een crash overleven; atomiciteit gaat over de vraag of een wijziging alleen als geheel zichtbaar kan zijn.

Dwing de bytes naar stabiele opslag

Besturingssystemen bufferen schrijfbewerkingen meestal in het geheugen en sturen gewijzigde blokken later naar opslag, vaak binnen ongeveer 5–30 seconden. Dit combineert kleine schrijfbewerkingen en laat het programma snel doorgaan. Een crash kan gegevens wissen die nog in die buffers wachten.

fsync(fd) dwingt de gewijzigde gegevens en metadata van het bestand naar opslag en wacht tot het apparaat voltooiing meldt. Een programma moet het resultaat controleren voordat het meldt dat gegevens duurzaam zijn opgeslagen. close geeft de descriptor vrij en vervangt dit wachten niet.

Een bestand heeft ook een duurzaam opgeslagen naam nodig. De vermelding die de naam aan de inode koppelt, is onderdeel van de gegevens van de directory, niet van het bestand. Als je na het aanmaken van een bestand alleen het bestand synchroniseert, kunnen de bytes duurzaam zijn opgeslagen zonder de garantie dat de nieuwe naam behouden blijft. Open de bovenliggende directory en synchroniseer die wanneer de naam behouden moet blijven.

Vervang een bestand zonder een gedeeltelijke versie te tonen

Een document op de bestaande plaats overschrijven creëert een periode waarin lezers onvolledige inhoud kunnen aantreffen. O_TRUNC stelt de lengte eerst in op nul. Als een crash de latere schrijfbewerkingen onderbreekt, is de oude volledige kopie al verdwenen.

Schrijf de vervanging daarom onder een tijdelijke naam in dezelfde directory. Gebruik daarna rename om het doel te vervangen. Voor een bestaand doel op hetzelfde bestandssysteem maakt POSIX die vervanging atomair: de doelnaam verwijst naar het oude bestand of naar de vervanging, zonder dat de naam tussendoor ontbreekt. Lezers zien via die naam geen mengsel van de inhoud van beide bestanden.

Voor settings.json is de volgorde voor duurzame vervanging:

  1. Schrijf de volledige nieuwe inhoud naar settings.json.tmp en controleer op schrijfbewerkingen met minder geschreven bytes dan aangevraagd en op fouten.
  2. Roep fsync aan op het tijdelijke bestand en controleer of dat lukt.
  3. Roep rename("settings.json.tmp", "settings.json") aan en controleer of dat lukt.
  4. Roep fsync aan op de bovenliggende directory en controleer of dat lukt.

Het tijdelijke bestand is volledig en duurzaam opgeslagen voordat de naam verandert. De laatste synchronisatie van de directory maakt die naamswijziging duurzaam. Een crash tijdens de reeks laat het doel achter met een volledige oude of volledige nieuwe versie; na de laatste geslaagde synchronisatie is de nieuwe versie duurzaam opgeslagen. Alleen atomaire vervanging van de naam garandeert niet dat een niet-gesynchroniseerde hernoeming stroomuitval overleeft.

rename tussen bestandssystemen mislukt met EXDEV. Een commando dat daarop reageert door te kopiëren en te verwijderen, voert meerdere bewerkingen uit, zodat die terugvaloptie geen atomaire vervanging garandeert.

Verander de lengte zonder elke byte te schrijven

truncate(path, length) en ftruncate(fd, length) stellen de lengte van het bestand in. Inkorten verwijdert bytes voorbij het nieuwe einde. Bij verlengen wordt het nieuwe gebied als nullen gelezen. Ook als je de positie voorbij het einde verplaatst en daarna schrijft, ontstaat een tussenruimte die als nullen wordt gelezen.

Een dunbezet bestand kan zo'n tussenruimte voorstellen zonder er gegevensblokken voor toe te wijzen. Als je met een leeg bestand begint en één byte op positie 8192 schrijft, ontstaat een bestand van 8193 bytes; het voorafgaande ongeschreven gebied wordt als nullen gelezen. De logische grootte kan groter zijn dan de fysiek toegewezen ruimte.

Belangrijkste punten

  • fsync maakt bestandsgegevens en metadata duurzaam na geslaagde voltooiing.
  • Synchroniseer de directory om een nieuwe of vervangen naam duurzaam te maken.
  • Schrijf, synchroniseer, hernoem en synchroniseer daarna de directory voor een duurzame vervanging.
  • Een dunbezette tussenruimte wordt als nullen gelezen en hoeft geen gegevensblokken te bezetten.

1.3 Orden namen met directory's en koppelingen

Directory's scheiden de namen die mensen gebruiken van de objecten die het bestandssysteem opslaat. Elke directory heeft een eigen inode en gegevensblokken; de vermeldingen koppelen namen aan inodenummers.

Volg paden door de boom

Een absoluut pad begint bij /. Een relatief pad begint bij de huidige werkdirectory van het proces. De vermelding . duidt de directory zelf aan en .. de bovenliggende directory; de bovenliggende directory van de hoofddirectory is de hoofddirectory zelf. Vanuit /home/lee bereik je met het relatieve pad ../shared de directory /home/shared.

Een extensie zoals .txt maakt deel uit van een naam. Programma's kunnen die gebruiken om te kiezen hoe ze de bytes interpreteren, maar het bestandssysteem vereist niet dat een .txt-bestand tekst bevat.

mkdir maakt een directory aan met . en ... Om vermeldingen weer te geven, gebruikt een programma opendir, roept het readdir aan totdat er geen vermeldingen meer zijn en roept het closedir aan. Een resultaat van readdir bevat een naam en inodenummer. Programma's wijzigen directory-inhoud via aanroepen zoals link, unlink en rename, niet via gewone write-aanroepen. rmdir verwijdert een lege directory.

Geef één bestand twee gelijkwaardige namen

link(old, new) maakt een harde koppeling: een extra directoryvermelding die naar dezelfde inode verwijst. Geen van beide namen heeft een bevoorrechte positie als origineel. Het aantal harde koppelingen van de inode geeft aan hoeveel namen ernaar verwijzen.

Bekijk deze commando's wanneer geen proces het bestand open heeft:

echo hi > a
ln a b
rm a
cat b
rm b

Door b aan te maken stijgt het aantal harde koppelingen van 1 naar 2. Door a te verwijderen daalt het tot 1; via b zijn dezelfde bytes nog bereikbaar, dus drukt cat b “hi” af. Door b te verwijderen daalt het aantal tot 0, zodat de inode en de blokken ervan kunnen worden vrijgemaakt.

Een open descriptor voegt een tweede regel voor de levensduur toe. Als de laatste naam wordt verwijderd terwijl een proces het bestand nog open heeft, kan dat proces het blijven gebruiken. Vrijmaken wacht totdat zowel het aantal koppelingen nul is als er geen open verwijzingen meer zijn. Dit verklaart waarom het verwijderen van een groot geopend logboek de ruimte mogelijk niet onmiddellijk vrijgeeft.

Een harde koppeling kan niet over bestandssystemen heen verwijzen: het inodenummer van het doel zou geen betekenis hebben in de andere inodetabel. De meeste Unix-systemen verbieden ook harde koppelingen naar directory's om een boom zonder cycli te behouden. Bij de klassieke Unix-telling van directorykoppelingen heeft een lege directory twee koppelingen, vanuit de vermelding in de bovenliggende directory en vanuit de eigen .. Elke subdirectory voegt er via .. één toe; drie subdirectory's geven een aantal van 5.

Sla een pad op in een symbolische koppeling

Een symbolische koppeling is een afzonderlijk bestand waarvan de inhoud een doelpad is. ln -s /home/ana/report.txt r maakt r aan met het doelpad van 20 bytes als inhoud. Als je de koppeling volgt, wordt dat pad gevolgd. Symbolische koppelingen kunnen over bestandssystemen heen verwijzen en naar directory's wijzen.

Soort koppelingWat de directoryvermelding bereiktEffect van het verwijderen van de doelnaam
Harde koppelingDe gedeelde inodeEen andere harde koppeling bereikt het bestand nog steeds
Symbolische koppelingEen afzonderlijk koppelingsobject met een padDe koppeling is verbroken als het opgeslagen pad niet meer naar een doel leidt

Een symbolische koppeling verhoogt het aantal harde koppelingen van het doel niet. Het koppelingsobject bewaren houdt het doel dus niet in stand.

Belangrijkste punten

  • Directory's koppelen namen aan inodenummers; paden kiezen een reeks van die namen.
  • Harde koppelingen zijn gelijkwaardige namen voor één inode.
  • Een koppeling verwijderen verwijdert een naam; vrijmaken wacht ook tot open verwijzingen zijn beëindigd.
  • Symbolische koppelingen slaan paden op en kunnen verbroken raken.
  • Harde koppelingen blijven binnen één bestandssysteem.

1.4 Lees metadata, regel toegang en koppel bestandssystemen aan

De inhoud van een bestand is slechts een deel van de toestand ervan. Metadata legt vast wie het bestand mag gebruiken, wat de grootte en het type zijn en wanneer het is gewijzigd. Door aankoppeling worden objecten uit meerdere bestandssystemen bereikbaar via één namenboom.

Lees de metadata correct

stat(path, &buf) leest metadata via een pad; fstat(fd, &buf) leest die via een open descriptor. De resultaten omvatten het inodenummer, type, de toegangsrechten, ID's van eigenaar en groep, grootte, toegewezen blokken en het aantal harde koppelingen. De bestandsgrootte telt logische bytes; toegewezen blokken meten de werkelijk gebruikte opslagruimte, die bij een dunbezet bestand kleiner kan zijn dan de logische grootte.

Drie tijdstempels beschrijven verschillende gebeurtenissen:

VeldBetekenisVoorbeeld van een gebeurtenis
atimeLaatste toegangInhoud lezen
mtimeLaatste wijziging van de inhoudBytes schrijven
ctimeLaatste statuswijziging van de inodeSchrijven, toegangsrechten wijzigen of een harde koppeling toevoegen

ctime is niet de aanmaaktijd. Alleen atime bijwerken verandert ctime niet. De klassieke Unix-aanroep stat heeft geen veld voor de aanmaaktijd; Linux statx kan een geregistreerde geboortetijd tonen wanneer het bestandssysteem die ondersteunt.

Ontcijfer toegangsrechtenbits

Lees-, schrijf- en uitvoerrechten worden afzonderlijk vastgelegd voor eigenaar, groep en anderen. Elke klasse vormt één octaal cijfer: lezen is 4, schrijven 2 en uitvoeren 1. Bij rw-r----- krijgt de eigenaar 4 + 2 = 6, de groep 4 en de anderen 0. chmod 640 report.txt stelt die bits in.

Toegangsrechten voor een directory gelden voor namen en het doorlopen van paden. Leesrecht staat toe namen weer te geven. Uitvoerrecht staat doorzoeken toe, wat betekent dat je de directory in een pad mag gebruiken. Schrijfrecht samen met uitvoerrecht staat toe vermeldingen aan te maken, te verwijderen en te hernoemen. De naam kennen kan voldoende zijn om een bestand te openen in een directory met uitvoerrecht maar zonder leesrecht, mits de eigen toegangsrechten van het bestand toegang toestaan. De inhoud van die directory weergeven mislukt nog steeds.

Dit verschil is van belang bij verwijderen: een vermelding verwijderen wijzigt de bovenliggende directory. Het schrijfbit van een bestand bepaalt of je de bytes ervan mag wijzigen; het geeft niet het recht om de naam uit de directory te verwijderen. Root omzeilt de meeste gewone toegangscontroles. Toegangscontrolelijsten (ACL's) kunnen rechten geven aan bij naam genoemde gebruikers en groepen buiten de drie basisklassen.

Koppel een ander bestandssysteem aan

mkfs initialiseert een bestandssysteem op een partitie of ander apparaat, inclusief een eigen hoofddirectory en metadata. Het vernietigt de eerdere bestandssysteeminhoud van het apparaat, dus voer het alleen uit op een apparaat dat voor initialisatie is bedoeld.

mount koppelt die hoofddirectory aan een bestaande directory die het koppelpunt heet. Een schijf die op /media/usb is aangekoppeld, maakt de inhoud van de hoofddirectory daar bereikbaar. De eerdere inhoud van /media/usb is verborgen zolang de koppeling actief is; aankoppelen voegt die inhoud niet samen met de aangekoppelde boom. Als je mount zonder argumenten uitvoert, zie je de huidige koppelingen.

De laag van het virtuele bestandssysteem (VFS) in de kernel geeft ext4, XFS, FAT, geheugenbestandssystemen en netwerkbestandssystemen een gemeenschappelijke interface. Programma's kunnen via elk daarvan open en read aanroepen. De samengevoegde naamruimte voegt de inodetabellen niet samen: gelijke inodenummers op verschillende bestandssystemen kunnen niet-gerelateerde bestanden identificeren. Harde koppelingen en atomaire hernoemingen blijven daarom binnen hun eigen bestandssysteem.

Belangrijkste punten

  • stat en fstat beschrijven metadata; ctime registreert statuswijzigingen.
  • Rechtencijfers tellen lezen = 4, schrijven = 2 en uitvoeren = 1 per gebruikersklasse op.
  • Uitvoerrecht op een directory staat het doorlopen van een pad toe; leesrecht staat toe de inhoud weer te geven.
  • Aankoppelen verbindt de hoofddirectory van een bestandssysteem en verbergt de eerdere inhoud van het koppelpunt.
  • Het VFS biedt bestandssysteemtypen een gemeenschappelijke interface, geen globale inodetabel.
  • De logische bestandsgrootte en de toegewezen ruimte kunnen verschillen.
2

Leg uit hoe een eenvoudig bestandssysteem gegevens opslaat en terugvindt

Achter een leesbaar pad gaat een reeks opzoekacties, toewijzingen en bloktoegangen schuil. Bouw een kleine schijfindeling, bereken een inodeadres en koppel byteposities via directe pointers, indirecte blokken of extents aan locaties. Volg daarna de I/O achter veelvoorkomende aanroepen. Door expliciet te maken wat in de cache staat, kun je uitleggen waarom hetzelfde programma de ene keer veel apparaatbewerkingen veroorzaakt en de volgende keer heel weinig.

2.1 Deel een schijf in met blokken, bitmaps, inodes en directory's

Een bestandssysteem moet zowel onthouden waar bytes staan als welke ruimte beschikbaar is. Een eenvoudige Unix-achtige indeling maakt deze taken zichtbaar door toewijzingsgegevens, inodes en inhoud te scheiden.

Verdeel de partitie in gebieden

Een blok is de basiseenheid voor toewijzing van het bestandssysteem. Een blok van 4 KiB bevat 4.096 bytes, oftewel acht traditionele sectoren van 512 bytes. Binaire groottes gebruiken KiB, MiB en GiB; overdrachtssnelheden zoals MB/s gebruiken decimale miljoenen bytes per seconde.

Het onderwijsontwerp vsfs, het zeer eenvoudige bestandssysteem, bevat deze structuren:

StructuurOpgeslagen informatie
SuperblokBestandssysteemgrootte, locaties van gebieden, aantal inodes en identificerend speciaal getal
InodebitmapEén toewijzingsbit per inode
GegevensbitmapEén toewijzingsbit per gegevensblok
InodetabelMetadata en gegevenspointers voor elke inodeplaats
GegevensgebiedInhoud van gewone bestanden en directory's

Een bitmapbit van 1 betekent toegewezen; 0 betekent vrij. Het superblok vertelt het besturingssysteem bij het aankoppelen hoe het de rest van de partitie moet interpreteren. De twee bitmaps beschrijven verschillende bronnen: een bestand kan een toegewezen inode hebben voordat het gegevensblokken heeft.

Zoek een inode op nummer

Neem een partitie van 64 blokken met blokken van 4 KiB. Plaats het superblok op blok 0, de inodebitmap op 1, de gegevensbitmap op 2 en de inodetabel in blokken 3–7. Gegevens bezetten blokken 8–63. Vijf inodetabelblokken met inodes van 256 bytes bevatten 80 inodes, omdat elk blok er 16 bevat. Er zijn 56 gegevensblokken. Eén bitmap van 4 KiB kan 32.768 objecten beschrijven, dus blijft in deze zeer kleine indeling een groot deel van elke bitmap ongebruikt.

Als je inodeplaatsen vanaf nul nummert, begint inode 37 op 37 × 256 = 9.472 bytes na het begin van de tabel. De tabel begint op byte 12.288, wat een absoluut byteadres van 21.760 geeft. Deling door 4.096 geeft schijfblok 5 met rest 1.280. Deling door 512 geeft sector 42 met rest 256. Lees het blok of de sector waarin de inode staat en selecteer daarbinnen de bytes van de inode.

De algemene methode is: het begin van de tabel in bytes plus het inodenummer maal de inodegrootte. Houd het beginadres van de tabel apart van de positie van de inode binnen de tabel. Als je dat basisadres weglaat, vind je het verkeerde schijfblok.

Scheid namen, metadata en inhoud

Een inode, of indexknoop, registreert type, toegangsrechten, eigenaar, grootte, tijdstempels, het aantal harde koppelingen, toegewezen blokken en gegevenslocaties. De inode bevat niet de bestandsnaam. De naam hoort in een directoryvermelding, waardoor meerdere namen één inode kunnen delen.

Een directory heeft een inode van het type directory en gegevensblokken met vermeldingen. Een eenvoudige vermelding bevat een inodenummer, recordlengte, naamlengte en naam. Dankzij de recordlengte kan het systeem bij het doorlopen de hele vermelding overslaan, inclusief herbruikbare ruimte die na verwijderen is achtergelaten. Grote directory's hebben baat bij indexen: XFS gebruikt B-bomen en ext4 gebruikt gehashte boomindexen.

Bij het aanmaken van een bestand zoekt het systeem een vrij bit in de inodebitmap en zet het dat bit. Bij het toewijzen van gegevens verandert op dezelfde manier de gegevensbitmap. Een allocator kan een reeks blokken reserveren zodat het bestand aaneengesloten kan groeien. De bitmap geeft aan of een blok vrij is; de inode geeft aan bij welk bestand het hoort. Deze structuren moeten overeenkomen.

Belangrijkste punten

  • Het superblok beschrijft de indeling; bitmaps houden toewijzingen bij.
  • Een inode bevat metadata en gegevenslocaties, terwijl directory's namen bevatten.
  • Bereken een inodeadres uit de tabelbasis, het inodenummer en de inodegrootte.
  • Inodetoewijzing en gegevenstoewijzing gebruiken afzonderlijke bitmaps.

2.2 Vind de gegevens van een bestand met pointers, indirecte blokken en extents

Een programma ziet opeenvolgende byteposities, maar de bijbehorende gegevensblokken kunnen over de schijf verspreid liggen. Het bestandssysteem heeft voor elk logisch bestandsblok een koppeling naar de fysieke locatie nodig.

Volg directe en indirecte pointers

Een directe pointer in een inode duidt één gegevensblok aan. Bij blokken van 4 KiB ligt bytepositie 10.000 in logisch blok 2, omdat twee volledige blokken 8.192 bytes gebruiken. De positie binnen dat blok is 1.808. Logische blokken beginnen bij 0, dus gebruikt blok 2 de derde directe pointer.

Een indirecte pointer duidt een blok aan dat gegevensblokadressen bevat. Een blok van 4.096 bytes met adressen van 4 bytes bevat 1.024 pointers. Een dubbelindirecte pointer duidt een blok aan waarvan de pointers naar 1.024 indirecte blokken leiden. Driedubbele indirectie voegt nog een niveau toe. Deze index met meerdere niveaus is bewust onevenwichtig: kleine bestanden gebruiken directe pointers zonder extra pointerblokken te lezen, terwijl grote bestanden de kosten van extra niveaus dragen.

Voor een inode met 12 directe pointers en één pointer voor elk indirect niveau:

Hoogste gebruikte niveauGegevenscapaciteit met blokken van 4 KiB
Alleen direct12 blokken = 48 KiB
Enkelvoudig indirect12 + 1.024 blokken = 4.144 KiB
Dubbelindirect12 + 1.024 + 1.024² blokken = 4.299.210.752 bytes
DriedubbelindirectVoegt 1.024³ blokken toe = nog eens 4 TiB

Dit zijn capaciteiten van deze pointerindeling. Pointerblokken nemen ook opslagruimte in, maar hun bytes zijn geen bestandsinhoud.

Tel pointerblokken voor een bestand

Een bestand van 5 MiB bezet 1.280 gegevensblokken van elk 4 KiB. Wijs de eerste 12 toe aan directe pointers. Wijs de volgende 1.024 toe aan het enkelvoudig indirecte blok. Dan blijven 244 gegevensblokken over.

Die 244 hebben een dubbelindirect wortelblok en één indirect blok daaronder nodig. In totaal heeft het bestand drie pointerblokken nodig: het enkelvoudig indirecte blok, het dubbelindirecte wortelblok en het ene kindblok daarvan. Als je alleen het dubbelindirecte wortelblok telt, mis je het kindblok dat de gegevensadressen daadwerkelijk bevat. Alle 1.024 mogelijke kindblokken tellen verspilt ruimte: alleen het benodigde kindblok wordt toegewezen.

Vergelijk extents en ketens

Een extent legt een eerste schijfblok en een reekslengte vast. Een aaneengesloten reeks van 1.000 blokken kan één extent gebruiken in plaats van 1.000 afzonderlijke pointers. Ext4, XFS en NTFS gebruiken extents. Ext4 kan maximaal vier extents in de inode bevatten en gebruikt voor meer een boom. Fragmentatie splitst reeksen en vergroot het aantal benodigde extentrecords.

Gekoppelde toewijzing volgt een keten van blokken. De bestandstoewijzingstabel (FAT) bewaart de koppelingen naar volgende blokken in een afzonderlijke tabel, die meestal in het geheugen wordt gecachet. Een directoryvermelding identificeert het eerste blok en om een later blok te bereiken moet je de eerdere koppelingen volgen. FAT gebruikt geen Unix-inodes en ondersteunt geen twee harde koppelingen naar één bestand.

KoppelingBelangrijkste voordeelBelangrijkste kosten
Directe en indirecte pointersDirecte toegang tot kleine bestanden; schaalbare indexeringExtra pointerblokken voor grote bestanden
ExtentsCompacte beschrijvingen van aaneengesloten reeksenVeel records bij fragmentatie
FAT-ketensEenvoudige gekoppelde toewijzing met gecachete koppelingenKetendoorlopen voor toegang dicht bij het einde

Opeenvolgende posities bewijzen nooit dat blokken fysiek aaneengesloten zijn. De allocator kiest locaties en de koppeling legt die keuzes vast.

Belangrijkste punten

  • Deel een bytepositie door de blokgrootte om het logische blok te vinden, geteld vanaf nul.
  • Een indirect blok bevat blokadressen; elk extra niveau vergroot het bereik met een factor.
  • Tel toegewezen pointerblokken afzonderlijk van gegevensblokken.
  • Extents beschrijven aaneengesloten reeksen compact.
  • FAT volgt koppelingen naar volgende blokken in plaats van een Unix-inode-index.
  • Logische nabijheid garandeert geen fysieke nabijheid.

2.3 Volg de schijf-I/O van bestandsbewerkingen en onderzoek het effect van caching

Eén systeemaanroep kan meerdere schijfbewerkingen vereisen, of geen enkele. Om het werk te volgen, ga je na welke structuren het bestandssysteem moet raadplegen en geef je aan welke daarvan al in de cache staan.

Doorloop een pad voordat je de inhoud leest

In het eenvoudige model zonder cache leest het openen van /docs/plan.txt vijf blokken:

  1. De inode van de hoofddirectory, waarvan het nummer bekend is.
  2. De gegevens van de hoofddirectory, om docs te vinden.
  3. De inode van docs.
  4. De directorygegevens van docs, om plan.txt te vinden.
  5. De inode van het bestand.

Elke directory past in één blok en geen benodigd blok staat vooraf in het geheugen. Het bestandssysteem controleert de toegangsrechten en maakt een vermelding voor het geopende bestand aan. Door het openen zijn de metadata van het bestand gevonden; de inhoud is nog niet gelezen. In ext2 en ext4 wordt inodenummer 2 voor de hoofddirectory gebruikt.

In een bewust cacheloos leesmodel leest elke blokleesbewerking daarna de inode van het bestand, leest de gegevens en schrijft de toegangstijd van de inode. Twee blokken voegen zes I/O-bewerkingen toe, dus elf inclusief het openen. Sluiten vereist in dit model geen schijf-I/O. Deze aantallen beschrijven de expliciete regels van het model voor opnieuw lezen en tijdstempels; een echte cache verandert ze.

Houd bij het aanmaken rekening met toewijzing

Het aanmaken van /docs/log.txt vereist meer dan een bestaande inode vinden. In hetzelfde eenvoudige model voert het systeem vier leesbewerkingen uit voor de inodes en directorygegevens van de hoofddirectory en docs. Het lezen en schrijven van de inodebitmap voegt twee I/O-bewerkingen toe. Het bijwerken van de gegevens van docs voegt één schrijfbewerking toe. Het lezen en schrijven van de nieuwe inode voegt er twee toe en het bijwerken van de inode van docs één. Totaal: tien.

Elk nieuw toegewezen gegevensblok voegt vijf I/O-bewerkingen toe: lees en schrijf de gegevensbitmap, lees en schrijf de inode van het bestand en schrijf het gegevensblok. Twee blokken geven dus twintig I/O-bewerkingen inclusief het aanmaken. Deze telling gebruikt de eenvoudige gegevensstructuren voordat journaalverkeer of echt cachegedrag wordt meegenomen.

Een overzicht bijhouden helpt: noteer de structuur, of die wordt gelezen of geschreven en waarom. Een gegevensschrijfbewerking heeft ook een toewijzingsregistratie en een pointerwijziging nodig. Een directorywijziging verandert ook de metadata van die directory.

Laat de cache het verloop veranderen

Een cachetreffer gebruikt een blok dat al in het geheugen staat. Linux gebruikt een gezamenlijke paginacache die met virtueel geheugen wordt gedeeld, geen blijvend afzonderlijke bestandscache met een vaste grootte. Bij opnieuw openen kunnen de directory- en inodeblokken van het eerdere doorlopen opnieuw worden gebruikt. Voor het lezen van gecachete inhoud is geen leesbewerking op het apparaat nodig. Het gebruikelijke relatime-beleid van Linux voorkomt ook dat atime bij elke leesbewerking wordt geschreven.

Schrijfbuffering stelt het versturen van gewijzigde blokken naar schijf uit. Twee kort na elkaar aangemaakte bestanden kunnen dezelfde inodebitmap in het geheugen bijwerken, waarna die later één keer wordt geschreven. Het bestandssysteem kan het werk anders ordenen voor een betere doorvoer. Een kort bestaand tijdelijk bestand kan worden aangemaakt en verwijderd voordat de inhoud ooit de opslag bereikt.

Buffering verbetert de prestaties, maar laat een periode waarin gegevens nog niet duurzaam zijn opgeslagen. fsync sluit die periode voor een bestand af door op de benodigde schrijfbewerkingen te wachten. Linux O_DIRECT laat geschikte programma's de paginacache omzeilen wanneer ze hun eigen buffers beheren; een cache omzeilen is op zichzelf niet dezelfde bewerking als synchroniseren naar duurzame opslag.

Belangrijkste punten

  • Volg het doorlopen van een pad afzonderlijk van het lezen van bestandsgegevens.
  • I/O-aantallen hangen af van de cache-inhoud en het beleid voor tijdstempels.
  • Een bestand aanmaken werkt toewijzingsgegevens, directoryvermeldingen en inodes bij.
  • Schrijfbuffering combineert wijzigingen en verbetert de planning, maar stelt duurzame opslag uit.
  • Een systeemaanroep komt niet overeen met een vast aantal apparaatbewerkingen.
3

Leg uit hoe het Fast File System lokaliteit benut voor hogere snelheid

Een snelle interface heeft een indeling nodig die bij het opslagapparaat past. Vroege Unix-bestandssystemen verspilden bandbreedte van harde schijven aan kleine overdrachten en ver verwijderde metadata. FFS groepeert verwante objecten en weegt die lokaliteit af tegen de behoeften van grote bestanden. De plaatsingsregels en berekening van de deelgrootte laten zien hoe een ontwerp prestaties kan verbeteren terwijl programma's vertrouwde bewerkingen blijven gebruiken.

3.1 Leg uit waarom vroege Unix-bestandssystemen traag waren en hoe groepen dat verhelpen

Een harde schijf kan een lange reeks bytes snel overdragen zodra de kop die heeft bereikt. Kleine verspreide verzoeken verspillen tijd aan zoeken en wachten op rotatie. Het Fast File System verandert de plaatsing zodat gewone bestandsbewerkingen meer van de overdrachtsbandbreedte van de schijf benutten.

Onderzoek de oude Unix-indeling

De vroege Unix-indeling plaatste alle inodes dicht bij het begin en alle bestandsgegevens erna. Het lezen van een bestand kon daardoor een lange zoekbeweging van metadata naar inhoud vereisen. Een vrijelijst verspreidde toewijzingen geleidelijk naarmate bestanden werden aangemaakt en verwijderd. Zelfs een sequentieel bestand kon veel niet-aangrenzende schijftoegangen opleveren.

Kleine blokken van 512 bytes maakten dit erger. Elke positioneringsvertraging leverde slechts een korte overdracht op voordat het volgende verzoek weer een zoekbeweging of rotatie nodig had. Historische metingen wezen uit dat het oude ontwerp soms maar 2% van de schijfbandbreedte haalde. Dat cijfer beschrijft het gemeten vroege ontwerp, geen vaste grens van Unix-interfaces.

Het Fast File System (FFS), begin jaren 1980 ontwikkeld in Berkeley, behield vertrouwde aanroepen zoals open, read en write, terwijl het de indeling en het toewijzingsbeleid veranderde. Grotere blokken, meestal 4 KiB, verhoogden het aantal overgedragen bytes per verzoek. Door metadata en inhoud dicht bij elkaar te houden, werd de afstand tussen verwante verzoeken kleiner.

Bouw groepen met eigen bronnen

Een cilinder is de verzameling sporen op dezelfde straal over de schijfoppervlakken. FFS vormt cilindergroepen uit naast elkaar gelegen cilinders. De inode en gegevens van een bestand kunnen in dezelfde groep staan, waardoor een zoekbeweging van metadata naar gegevens kort blijft.

Elke groep bevat een kopie van het superblok, eigen bitmaps voor inode- en gegevenstoewijzing, een deel van de inodetabel en gegevensblokken. De groep lijkt op een klein bestandssysteem, maar alle groepen horen bij één bestandssysteem. Een kopie van het superblok helpt ook bij herstel als één kopie beschadigd is. Ext4 bewaart kopieën in geselecteerde groepen in plaats van in elke groep.

Moderne schijven verbergen hun fysieke geometrie. Ext2, ext3 en ext4 gebruiken daarom blokgroepen, reeksen opeenvolgende logische blokadressen, om hetzelfde lokaliteitsdoel na te streven zonder van exacte cilinders afhankelijk te zijn.

Volg het aanmaken van een klein bestand

Het aanmaken van /docs/a.txt vereist een vrije inode, een gegevensblok, wijzigingen in toewijzingsbitmaps en een nieuwe directoryvermelding. FFS probeert het bestand in de groep van de bovenliggende directory te plaatsen. De nieuwe inode, bestandsgegevens, bitmaps en directorywijzigingen kunnen dan dicht bij elkaar liggen.

De bewerking vereist nog steeds meerdere afzonderlijke wijzigingen. Groeperen bespaart positioneringstijd; het brengt niet alle metadata en gegevens samen in één blok. Een indeling die rekening houdt met de schijf verlaagt de kosten om die structuren te bereiken zonder de bestandsbewerkingen van het programma te veranderen.

OpslageigenschapGevolg voor plaatsing
Zoekbeweging en rotatie van een harde schijfNabije blokken voorkomen herhaalde lange positioneringsvertragingen
Hoge sequentiële overdrachtssnelheidGrotere verzoeken verplaatsen meer bytes per vertraging
SSD zonder zoekbeweging of rotatieAfstand is veel minder belangrijk, maar verzoekgrootte en schrijfgedrag blijven belangrijk

Belangrijkste punten

  • Lange zoekbewegingen, fragmentatie en kleine blokken beperkten de schijfdoorvoer van vroege Unix-systemen.
  • FFS-groepen plaatsen inodes, toewijzingsbitmaps en gegevens dicht bij elkaar.
  • Moderne blokgroepen behouden lokaliteit zonder de fysieke schijfgeometrie nodig te hebben.
  • FFS verbetert de plaatsing met behoud van de bestaande bestandsinterface.

3.2 Pas de plaatsingsregels van FFS toe en bepaal de deelgroottes voor grote bestanden

FFS gebruikt namen als aanwijzing voor welke bestanden een programma samen zal gebruiken. Het begrenst ook hoeveel ruimte één groot bestand in een groep kan innemen en weegt zo lokaliteit af tegen ruimte voor toekomstige toewijzingen.

Plaats directory's en bestanden

Een nieuwe directory komt in een groep met relatief weinig directory's en veel vrije inodes. Dit spreidt verschillende directory's en laat tegelijk ruimte voor hun toekomstige bestanden. De inode van een gewoon bestand komt in de groep van de bovenliggende directory en de gegevens komen dicht bij de inode.

Voor /a/b, /a/c en /a/d worden de drie bestanden dicht bij directory /a geplaatst. Een bestand /b/f volgt de eigen bovenliggende directory /b, meestal naar een andere groep. Dit benut lokaliteit in de naamruimte: een compiler die aan één project werkt, opent vaak meerdere bestanden in dezelfde directory. De directoryrelatie voorspelt toegangspatronen; ze garandeert niets voor elk afzonderlijk programma.

Maak een uitzondering voor een groot bestand

Eén groot bestand zou de vrije blokken van de groep kunnen opgebruiken en alle latere naburige bestanden naar elders verdringen. FFS houdt het eerste deel, bereikbaar via 12 directe pointers, in de groep van de inode. Bij blokken van 4 KiB is dat 48 KiB. Latere delen, elk bereikbaar via een indirect blok met 1.024 pointers, beslaan 4 MiB aan gegevens en gaan naar andere weinig gebruikte groepen.

Dit offert enige lokaliteit binnen het grote bestand op om lokaliteit voor de andere bestanden van de directory te behouden. Het grote bestand krijgt tussen delen een positioneringsvertraging, dus moet elk deel groot genoeg zijn om die kosten de moeite waard te maken.

Leid de deelgrootte af

Stel dat positionering T seconden duurt en de overdrachtssnelheid R bytes per seconde is. De overdracht van een deel C duurt C/R seconden. De fractie van de totale tijd die aan overdracht wordt besteed, is:

F=C/RT+C/R.

Oplossen geeft:

C=F1−FRT.

Bij 100 MB/s met 10 ms positionering is R maal T gelijk aan 1 MB. Een deel van 1 MB vereist 10 ms overdracht plus 10 ms positionering, wat 50% van de maximale bandbreedte geeft. Voor 90% vermenigvuldig je 1 MB met 0,9/0,1 om 9 MB te krijgen. Voor 99% is de vermenigvuldigingsfactor 99, wat 99 MB geeft. Zet milliseconden om naar seconden voordat je met MB/s vermenigvuldigt. De noemer bevat zowel overdrachts- als positioneringstijd; alleen door de overdrachtstijd delen zou de overhead verbergen.

Overdrachtssnelheden zijn sneller verbeterd dan positioneringsvertragingen, dus zijn grotere delen nodig om dezelfde fractie van het maximum te bereiken naarmate het verschil groter wordt.

Laat kleine bestanden passen en behoud compatibiliteit

FFS gebruikte ook deelblokken van 512 bytes zodat kleine bestanden geen heel blok van 4 KiB verspilden. Groeiende bestanden werden naar volledige blokken gekopieerd; de C-bibliotheek bufferde schrijfbewerkingen in stukken van 4 KiB om herhaald verplaatsen te verminderen. Historische parameterisatie liet rotatietussenruimten tussen opeenvolgende blokken, zodat een opgevraagd volgend blok de kop nog niet was gepasseerd. Moderne spoorbuffers maken die techniek overbodig door intern een spoor op te halen.

Lange namen, symbolische koppelingen en atomaire rename waren extra mogelijkheden van FFS. Voor de snelheidswinst door de indeling zelf hoefden bestaande programma's niet te worden gewijzigd.

Belangrijkste punten

  • FFS gebruikt een directory als aanwijzing dat de bestanden erin samen worden gebruikt.
  • Directory's worden over groepen verspreid; hun gewone bestanden blijven in de buurt.
  • Delen van grote bestanden worden verspreid om ruimte te laten voor naburige bestanden.
  • Neem positionerings- en overdrachtstijd mee bij het berekenen van de effectieve bandbreedte.
  • Deelblokken verminderen ruimteverspilling bij kleine bestanden; spoorbuffering vervangt het afstemmen van rotatietussenruimten.
  • FFS voegde mogelijkheden toe en versnelde bestaande aanroepen.
4

Zorg dat een bestandssysteem na crashes consistent kan worden hersteld

Een crash kan één logische bestandsbewerking tussen meerdere fysieke schrijfbewerkingen onderbreken. Vergelijk de toestanden die een onvoltooide toevoeging achterlaat en onderzoek daarna hoe een controleprogramma metadata herstelt en hoe een journaal herstel laat afhangen van geregistreerde transacties. De volgorde van gegevens en hergebruik van blokken laten zien waarom een geldige vastlegging meer nodig heeft dan een markering. Andere ontwerpen voor consistentie lossen hetzelfde probleem op met andere kosten.

4.1 Leg het probleem van consistentie na een crash uit

Voor een programma lijkt één toevoeging één handeling. Op schijf verandert die meerdere structuren en een crash kan ertoe leiden dat slechts enkele daarvan zijn bijgewerkt. Consistentie na een crash gaat over de vraag hoe die gedeeltelijke resultaten kunnen worden voorkomen of hersteld.

Volg drie onafhankelijke schrijfbewerkingen

Eén blok van 4 KiB aan een bestaand bestand toevoegen verandert:

  • Db, het nieuwe gegevensblok met de toegevoegde bytes.
  • I, de inode met een grotere grootte en een pointer naar dat blok.
  • B, de gegevensbitmap die het blok als toegewezen markeert.

Als alle drie de opslag bereiken, ontstaat de bedoelde consistente wijziging. Als geen ervan de opslag bereikt, blijft de oude consistente toestand bestaan. Het gevaar zit in de zes gedeeltelijke combinaties. Het apparaat kan verzoeken anders ordenen, dus als je ze in een bepaalde volgorde uitgeeft zonder te wachten, bepaalt dat niet de volgorde waarin ze worden voltooid.

Classificeer elke gedeeltelijke uitkomst
Schrijfbewerkingen die behouden blijvenResultaat
Alleen DbNieuwe bytes bestaan, maar geen pointer bereikt ze; de oude bestandssysteemtoestand blijft consistent
Alleen IDe inode verwijst naar oude inhoud en de bitmap noemt het blok nog vrij
Alleen BEen toegewezen blok heeft geen eigenaar: een lek in de opslagruimte
I en BMetadata komen overeen, maar het nieuwe bestandsgebied bevat oude inhoud
I en DbHet bestand verwijst naar geldige nieuwe gegevens die de bitmap nog vrij noemt
B en DbNieuwe bytes zijn toegewezen maar onbereikbaar: verloren gegevens en gelekte ruimte

Een inconsistentie ontstaat wanneer metadata niet overeenkomen, bijvoorbeeld als een inode een blok claimt waarvan het toewijzingsbit vrij aangeeft. De allocator kan datzelfde blok dan aan een ander bestand geven. Een lek in de opslagruimte reserveert opslag die geen bestand kan bereiken. Ongeldige bestandsinhoud kan moeilijker te detecteren zijn: I en B komen volledig overeen, hoewel Db nooit is aangekomen.

Alleen Db laat geen toegewezen ruimte lekken, omdat de bitmap nog toestaat dat het blok opnieuw wordt gebruikt. Bytes naar een vrije locatie schrijven is niet hetzelfde als die toewijzen. Alleen B laat wel ruimte lekken, omdat de toewijzing behouden is gebleven zonder pointer van een eigenaar.

Scheid structuur van betekenis

Een controleprogramma kan pointers met bitmaps vergelijken. Het kan doorgaans niet vaststellen of aannemelijke bytes de bytes zijn die een programma wilde opslaan. De uitkomst met I en B laat deze grens zien: een structureel geldig bestand kan onjuiste inhoud hebben.

De gewenste overgang is atomair voor de hele wijziging: herstel naar de volledige oude toestand of de volledige nieuwe toestand. Een eenvoudig opslagmodel biedt alleen atomaire schrijfbewerkingen voor één sector, traditioneel 512 bytes. Meerdere bestandssysteemblokken overschrijden die eenheid, dus moet het bestandssysteem een sterker protocol opbouwen. De garanties voor atomaire schrijfbewerkingen van echte apparaten hangen af van het apparaat en de interface; het journaalprotocol moet zijn vastleggingsrecord binnen de ondersteunde atomaire eenheid laten passen.

Buffering vergroot het aantal wijzigingen dat verloren kan gaan, maar is niet de hoofdoorzaak. Zelfs als je elke schrijfbewerking onmiddellijk uitgeeft, kan een crash tussen afzonderlijke voltooiingen optreden. Een bestand aanmaken, hernoemen en verwijderen verandert ook meerdere structuren. Om de mogelijke fouttoestanden te begrijpen, begin je met dezelfde oefening: bepaal elk gewijzigd blok en vraag wat er gebeurt als slechts een deel behouden blijft.

Belangrijkste punten

  • Eén logische bestandsbewerking kan meerdere onafhankelijk voltooide blokschrijfbewerkingen vereisen.
  • Vergelijk gegevens, inodepointers en toewijzingsbits na elk mogelijk crashmoment.
  • Consistente metadata kunnen nog steeds naar onjuiste bestandsinhoud verwijzen.
  • Atomiciteit voor meerdere blokken vereist een bestandssysteemprotocol boven op één atomaire schrijfbewerking van het apparaat.

4.2 Controleer en herstel een bestandssysteem met fsck

Een bestandssysteemcontrole herstelt relaties tussen opgeslagen structuren nadat schade is ontstaan. De kracht is een breed overzicht van metadata; de zwakke punten zijn de kosten van het doorzoeken en het gebrek aan kennis over de bedoelde bestandsinhoud.

Reconstrueer het toewijzingsoverzicht

fsck, de bestandssysteemcontrole, onderzoekt een onzuiver afgesloten bestandssysteem voordat het normaal wordt aangekoppeld. Het controleert of de grootte en aantallen in het superblok redelijk zijn en kan een reservesuperblok gebruiken als de hoofdkopie beschadigd is.

Daarna doorzoekt het inodes en indirecte blokken om te bepalen naar welke gegevensblokken bestanden daadwerkelijk verwijzen. Uit die informatie over eigenaarschap bouwt het de toewijzingsbitmaps opnieuw op. Als een verder geldige inode naar blok 74 verwijst terwijl de bitmap 74 vrij noemt, moet de bitmap worden gewijzigd naar toegewezen. Als het systeem alleen op de bitmap zou vertrouwen, zou een latere toewijzing de bestandsgegevens kunnen overschrijven.

De omgekeerde afwijking is een bitmapbit dat als toegewezen is gemarkeerd zonder pointer vanuit een inode die eigenaar is. Door de bitmap te reconstrueren kan die ruimte weer beschikbaar komen. Herstel kiest een consistente relatie; het kan geen willekeurige ontbrekende toepassingsbytes reconstrueren.

Controleer objecten, namen en koppelingen

Elke toegewezen inode heeft een geldig type nodig, zoals gewoon bestand, directory of symbolische koppeling. Een inode die niet kan worden hersteld, wordt gewist en de toewijzingsgegevens worden aangepast.

Door vanaf de hoofddirectory te lopen kan fsck directoryverwijzingen naar elke inode tellen. Het vergelijkt deze waargenomen verwijzingen met de geregistreerde aantallen harde koppelingen en corrigeert fouten. Een toegewezen inode die geen directory bereikt, kan naar lost+found worden verplaatst. Zo krijgt herstelde inhoud een bereikbare naam zonder dat het oorspronkelijke pad bekend is.

Andere controles omvatten:

  • Dubbel eigenaarschap: twee inodes claimen één gegevensblok. Een herstelactie kan één inode wissen of elk bestand een afzonderlijke kopie geven.
  • Ongeldige adressen: pointers buiten het geldige bereik van het bestandssysteem moeten worden gewist.
  • Directorystructuur: . en .. moeten geldig zijn en in de eenvoudige directoryindeling de eerste vermeldingen bezetten, vermeldingen moeten naar toegewezen inodes verwijzen en directory's mogen niet meerdere bovenliggende directory's hebben.

Deze controles beïnvloeden elkaar. Een ongeldige inode wissen verandert ook welke blokken toegewezen moeten zijn en welke directoryvermeldingen geldig blijven. Herstel vereist daarom een samenhangend beeld van de metadata, niet alleen een lijst verdachte afzonderlijke bits.

Begrijp wat een foutloze uitkomst vaststelt

Stel dat de inode en bitmap van een toevoeging de schijf hebben bereikt, maar de gegevens niet. De pointer ligt binnen het bereik, het toewijzingsbit is gezet en de koppelingsstructuur is geldig. fsck heeft geen afwijking in metadata om te herstellen. Het bestand kan de controle doorstaan terwijl het nieuw toegevoegde gebied oude bytes bevat.

De uitvoeringstijd hangt ook vooral af van de grootte van het bestandssysteem, niet van de hoeveelheid die vóór een crash is gewijzigd. Een crash tijdens één wijziging van drie blokken kan nog steeds vereisen dat alle metadata worden doorzocht. Op een groot bestandssysteem kan dit minuten tot uren duren, waarbij normale toegang tijdens de controle niet beschikbaar is.

Journaalregistratie vermindert het gebruikelijke herstelwerk na een crash door recente wijzigingen te registreren. Ze maakt een controleprogramma niet overbodig: softwarefouten of falende hardware kunnen structuren beschadigen op een manier die opnieuw toepassen uit het journaal niet kan herstellen. fsck blijft voor die gevallen een herstelhulpmiddel.

Belangrijkste punten

  • fsck reconstrueert toewijzing uit inodepointers en corrigeert relaties tussen metadata.
  • Het doorlopen van directory's controleert aantallen harde koppelingen en vindt onbereikbare toegewezen inodes.
  • De controle kan dubbel eigenaarschap en ongeldige pointers herstellen.
  • Een foutloze metadatacontrole kan niet vaststellen of toepassingsbytes correct zijn.
  • Het volledig doorzoeken van metadata schaalt met de grootte van het bestandssysteem, ook na een kleine onderbroken wijziging.

4.3 Bescherm wijzigingen met gegevensregistratie in een journaal en pas de wijzigingen uit het logboek opnieuw toe

Een journaal registreert een wijziging voordat het bestandssysteem de gewone locaties overschrijft. Na een crash vertelt die registratie het herstelproces welke volledige wijzigingen opnieuw kunnen worden uitgevoerd. Dit is voorafgaande logregistratie. Ext3, ext4, XFS en NTFS gebruiken journaalregistratie, hoewel hun exacte logboekformaten verschillen.

Beschrijf een wijziging als een transactie

Voor een toevoeging registreert gegevensregistratie in een journaal kopieën van de nieuwe inode I, bitmap B en het gegevensblok Db. Een transactiebeginrecord, TxB, bevat een ID en de definitieve bestemmingen van de blokken. Een transactie-eindrecord, TxE, bevat de bijbehorende ID en markeert de vastlegging.

Volledige vervangende blokinhoud registreren is fysieke logregistratie. In plaats daarvan een bewerkingsbeschrijving registreren is logische logregistratie. Fysiek opnieuw uitvoeren heeft een nuttige eigenschap: dezelfde inhoud opnieuw naar hetzelfde adres schrijven heeft hetzelfde effect. Herstel kan daarom het overbrengen naar de definitieve locatie herhalen als dat vóór de crash gedeeltelijk was voltooid.

Leg vast na de inhoud

Het basisprotocol heeft vier fasen:

  1. Schrijven naar het journaal: schrijf TxB en I, B en Db naar het journaal en wacht tot ze duurzaam zijn opgeslagen.
  2. Vastleggen: schrijf TxE en wacht. De transactie is nu vastgelegd.
  3. Overbrengen: kopieer I, B en Db vanuit het journaal naar hun definitieve locaties.
  4. Vrijgeven: geef de journaalruimte van die transactie vrij voor later hergebruik.

TxE mag niet duurzaam worden opgeslagen vóór de inhoud van de transactie. Als alle vijf blokken zonder volgordegarantie zouden worden uitgegeven, zou een apparaat TxB en TxE kunnen voltooien terwijl Db ongeschreven blijft. Herstel zou een onvolledige transactie voor een geldige aanzien. In het basismodel past TxE binnen één atomaire sectorschrijfbewerking, zodat het als volledig vastleggingsrecord aanwezig of afwezig is.

Schrijfcaches van apparaten moeten de duurzaamheidsgrens ook respecteren. Cacheleegmaak- of geforceerde schrijfbewerkingen voorkomen dat een vluchtige apparaatcache het protocol laat geloven dat de inhoud veilig is terwijl stroomuitval die nog kan wissen.

Herstel van twee crashmomenten

Een crash na de inhoud maar vóór TxE laat een niet-vastgelegde transactie achter. Herstel negeert die en behoudt de oude bestandstoestand.

Een crash na TxE maar tijdens het overbrengen naar de definitieve locaties laat een vastgelegde transactie achter. Herstel schrijft alle blokinhoud op volgorde naar de definitieve locaties. Sommige schrijfbewerkingen herhalen mogelijk al uitgevoerd werk, wat voor deze blokinhoud geen kwaad kan. Dit is herstel door opnieuw uitvoeren. Journaalruimte kan pas opnieuw worden gebruikt als de vastgelegde blokinhoud de definitieve locaties heeft bereikt.

Het journaal is een circulair logboek. Het superblok houdt het actieve bereik bij, zodat vrijgekomen ruimte opnieuw kan worden gebruikt. Door meerdere wijzigingen in één transactie te bundelen kan één gedeeld directoryblok of één bitmap één keer worden geregistreerd. Het standaardinterval voor vastlegging in ext4 is 5 seconden, dus volgt vastlegging niet automatisch onmiddellijk op elke schrijfbewerking van een toepassing.

Scheid controlesommen van duurzaamheid

Een transactiecontrolesom kan ontbrekende of gedeeltelijk geschreven inhoudsblokken onthullen, ook wanneer een vastleggingsrecord aanwezig is. Een protocol op basis van controlesommen kan journaalschrijfbewerkingen samen uitgeven en alleen transacties accepteren waarvan de controle slaagt. Controlesommen detecteren onvolledige records; cacheleegmaakbewerkingen bepalen of bevestigde bytes werkelijk behouden blijven.

Een gebufferde, niet-vastgelegde schrijfbewerking van een toepassing kan nog steeds verdwijnen. Een programma dat duurzame voltooiing vereist, gebruikt fsync en controleert of dat lukt.

Belangrijkste punten

  • Voorafgaande logregistratie registreert volledige wijzigingen voordat hun definitieve locaties worden gewijzigd.
  • In het basisprotocol wordt de inhoud duurzaam opgeslagen vóór het vastleggingsrecord.
  • Herstel voert vastgelegde transacties opnieuw uit en negeert niet-vastgelegde transacties.
  • Identieke blokinhoud opnieuw schrijven is veilig na gedeeltelijke overbrenging naar de definitieve locatie.
  • Het overbrengen naar de definitieve locatie moet zijn voltooid voordat journaalruimte opnieuw wordt gebruikt.
  • Bundeling vermindert metadataverkeer, terwijl fsync de benodigde duurzaamheid vastlegt.

4.4 Verlaag de kosten van journaalregistratie en vergelijk andere benaderingen

Gegevensregistratie in een journaal schrijft bestandsinhoud naar het journaal en daarna naar de definitieve locaties. Alleen metadata in het journaal registreren vermindert dat verkeer, maar de volgorde van gegevens en metadata bepaalt nog steeds wat na herstel zichtbaar kan worden.

Zorg dat gegevens vóór vastgelegde pointers komen

Bij geordende metadataregistratie in een journaal gaat Db rechtstreeks naar de definitieve locatie. TxB, I en B gaan naar het journaal. Deze twee groepen schrijfbewerkingen kunnen parallel lopen, maar beide moeten voltooid zijn voordat TxE de metadata vastlegt. Na vastlegging kunnen I en B naar de definitieve locaties worden overgebracht en kan de journaalruimte worden vrijgegeven.

De afhankelijkheid is de kern: het blok dat een pointer aanduidt, moet gereed zijn voordat die pointer kan worden hersteld. Als I eerst wordt vastgelegd, kan herstel een geldige pointer installeren naar bytes die zijn achtergelaten door een eerdere gebruiker van het blok. De metadata zouden overeenkomen zonder dat de bedoelde gegevens aanwezig zijn.

Ext4-modusWat in het journaal komtRegel voor gegevens vóór vastlegging
data=journalGegevens en metadataGegevens maken deel uit van de geregistreerde transactie
data=orderedMetadataGegevens waarnaar wordt verwezen bereiken vóór vastlegging hun definitieve plaats
data=writebackMetadataGeen dergelijke garantie voor de volgorde van gegevens

De geordende modus is de standaard. Alleen metadata in een journaal registreren betekent niet dat de geordende modus wordt gebruikt: de modus met ongeordend terugschrijven kan structureel correcte bestanden met verouderde inhoud herstellen. De modus met gegevensregistratie in een journaal laat het volledige protocol zien, maar kost een tweede schrijfbewerking voor de bestandsgegevens.

Voorkom dat opnieuw toepassen een hergebruikt blok beschadigt

Directory-inhoud telt als metadata. Stel dat een directoryblok op adres 1000 wordt geregistreerd, waarna de directory wordt verwijderd en hetzelfde adres gewone bestandsgegevens gaat bevatten. Die nieuwe gebruikersgegevens worden in de modus met alleen metadataregistratie niet geregistreerd. Als de oude directory-inhoud na een crash opnieuw wordt toegepast, overschrijft die de bytes van het nieuwe bestand.

Een vastgelegd intrekkingsrecord vertelt het herstelproces geregistreerde kopieën van dat blok uit transacties tot en met de intrekkende transactie over te slaan. Het verbiedt niet elk toekomstig gebruik van het adres. Als een latere transactie dat blok opnieuw registreert, kan de latere blokinhoud nog steeds opnieuw worden toegepast. Deze tijdsgrens onderscheidt intrekking van het permanent als onbruikbaar markeren van een blok.

Vergelijk alternatieven

Soft updates dwingen afhankelijkheden tussen gewone schrijfbewerkingen af zonder journaal. Door geïnitialiseerde gegevens vóór een pointer te schrijven, voorkom je bereikbare ongeldige inhoud, hoewel onderbroken bewerkingen ruimte kunnen laten lekken die een latere achtergrondcontrole weer beschikbaar maakt. FFS van FreeBSD gebruikt deze aanpak. Alle afhankelijkheden bijhouden maakt implementatie moeilijk.

Kopiëren bij schrijven schrijft gewijzigde blokken naar ongebruikte locaties en gebruikt een atomaire omschakeling van de wortelpointer om de nieuwe boom beschikbaar te maken. De oude boom blijft tot de omschakeling beschikbaar. ZFS, Btrfs en WAFL gebruiken verwante ontwerpen; oude blokken behouden maakt ook momentopnamen mogelijk.

Onderzoeksontwerpen op basis van terugverwijzingen registreren eigenaarschap van gegevens terug naar inodes, zodat onvolledige wijzigingen detecteerbare afwijkingen achterlaten. Optimistische consistentie na een crash vermindert het wachten en gebruikt controlesommen en andere controles om onvoltooid werk te detecteren. Elke aanpak weegt schrijfverkeer, herstelgaranties en implementatiecomplexiteit tegen elkaar af. Geordende metadataregistratie in een journaal houdt herstel kort en schrijft gewone bestandsgegevens één keer.

Belangrijkste punten

  • Geordende journaalregistratie stuurt gegevens naar definitieve locaties voordat de metadatapointers worden vastgelegd.
  • Alleen metadata in een journaal registreren en geordende journaalregistratie zijn geen synoniemen.
  • Intrekkingsrecords voorkomen dat verouderde geregistreerde blokinhoud hergebruikte blokken overschrijft.
  • Soft updates ordenen afhankelijkheden; kopiëren bij schrijven maakt een nieuwe boom beschikbaar.
  • Minder schrijfverkeer kan zorgvuldiger ordening of controle vereisen.
5

Leg uit hoe een loggestructureerd bestandssysteem schrijft en ruimte vrijmaakt

Sequentiële schrijfbewerkingen benutten een schijf goed, maar elk gewijzigd blok verplaatsen veroorzaakt nieuwe problemen bij het opzoeken en beheren van ruimte. Volg LFS van gebufferde segmenten via de inodevertaaltabel en het checkpointgebied en bekijk daarna hoe de segmentopruimer nog gebruikte blokken vindt en vrije segmenten terugwint. Herstel moet de nieuwste geldige koppeling terugvinden zonder een onderbroken checkpoint voor een volledig checkpoint aan te zien.

5.1 Schrijf sequentieel in segmenten en vind inodes via de inodevertaaltabel

Een loggestructureerd bestandssysteem zet verspreide kleine wijzigingen om in grote sequentiële schrijfbewerkingen. Dit helpt bij een schijf met een hoge overdrachtssnelheid waarvan zoek- en rotatievertragingen kostbaar blijven.

Verzamel wijzigingen in een segment

LFS van Berkeley, ontwikkeld door Rosenblum en Ousterhout en gepubliceerd in 1991, ging uit van veranderende werklasten. Grotere geheugens handelden meer leesbewerkingen af vanuit de cache, waardoor schrijfbewerkingen een groter aandeel van het schijfverkeer vormden. De sequentiële bandbreedte groeide sneller dan de positioneringssnelheid. FFS had voor het aanmaken van een klein bestand nog steeds meerdere korte schrijfopdrachten voor metadata en gegevens nodig, en kleine schrijfbewerkingen werkten ook slecht met RAID met pariteit.

LFS buffert gewijzigde gegevens, inodes en vertaaltabelinformatie samen in het geheugen. Het schrijft ze als één groot segment naar een ongebruikt schijfgebied. Een blok bijwerken maakt een nieuwe versie op een nieuw adres; de vorige versie blijft fysiek aanwezig totdat het opruimen het segment vrijmaakt.

Segmenten amortiseren positioneringskosten net als grote delen bij FFS. Bij snelheid R, positioneringstijd T en gewenste overdrachtstijdfractie F is de gebufferde grootte:

D=F1−FRT.

Bij 200 MB/s en 5 ms vereist 95% een grootte van 19 MB. De overdracht duurt 95 ms, de positionering 5 ms en de effectieve snelheid is 19 MB per 0,1 s = 190 MB/s. Een hoge doelfractie kan een segment vereisen dat groter is dan de gebruikelijke honderden kilobytes tot enkele megabytes. De vereiste grootte volgt uit het apparaat en het doel, niet uit het woord “segment”.

Zoek een inode die blijft verplaatsen

De formule met een vaste inodetabel werkt niet meer: elke inodewijziging wordt op een nieuw adres geschreven. LFS voegt een inodevertaaltabel, of imap, toe die elk inodenummer aan het nieuwste schijfadres koppelt. Bijgewerkte imap-delen worden in het logboek geschreven naast de inodes die ze beschrijven.

Een vast checkpointgebied (CR) legt vast waar de nieuwste imap-delen staan. Het wordt periodiek bijgewerkt, bijvoorbeeld om de 30 seconden, zodat de incidentele schrijfbewerking op een vaste locatie het verkeer niet overheerst.

De opzoekketen is:

  1. Lees bij het aankoppelen de CR om de huidige imap-delen te vinden.
  2. Laad de imap in het geheugen.
  3. Zoek het gevraagde inodenummer op in de imap.
  4. Lees die nieuwste inode en volg de gegevenspointers.

Zodra de imap in de cache staat, gebruiken gewone bestandsleesbewerkingen vrijwel hetzelfde pad van inode naar gegevens als in FFS. De extra vertaalslag maakt verplaatsing betaalbaar zonder de stabiele identiteit van het bestand te veranderen.

Houd directoryvermeldingen stabiel

Een directory bewaart namen en inodenummers. Als /docs/report.txt wordt gewijzigd, verplaatst de inode maar behoudt die het nummer. De imap verandert; de directoryvermelding hoeft niet alleen door die verplaatsing te veranderen.

Zonder deze indirecte verwijzing zou een directory met fysieke inodeadressen telkens opnieuw moeten worden geschreven wanneer een onderliggende inode verplaatst. De eigen inode zou dan verplaatsen, wat een wijziging in de bovenliggende directory afdwingt, enzovoort tot aan de hoofddirectory. De imap doorbreekt dit recursieve wijzigingsprobleem.

LFS maakt schrijfbewerkingen sequentieel, niet alle leesbewerkingen. De ongewijzigde blokken van een bestand kunnen in oudere segmenten blijven terwijl latere versies van andere blokken naar elders verplaatsen. Voor het lezen van dat bestand kunnen nog steeds zoekbewegingen tussen segmenten nodig zijn; grote geheugencaches maken deel uit van de motivatie voor het ontwerp.

Belangrijkste punten

  • LFS schrijft gebufferde gegevens en metadata samen in grote segmenten naar ongebruikte ruimte.
  • De imap koppelt stabiele inodenummers aan veranderende inodeadressen.
  • Het vaste checkpointgebied geeft aan waar de nieuwste imap-delen staan.
  • Directoryvermeldingen behouden inodenummers en voorkomen zo dat bovenliggende directory's recursief worden herschreven.
  • De segmentgrootte moet positioneringskosten amortiseren; leesbewerkingen kunnen nog steeds verspreid zijn.

5.2 Maak ruimte vrij met de segmentopruimer en herstel na een crash

Door nieuwe versies naar ongebruikte locaties te schrijven blijven oude bytes fysiek aanwezig. LFS moet oude onbereikbare versies onderscheiden van nog gebruikte blokken, grote vrije gebieden terugwinnen en na een crash een bruikbare koppeling herstellen.

Ruim hele segmenten op

De segmentopruimer leest gedeeltelijk bezette segmenten, kopieert hun nog gebruikte blokken naar een kleiner aantal nieuwe segmenten en geeft de oude segmenten vrij. Als vier even grote segmenten elk voor een kwart nog gebruikte gegevens bevatten, vullen die gegevens samen één nieuw segment. Door de vier oude segmenten na het kopiëren vrij te geven win je drie segmenten aan bruikbare capaciteit.

Door hele segmenten op te ruimen blijven grote aaneengesloten gebieden behouden voor toekomstige sequentiële schrijfbewerkingen. Kopiëren heeft kosten: nog gebruikte blokken worden opnieuw gelezen en geschreven, ook als geen toepassing ze heeft gewijzigd. Bij een bijna volle schijf met voornamelijk nog gebruikte segmenten kan veel kopiëren nodig zijn om weinig vrije ruimte terug te winnen.

Bepaal of een blok nog wordt gebruikt

Een segmentoverzicht identificeert voor elk blok de inode van de eigenaar en de positie van het logische bestandsblok. Om een blok op adres A te testen, gebruik je de imap om de nieuwste inode van die eigenaar te vinden. Volg de pointer voor het vastgelegde logische blok. Als de pointer nog gelijk is aan A, is dit de gebruikte versie. Als die naar elders verwijst, is A verouderd.

Een overzicht koppelt bijvoorbeeld adres 600 aan inode 14, logisch blok 2. De huidige inode 14 laat logisch blok 2 naar adres 920 wijzen. Blok 600 is ongebruikt, ook als de bytes op geldige gegevens lijken. Of een blok nog wordt gebruikt, hangt af van de huidige bereikbaarheid, niet van hoe recent het is geschreven of of de inhoud nuttig lijkt.

Versienummers versnellen het uitsluiten. Een bestand verwijderen of tot nul inkorten verhoogt het versienummer van dat bestand in de imap. Een segmentblok met een oudere versie kan als ongebruikt worden aangemerkt zonder de inode te lezen.

Het opruimbeleid houdt ook rekening met verwachte wijzigingen. Hete segmenten bevatten vaak overschreven blokken; door te wachten kunnen meer van hun blokken ongebruikt raken zonder te kopiëren. Koude segmenten veranderen weinig, dus ruimt het oorspronkelijke LFS-beleid ze eerder op. Het beleid moet de gebruikte fractie, de leeftijd en de beschikbare ruimte tegen elkaar afwegen; alleen de temperatuur van een segment meet niet de directe kopieerkosten.

Herstel de koppeling en recent werk

LFS bewaart twee checkpointgebieden aan tegenoverliggende uiteinden van de schijf en werkt ze afwisselend bij. Elke wijziging schrijft een header met een tijdstempel, de inhoud en een afsluitend overeenkomstig tijdstempel. Herstel kiest het nieuwste gebied waarvan begin en einde overeenkomen. Een onderbroken nieuwere wijziging verdringt een ouder volledig checkpoint niet.

Het checkpoint bevat mogelijk niet de recentst voltooide segmenten. Daarom voert herstel voorwaarts herstel uit vanaf het daarin vastgelegde logboekeinde: het zoekt geldige latere wijzigingen en past die toe om de huidige koppeling opnieuw op te bouwen. Gegevens die nooit een geldige herstelbare wijziging vormden, kunnen na stroomuitval niet uit het geheugen worden teruggehaald.

Verwante systemen met kopiëren bij schrijven bewaren oude blokken om momentopnamen te ondersteunen; ZFS, Btrfs en WAFL delen dat algemene idee. SSD-controllers gebruiken vaak loggestructureerde flashvertaallagen, terwijl F2FS loggestructureerde ideeën op bestandssysteemniveau toepast voor flashopslag. Elk heeft nog steeds een manier nodig om ruimte van verouderde versies vrij te maken.

Belangrijkste punten

  • De segmentopruimer kopieert nog gebruikte blokken naar minder segmenten en geeft de oude segmenten vrij.
  • Of een blok nog wordt gebruikt, volgt uit de nieuwste inodetoewijzing, niet uit de schijnbare inhoud van het blok.
  • Verschillende versienummers kunnen ongebruikte blokken snel identificeren.
  • Door te wachten met het opruimen van hete segmenten kun je voorkomen dat blokken worden gekopieerd die snel verouderen.
  • Herstel kiest een volledig checkpoint en voert geldig later werk voorwaarts uit.
  • Opruimen voegt I/O toe en kan duur worden wanneer weinig vrije ruimte overblijft.
6

Vergelijk hoe gedistribueerde bestandssystemen bestanden via een netwerk delen

Bestanden delen tussen machines brengt onzekere antwoorden en gecachete kopieën mee die kunnen verschillen. NFS laat zien hoe zelfstandige verzoeken en veilige herhalingen een soort herstel na storingen vereenvoudigen. AFS laat zien hoe het cachen van volledige bestanden en wijzigingsmeldingsbeloften serverwerk verminderen. Vergelijk hun grenzen voor het delen en de toestand bij storingen om te voorspellen wanneer een andere client een wijziging ziet en wanneer gelijktijdige wijzigingen verloren kunnen gaan.

6.1 Leg uit hoe NFS met toestandsloze verzoeken van storingen herstelt

Een gedistribueerd bestandssysteem bewaart bestanden op een server terwijl programma's op clientmachines vertrouwde bestandsaanroepen gebruiken. De client vertaalt die aanroepen naar netwerkverzoeken. Vertragingen en storingen roepen een vraag op die lokale aanroepen meestal verbergen: wat moet een client doen als die niet kan bepalen of een verzoek is voltooid?

Houd de toestand van geopende bestanden op de client

Het Network File System (NFS) van Sun begon in de jaren 1980. NFSv2 maakte de server toestandsloos voor geopende bestanden. De server slaat bestanden op, maar onthoudt niet de descriptoren of huidige bestandsposities van elke client. Elk verzoek bevat voldoende informatie om zonder een eerder openingsverzoek te worden uitgevoerd.

Een bestandshandle identificeert het servervolume, het inodenummer en de inodegeneratie. De generatie verandert wanneer een inodenummer opnieuw wordt gebruikt. Zo voorkomt die dat een oude handle per ongeluk een ander bestand op die opnieuw gebruikte plaats aanduidt.

Om /home/ana/notes.txt te openen begint de client met een handle voor de hoofddirectory en stuurt die LOOKUP voor home, ana en notes.txt. De client bewaart de resulterende handle in de eigen toestand voor geopende bestanden. De eerste 4 KiB lezen wordt een READ-verzoek met die handle, positie 0 en aantal 4096. De lokale descriptor sluiten vereist geen NFSv2-CLOSE-verzoek, omdat de server geen vermelding voor een geopend bestand heeft om vrij te geven.

Herhaal zonder een effect te herhalen

Als geen antwoord aankomt, kan de client geen onderscheid maken tussen een verloren verzoek, een onbereikbare server of een verloren antwoord. Na een time-out verstuurt de client het verzoek opnieuw.

Een bewerking is idempotent wanneer herhalen hetzelfde effect heeft als één keer uitvoeren. READ, LOOKUP en GETATTR wijzigen de opgeslagen inhoud niet. Een WRITE met een expliciete positie herhaalt in dit model ook veilig dezelfde bytes op dezelfde locatie. Een verzoek herhalen dat zegt “voeg deze bytes aan het huidige einde toe” zou daarentegen een tweede kopie toevoegen; de positie in een NFS-WRITE voorkomt die dubbelzinnigheid.

Sommige verzoeken vereisen extra zorg. Een geslaagde MKDIR opnieuw proberen nadat het antwoord verloren is gegaan, kan “bestaat al” teruggeven. De directory is aanwezig, maar het herhaalde antwoord verschilt van de oorspronkelijke bevestiging. Toestandsloos herstel maakt niet van elke bewerking een eenvoudig herhaalbaar verzoek.

Maak bevestigingen betrouwbaar

NFSv2 moet een WRITE duurzaam opslaan voordat het succes bevestigt. Anders zou de server een blok kunnen bevestigen, het tijdens een crash uit het geheugen verliezen en daarna latere blokken accepteren. De client zou denken dat alle schrijfbewerkingen zijn geslaagd terwijl in het bestand een wijziging in het midden ontbreekt.

Duurzame antwoorden voorkomen die fout ten koste van prestaties. NFSv3 voegde instabiele schrijfbewerkingen toe, gevolgd door COMMIT, waardoor meerdere schrijfbewerkingen samen duurzaam kunnen worden gemaakt. De client moet een instabiele bevestiging onderscheiden van duurzame voltooiing.

Onderscheid versies van het protocol

Een protocol met toestand heeft mechanismen nodig om de toestand van geopende bestanden en vergrendelingen na een serverherstart te herstellen en toestand van gecrashte clients op te ruimen. NFSv4 accepteert die complexiteit bewust: het heeft OPEN, CLOSE, vergrendelingen en in tijd beperkte tijdelijke gebruiksrechten die clients verlengen. De Linux-client probeert normaal eerst versie 4.2 en valt zo nodig terug. NFSv2 toestandsloos noemen beschrijft dus niet elke NFS-versie.

Belangrijkste punten

  • NFSv2 bewaart descriptoren en bestandsposities op clients; elk verzoek is zelfstandig.
  • Bestandshandles bevatten een generatie om verouderde identiteiten na hergebruik van een inode af te wijzen.
  • Expliciete posities maken het herhalen van dezelfde WRITE veilig in het model met herhaalde verzoeken.
  • NFSv2 bevestigt schrijfbewerkingen pas na stabiele opslag; NFSv3 kan duurzaamheid uitstellen tot COMMIT.
  • NFSv4 houdt toestand bij en gebruikt herstelmechanismen en tijdelijke gebruiksrechten.

6.2 Vergelijk caching en consistentie bij NFS en AFS

Caching op clients bespaart netwerkverkeer, maar creëert meerdere kopieën van gedeelde bestanden. De consistentieregel bepaalt wanneer een andere machine moet stoppen met het gebruiken van een oude kopie en de wijzigingen van de schrijver moet ophalen.

Controleer NFS-caches bij overdracht tussen gebruikers

Bij consistentie tussen sluiten en opnieuw openen van NFS stuurt het sluiten van een gewijzigd bestand gebufferde schrijfbewerkingen naar de server. Een latere opening op een andere client controleert of de kopie actueel is en ziet die wijzigingen. GETATTR of een vergelijkbare controle vergelijkt serverattributen met gecachete attributen en verwijdert verouderde gecachete gegevens wanneer een wijziging wordt gedetecteerd.

Bij elke toegang controleren zou de server belasten. Linux bewaart attributen van gewone bestanden standaard tussen 3 en 60 seconden in de cache. Een proces dat een bestand openhoudt, kan daardoor tussen controles verouderde gecachete gegevens lezen. Openen is een sterker overdrachtsmoment dan een willekeurige leesbewerking via een al open descriptor. Consistentie tussen sluiten en opnieuw openen belooft niet dat elke afzonderlijke schrijfbewerking onmiddellijk zichtbaar is.

Hergebruik volledige bestanden met AFS-wijzigingsmeldingsbeloften

Het Andrew File System (AFS) is in de jaren 1980 bij Carnegie Mellon ontworpen om veel clients per server te ondersteunen. Als er geen geldige lokale kopie bestaat, haalt openen het hele bestand naar de lokale schijf. Lees- en schrijfbewerkingen gebruiken daarna die kopie en het sluiten van een gewijzigd bestand stuurt de hele nieuwe versie naar de server. Een geldige gecachete kopie kan opnieuw worden geopend zonder die opnieuw te downloaden.

AFSv1 controleerde bij elke opening de geldigheid en liet het doorlopen van paden aan de server over. AFSv2 verschoof het doorlopen naar clients, die directory's cachen, en introduceerde wijzigingsmeldingsbeloften. De server belooft een client te melden wanneer een gecachet object verandert. Tot die belofte wordt ingetrokken, gebruikt de client de kopie opnieuw zonder herhaalde controles. De bestandsidentificatie omvat een volume, een bestandsidentificatie en een uniekmaker.

Volg twee overlappende sessies

Stel dat clients A en B beide een bestand openen. A wijzigt de lokale kopie en sluit het bestand, waardoor de nieuwe versie naar de server gaat. De server trekt de wijzigingsmeldingsbeloften van andere clients in. Een latere opening op B haalt de nieuwe versie op, maar de al open sessie van B behoudt de bestaande kopie tot sluiten en opnieuw openen.

Als beide machines hun kopieën wijzigen, vervangt de machine die het laatst sluit het hele bestand op de server. Blokken uit de twee kopieën worden niet samengevoegd. Ook bij twee wijzigingen op verschillende posities kunnen de wijzigingen van één client verloren gaan, omdat de laatst sluitende client wint één volledige versie kiest. Processen op één clientmachine zien elkaars schrijfbewerkingen onmiddellijk.

Wijzigingsmeldingsbeloften zijn toestand op de server. Na een herstart van een client zijn gecachete bestanden verdacht omdat meldingen gemist kunnen zijn. Na een herstart van de server moeten clients de verloren beloften detecteren, via hartslagberichten of een melding van de server, en opnieuw controleren.

Stem caching af op de werklast
Werklast of vraagstukNFSAFS
Klein deel van een groot bestandDraagt opgevraagde blokken overOverdracht van het hele bestand kan werk verspillen
Herhaald lezen van een groot bestand dat niet in het geheugen pastHangt af van beschikbare gecachete blokkenLokale schijfkopie voorkomt meer downloads via het netwerk
Bijhouden of gegevens actueel zijnAttribuutcontrolesWijzigingsmeldingsbeloften van de server
Gelijktijdig delenVereist coördinatieVereist coördinatie; de laatst sluitende client kan een andere versie overschrijven

AFS bood ook een globale naamruimte, toegangscontrolelijsten en door beheerders beheerde volumes. AFSv2 verhoogde historisch de schaal van een server tot ongeveer 50 clients, tegenover ongeveer 20 voor AFSv1. Geen van beide cacheregels vervangt expliciete coördinatie, zoals bestandsvergrendeling, wanneer programma's veilige gedeelde wijzigingen nodig hebben.

Belangrijkste punten

  • NFS controleert bij opnieuw openen na sluiten, terwijl attributencaching open lezers verouderde gegevens kan laten zien.
  • AFS hergebruikt een volledig bestand in de schijfcache zolang een wijzigingsmeldingsbelofte geldig blijft.
  • AFS maakt wijzigingen bij sluiten beschikbaar; een al open sessie op afstand behoudt de oude kopie.
  • Gelijktijdige AFS-schrijvers vervangen volledige versies, dus wint de laatst sluitende client.
  • Toestand voor wijzigingsmeldingsbeloften vereist na storingen een nieuwe controle.
  • De overdrachtsgranulariteit bepaalt welke werklasten baat hebben bij elk cacheontwerp.

Bestandssystemen: voorbeelden

6 Walkthroughs

1

Volg een bestand van openen tot duurzame vervanging

19 stappen
Volg descriptoren, namen, toegangsrechten en een opslagactie die een crash overleeft.
  1. 1
    IntroductieVolg vier soorten toestand

    Een bestandsbewerking kan bytes, een bestandspositie van een geopend bestand, een directorynaam of toegangsrechten veranderen. Volg een klein programma door deze lagen en bouw daarna een duurzame vervanging. De lagen gescheiden houden verklaart twee aanvankelijk verrassende resultaten: een bestand kan bruikbaar blijven nadat de laatste naam is verwijderd en een bestand sluiten maakt een opslagactie op zichzelf niet duurzaam.

  2. 2
    VoorbeeldOpen en lees een reeks bytes

    Een bestand van 260 bytes wordt geopend om te lezen. Stel dat open descriptor 3 teruggeeft en de eerste read(3, buf, 80) 80 teruggeeft. De descriptor identificeert de open verwijzing van dit proces; de bestandspositie is nu 80. Het teruggegeven aantal vertelt je hoeveel je moet opschuiven. Het gevraagde aantal is alleen een bovengrens, dus moet het programma de retourwaarde controleren.

  3. 3
    UitdagingBepaal de volgende bestandspositie

    Het volgende verzoek vraagt 100 bytes maar geeft 60 terug. Op welke positie begint de daaropvolgende gewone leesbewerking?

    ---reveal---

    Die begint bij byte 140: de vorige positie 80 schuift op met de 60 werkelijk gelezen bytes. Opschuiven met de gevraagde 100 zou ten onrechte bytes overslaan. Een leesbewerking die aan het bestandseinde 0 teruggeeft, zou de positie ongewijzigd laten.

  4. 4
    AnalogieDeel een boekenlegger

    Een vermelding voor een geopend bestand is als een gedeelde boekenlegger in één exemplaar van een boek. dup geeft een andere manier om dezelfde boekenlegger te bereiken; twee afzonderlijke open-aanroepen maken twee boekenleggers. De vergelijking gaat alleen over de positie: beide openingen bereiken nog steeds hetzelfde onderliggende bestand. De bytes wijzigen kan beide lezers beïnvloeden, ook al zijn hun bestandsposities onafhankelijk.

  5. 5
    VoorbeeldVolg een gedupliceerde descriptor

    Het programma roept other = dup(3) aan en daarna lseek(other, 20, SEEK_SET). Descriptor 3 gebruikt nu ook positie 20, omdat beide descriptoren één vermelding voor een geopend bestand bereiken. Een leesbewerking van 15 bytes via descriptor 3 laat hun gedeelde positie op 35 staan. De positiewijziging zelf verandert de toestand in het geheugen; ze leest geen blok en verplaatst geen fysieke schijfkop.

  6. 6
    TipKies de juiste positiebewerking

    Gebruik pread wanneer een leesbewerking een expliciete bytepositie moet aangeven zonder de positie van de vermelding voor het geopende bestand te veranderen. Dit is van belang wanneer descriptoren die vermelding na dup of fork delen. Een gewone read schuift de gedeelde positie op; pread doet dat niet. Controleer bij beide aanroepen het teruggegeven aantal en eventuele fouten voordat je aanneemt dat de gevraagde bytes zijn opgehaald.

  7. 7
    UitlegMaak geaccepteerde bytes duurzaam

    Een geslaagde write plaatst nieuwe bytes meestal in geheugenbuffers. Een latere crash kan ze wissen voordat ze de opslag bereiken. fsync wacht totdat de gewijzigde gegevens en metadata van het bestand volgens het apparaat de opslag hebben bereikt. Een descriptor sluiten geeft een open verwijzing vrij; het voert niet dezelfde duurzaamheidsbewerking uit.

  8. 8
    VoorbeeldBereid een volledige vervanging voor

    Een editor wil settings.json vervangen. Die schrijft eerst alle vervangende inhoud naar settings.json.tmp in dezelfde directory en controleert de geschreven aantallen en fouten. Het oude doel blijft tijdens dit werk intact. Daarna synchroniseert de editor het tijdelijke bestand met succes, zodat de volledige vervangende bytes duurzaam zijn opgeslagen voordat de doelnaam verandert.

  9. 9
    VoorbeeldMaak de nieuwe naam beschikbaar en duurzaam

    Vervolgens hernoemt de editor het tijdelijke bestand over settings.json. De vervanging binnen hetzelfde bestandssysteem is atomair: de naam bereikt het oude of het nieuwe bestand, zonder periode waarin de naam ontbreekt. Ten slotte synchroniseert de editor de bovenliggende directory. Die laatste stap maakt de naamswijziging duurzaam, omdat de directoryvermelding bij de directory hoort en niet bij het bestand.

  10. 10
    UitdagingVind de ontbrekende stap voor duurzaamheid

    Een programma schrijft en synchroniseert een nieuw bestand, hernoemt het over het doel en meldt direct dat het duurzaam is opgeslagen. Welke bewerking is nog nodig?

    ---reveal---

    Synchroniseer de bovenliggende directory en controleer of dat lukt. Bestandssynchronisatie beschermt de inhoud van de vervanging, terwijl directorysynchronisatie de gewijzigde naam beschermt. Alleen atomair hernoemen zorgt er niet voor dat de hernoeming een crash overleeft.

  11. 11
    VoorbeeldVoeg een tweede naam toe

    Het commando ln draft saved maakt een harde koppeling. Beide namen verwijzen naar één inode en het aantal harde koppelingen van het gewone bestand wordt 2. Na het verwijderen van draft blijft saved bruikbaar met aantal 1. De inhoud is niet gekopieerd: de bewerking voegde een directoryvermelding toe. Een symbolische koppeling zou daarentegen een eigen object zijn dat een te volgen pad opslaat.

  12. 12
    UitdagingVerwijder alle namen van een geopend bestand

    Een proces heeft saved open. Een ander proces verwijdert de laatste harde koppeling. Kan het eerste proces het bestand nog lezen en wanneer kan de opslagruimte worden vrijgemaakt?

    ---reveal---

    De open descriptor blijft bruikbaar. Vrijmaken wacht totdat er geen namen en geen open verwijzingen meer zijn. Het aantal harde koppelingen registreert namen, dus beëindigt een aantal van nul op zichzelf een bestaande open verwijzing niet.

  13. 13
    KernpuntEen pad is geen objectverwijzing

    Een symbolische koppeling bewaart een doelpad, dus kan het verwijderen of hernoemen van het doel de koppeling verbreken. Een harde koppeling duidt rechtstreeks de inode aan en blijft bestaan als de andere namen worden verwijderd. Symbolische koppelingen kunnen over bestandssystemen heen verwijzen omdat paden over koppelpunten heen kunnen lopen; harde koppelingen kunnen dat niet, omdat inodenummers binnen één bestandssysteem betekenis hebben.

  14. 14
    VoorbeeldOntcijfer toegangsrechten

    De rechtenreeks rw-r----- bestaat uit eigenaar rw-, groep r-- en anderen ---. Met lezen = 4, schrijven = 2 en uitvoeren = 1 zijn de cijfers 6, 4 en 0. Dus stelt chmod 640 report lezen en schrijven voor de eigenaar, lezen voor de groep en geen rechten voor anderen in. De drie cijfers beschrijven afzonderlijke gebruikersklassen, niet één gedeelde som.

  15. 15
    UitdagingBereik een bekende bestandsnaam

    Een gebruiker heeft uitvoerrecht maar geen leesrecht op /srv/data en de toegangsrechten van het bestand staan lezen van /srv/data/plan toe. Kan de gebruiker het bekende pad openen en de inhoud van de directory weergeven?

    ---reveal---

    De gebruiker kan het bekende pad openen omdat uitvoerrecht het doorzoeken van de directory toestaat. Voor het weergeven van de inhoud is leesrecht op de directory nodig, dus dat mislukt. De bestandsrechten worden ook gecontroleerd; alleen de directory mogen doorzoeken geeft geen toegang tot elk bestand erin.

  16. 16
    TipLees ctime correct

    Na chmod verandert ctime omdat de status van de inode is gewijzigd. Het is geen aanmaaktijdstempel. mtime registreert wijzigingen van de bestandsinhoud; atime registreert toegang, vaak met uitgestelde updates. Door deze betekenissen te onderscheiden kun je de uitvoer van stat interpreteren zonder te concluderen dat een wijziging van toegangsrechten een nieuw bestand heeft aangemaakt of de bytes heeft herschreven.

  17. 17
    VerbandVoeg bomen samen zonder identiteiten samen te voegen

    Aankoppelen verbindt de hoofddirectory van een ander bestandssysteem aan een directory zoals /media/usb, waarbij de eerdere inhoud van die directory verborgen is zolang de koppeling actief is. De laag van het virtuele bestandssysteem geeft beide bomen gemeenschappelijke aanroepen. Die voegt hun inodetabellen niet samen: inode 25 op het ene bestandssysteem kan niets te maken hebben met inode 25 op het andere.

  18. 18
    UitdagingVervang een bestand via een tweede naam

    Een programma houdt het oude bestand open via de harde koppeling backup. Een editor maakt een volledig nieuw bestand beschikbaar door een tijdelijk bestand over current te hernoemen en synchroniseert daarna de directory. Welke inhoud bereikt de oude descriptor en welke bereikt een nieuwe opening van current?

    ---reveal---

    De descriptor en backup bereiken nog steeds de oude inode. Een nieuwe opening van current bereikt de vervangende inode. Hernoemen verandert een directoryvermelding zonder bestaande open verwijzingen naar een ander doel te laten wijzen; synchronisatie maakt die naamswisseling duurzaam.

  19. 19
    SamenvattingGebruik het juiste toestandsmodel

    Volg gewone leesposities via vermeldingen voor geopende bestanden en namen via directory's en inodes. Rond voor duurzame vervanging het tijdelijke bestand af, synchroniseer het, hernoem het en synchroniseer daarna de directory. Onderzoek bij problemen met toegang of verwijderen zowel de relevante directoryrechten en open verwijzingen als de eigen metadata van het bestand.

2

Vind bytes op schijf en tel het werk

17 stappen
Zoek inodes en gegevensblokken en volg daarna een pad zonder cache en met cache.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieVertaal namen naar blokken
  2. 2
    VoorbeeldBouw de partitie-indeling
  3. 3
    UitdagingTel inodeplaatsen
  4. 4
    VoorbeeldBereken een absoluut inodeadres
  5. 5
    VoorbeeldSelecteer bytes binnen het omvattende blok
  6. 6
    KernpuntHoud de bestandsnaam buiten de inode
  7. 7
    VoorbeeldZoek een logisch gegevensblok
  8. 8
    UitlegBreid de pointerboom uit
  9. 9
    VoorbeeldWijs het eerste deel van een groot bestand toe
  10. 10
    UitdagingVoltooi de telling van pointerblokken
  11. 11
    VerbandBeschrijf een reeks in plaats van elk adres
  12. 12
    VoorbeeldDoorloop een pad zonder cache
  13. 13
    UitdagingPas het leesmodel toe
  14. 14
    TipTel elke gewijzigde structuur
  15. 15
    KernpuntLaat geheugen apparaatwerk wegnemen
  16. 16
    UitdagingHerhaal een opzoekactie nadat de gegevens zijn gecachet
  17. 17
    SamenvattingOnderscheid drie vertalingen
3

Plaats verwante bestanden en bepaal hun overdrachtsgrootte

13 stappen
Gebruik de lokaliteitsregels van FFS en leid de benodigde deelgrootte voor een gewenste bandbreedte af.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieBesteed tijd aan het overdragen van bruikbare bytes
  2. 2
    UitlegOnderzoek ver verwijderde metadata en kleine overdrachten
  3. 3
    AnalogieHoud een werkverzameling bij elkaar
  4. 4
    VoorbeeldPlaats lokale bronnen in elke groep
  5. 5
    UitdagingLeg uit wat groeperen verandert
  6. 6
    VoorbeeldPlaats de bestanden van een directory
  7. 7
    KernpuntLaat ruimte voor naburige bestanden
  8. 8
    VoorbeeldMeet de overhead
  9. 9
    VoorbeeldBereken de grootte voor een doel van 90%
  10. 10
    UitdagingVoorspel de deelgrootte voor een snellere schijf
  11. 11
    TipStem toewijzing ook op kleine bestanden af
  12. 12
    UitdagingHoud ruimte voor bestanden die samen worden aangemaakt
  13. 13
    SamenvattingWeeg lokaliteit, ruimte en overdrachtsgrootte af
4

Volg een toevoeging door een crash en herstel

18 stappen
Vergelijk gedeeltelijke schrijfbewerkingen, herstel door een controleprogramma, journaalvastlegging en herstel van geordende metadata.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieHerstel één volledige wijziging
  2. 2
    VoorbeeldBenoem de drie gewijzigde blokken
  3. 3
    UitdagingClassificeer een toewijzing zonder pointer
  4. 4
    VoorbeeldVind verborgen ongeldige inhoud
  5. 5
    KernpuntOnderscheid drie soorten fouten
  6. 6
    UitlegReconstrueer eigenaarschap met fsck
  7. 7
    UitdagingBeoordeel een foutloze controle
  8. 8
    VerbandHerstel namen zonder ze te verzinnen
  9. 9
    VoorbeeldSchrijf eerst de inhoud voor opnieuw uitvoeren
  10. 10
    VoorbeeldLeg de volledige transactie vast
  11. 11
    UitdagingHerstel na gedeeltelijke overbrenging
  12. 12
    TipControleer vastlegging en duurzaamheid afzonderlijk
  13. 13
    VoorbeeldVoorkom dat gegevens twee keer worden geschreven
  14. 14
    UitdagingHerken de ontbrekende volgorderegel
  15. 15
    VoorbeeldBescherm een hergebruikt blok tegen oude herhaling
  16. 16
    VerbandMaak in plaats daarvan een nieuwe boom beschikbaar
  17. 17
    UitdagingHerstel structuur zonder de bedoeling te herstellen
  18. 18
    SamenvattingVraag wat herstel kan bewijzen
5

Schrijf, vind en ruim een verplaatsend logboek op

15 stappen
Volg een LFS-wijziging via de vertaaltabel, controle op nog gebruikte blokken en herstel na een crash.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieHoud identiteit stabiel terwijl locaties veranderen
  2. 2
    VerbandMaak van veel korte wijzigingen één overdracht
  3. 3
    VoorbeeldSchrijf een nieuwe versie
  4. 4
    UitlegWerk de inodevertaaltabel bij
  5. 5
    UitdagingControleer de bovenliggende directory
  6. 6
    VoorbeeldVind de vertaaltabel na het aankoppelen
  7. 7
    VoorbeeldBepaal de grootte van een sequentieel segment
  8. 8
    KernpuntGa niet uit van sequentieel lezen
  9. 9
    VoorbeeldControleer of het oude blok nog wordt gebruikt
  10. 10
    UitdagingBereken de teruggewonnen ruimte
  11. 11
    TipVoorkom het kopiëren van gegevens die snel ongebruikt raken
  12. 12
    VoorbeeldKies een volledig checkpoint
  13. 13
    UitdagingHerstel werk van na het checkpoint
  14. 14
    UitdagingHerstel de vertaaltabel voordat je controleert of blokken nog worden gebruikt
  15. 15
    SamenvattingBetaal voor sequentiële wijzigingen met vertaling en opruimen
6

Herhaal verzoeken en voorspel de zichtbaarheid van gedeelde bestanden

16 stappen
Vergelijk herstel na storingen bij NFS met tijdlijnen voor het delen via de caches van NFS en AFS.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieGa om met onzekerheid tussen machines
  2. 2
    VoorbeeldStel een zelfstandig leesverzoek samen
  3. 3
    KernpuntToestandsloos betekent niet zonder opslag
  4. 4
    UitdagingHerhaal een WRITE na een verloren antwoord
  5. 5
    TipHerken een herhaling die het antwoord verandert
  6. 6
    VoorbeeldMaak de bevestiging duurzaam
  7. 7
    VerbandHoud protocolversies apart
  8. 8
    VoorbeeldDeel gegevens bij opnieuw openen in NFS
  9. 9
    UitdagingVerklaar een leesbewerking uit een oude cache
  10. 10
    AnalogieVervang herhaalde controles door een belofte
  11. 11
    VoorbeeldBehoud de kopie van een bestaande AFS-sessie
  12. 12
    UitdagingVoorspel het resultaat van twee schrijvers
  13. 13
    KernpuntHoud na een crash rekening met wijzigingsmeldingsbeloften
  14. 14
    VerbandKies de overdrachtsgranulariteit voor de werklast
  15. 15
    UitdagingOnderscheid veilig herhalen van veilig samen wijzigen
  16. 16
    SamenvattingStel twee afzonderlijke netwerkvragen

Bestandssystemen: oefenvragen

60 Oefenvragen in 6 sets

Set 1: Descriptoren, namen en duurzaam opslaan10 Oefenvragen

Vraag 1 van 10

Een leesbewerking van een gewoon bestand vraagt 120 bytes en geeft 45 terug. Als de beginpositie 30 is, waar begint de volgende gewone leesbewerking?
  1. Positie 75
  2. Positie 120
  3. Positie 150
  4. Positie 45
Toon antwoordVerberg antwoord
Antwoord: A
De positie schuift op met de 45 daadwerkelijk teruggegeven bytes, van 30 naar 75. Naar 150 gaan zou het gevraagde aantal van 120 gebruiken, maar een verzoek is slechts een bovengrens voor het aantal gelezen bytes. Een geslaagde leesbewerking die minder teruggeeft, schuift nog steeds op met het werkelijke aantal.

Vraag 2 van 10

Een proces opent hetzelfde bestand afzonderlijk als a en b en leest daarna 24 bytes via a. Wat is de positie van b vóór de eerste leesbewerking via die descriptor?
  1. 24, omdat de inode wordt gedeeld
  2. 0, omdat de eerste leesbewerking beide vermeldingen terugzet
  3. 24, omdat alle descriptoren posities delen
  4. 0, omdat de openingen afzonderlijke vermeldingen hebben
Toon antwoordVerberg antwoord
Antwoord: D
Elke afzonderlijke opening maakt een eigen vermelding voor een geopend bestand en dus een eigen positie, aanvankelijk nul. Een inode delen betekent niet dat ook een vermelding wordt gedeeld. De leesbewerking via a verplaatst alleen de positie van a; met dup gemaakte descriptoren zouden daarentegen een positie delen.

Vraag 3 van 10

Een bestand heeft minstens 200 bytes. Een proces opent het als a, maakt b = dup(a) en opent het afzonderlijk als c. Na fork verplaatst het kindproces b naar 70. Het ouderproces leest 12 bytes via a en roept daarna pread(c, buf, 9, 100) aan. Wat zijn de uiteindelijke posities van a, b en c?
  1. 82, 82, 0
  2. 82, 82, 109
  3. 12, 70, 0
  4. 82, 70, 109
Toon antwoordVerberg antwoord
Antwoord: A
a en b delen ook na de fork een vermelding, dus stelt de positiewijziging van het kindproces hun positie in op 70 en schuift de leesbewerking van het ouderproces die op naar 82. De afzonderlijke opening c begint op nul en pread laat die positie daar staan. c naar 109 opschuiven zou I/O met een expliciete positie verwarren met een gewone read.

Vraag 4 van 10

Een programma heeft een volledig bestaand bestand met succes geschreven. Welke aanroep wacht rechtstreeks tot de gewijzigde gegevens en metadata van dat bestand de opslag bereiken?
  1. close(fd)
  2. fstat(fd, &buf)
  3. lseek(fd, 0, SEEK_SET)
  4. fsync(fd)
Toon antwoordVerberg antwoord
Antwoord: D
fsync wacht tot de gewijzigde gegevens en metadata van het bestand volgens het apparaat de opslag bereiken. close geeft de descriptor vrij en kan schrijfbewerkingen gebufferd achterlaten. Metadata lezen of de positie veranderen vraagt niet om deze duurzaamheidsgrens.

Vraag 5 van 10

Een editor schrijft een volledige tijdelijke vervanging in de directory van het doel en synchroniseert die met succes. Welke volgorde voltooit een duurzame vervanging?
  1. Sluit het tijdelijke bestand en hernoem het daarna
  2. Hernoem het bestand en synchroniseer daarna de directory
  3. Kort het doelbestand in en hernoem daarna het tijdelijke bestand
  4. Synchroniseer de directory en hernoem daarna het bestand
Toon antwoordVerberg antwoord
Antwoord: B
Hernoemen maakt de volledige vervanging atomair beschikbaar en de directory synchroniseren maakt die naamswijziging duurzaam. De directory vóór het hernoemen synchroniseren kan geen wijziging duurzaam maken die nog niet heeft plaatsgevonden. Alleen het tijdelijke bestand sluiten maakt de latere directorywijziging niet duurzaam.

Vraag 6 van 10

In een nieuw leeg bestand wordt de positie naar 12.288 verplaatst en daar wordt één byte geschreven. Wat zijn de logische grootte en de inhoud van de voorafgaande tussenruimte?
  1. 1 byte; de tussenruimte ligt buiten het bestand
  2. 12.289 bytes; de tussenruimte bevat oude schijfbytes
  3. 12.289 bytes; de tussenruimte wordt als nullen gelezen
  4. 12.288 bytes; de tussenruimte wordt als nullen gelezen
Toon antwoordVerberg antwoord
Antwoord: C
De byte op positie 12.288 verlengt het bestand tot en met die positie, wat lengte 12.289 geeft. Ongeschreven bytes binnen het verlengde gebied worden als nullen gelezen en een dunbezette weergave kan voorkomen dat blokken voor de tussenruimte worden toegewezen. Alleen de geschreven byte tellen verwart toegewezen gegevens met de logische bestandslengte.

Vraag 7 van 10

Twee namen, red en blue, zijn harde koppelingen naar één gesloten gewoon bestand. Wat gebeurt er met blue nadat red is verwijderd?
  1. Die blijft bruikbaar met 2 harde koppelingen
  2. Die blijft bruikbaar met 1 harde koppeling
  3. Die verdwijnt samen met de gedeelde inode
  4. Die wordt een verbroken symbolische koppeling
Toon antwoordVerberg antwoord
Antwoord: B
Het verwijderen van de koppeling verwijdert alleen de naam red en verlaagt het aantal harde koppelingen van de gedeelde inode van 2 naar 1. blue blijft een gelijkwaardige naam voor die inode en bereikt nog steeds de inhoud. De naam als verbroken beschouwen zou het padgedrag van een symbolische koppeling op een harde koppeling toepassen.

Vraag 8 van 10

Een gewoon bestand heeft één naam en een open descriptor. Een ander proces verwijdert de naam. Wanneer kan het bestandssysteem de inode en gegevens vrijmaken?
  1. Wanneer het proces de descriptor opnieuw verplaatst
  2. Nadat de resterende open verwijzingen eindigen
  3. Nadat een latere directoryweergave is voltooid
  4. Direct wanneer de laatste naam verdwijnt
Toon antwoordVerberg antwoord
Antwoord: B
Het verwijderen van de laatste koppeling brengt het aantal harde koppelingen op nul, maar de open descriptor houdt het object nog bereikbaar. Vrijmaken wacht op zowel nul koppelingen als geen open verwijzingen. De naam direct uit de directory verwijderen gaat samen met het behoud van het naamloze bestand voor de huidige gebruiker.

Vraag 9 van 10

Een gebruiker kan /srv/team doorzoeken maar de namen erin niet weergeven. De gebruiker kent /srv/team/brief en de toegangsrechten van dat bestand staan lezen toe. Welke toegang is mogelijk?
  1. Zowel weergeven als openen slaagt
  2. Weergeven slaagt, maar openen mislukt
  3. Openen slaagt, maar weergeven mislukt
  4. Zowel weergeven als openen mislukt
Toon antwoordVerberg antwoord
Antwoord: C
Uitvoerrecht op de directory staat het doorzoeken van een bekend pad toe, terwijl leesrecht op de directory het weergeven van namen toestaat. Het bekende leesbare bestand kan dus worden geopend, ook al kan de inhoud van de directory niet worden weergegeven. Leesrecht op het bestand alleen zou een ontbrekend recht om de directory te doorzoeken niet omzeilen, maar dat recht is hier aanwezig.

Vraag 10 van 10

Een schijf wordt aangekoppeld op een directory die al bestanden bevat. Wat gebeurt er met die eerdere bestanden zolang de koppeling actief is?
  1. Ze worden naar het aangekoppelde bestandssysteem gekopieerd
  2. Ze worden tijdens het aankoppelen verwijderd
  3. Ze worden met de aangekoppelde hoofddirectory samengevoegd
  4. Ze worden door de aangekoppelde hoofddirectory verborgen
Toon antwoordVerberg antwoord
Antwoord: D
Aankoppelen maakt de hoofddirectory van het andere bestandssysteem zichtbaar op het koppelpunt en verbergt de eerdere inhoud van de directory. Het voegt de vermeldingen van de twee directory's niet samen en verwijdert de verborgen bestanden niet. Eén padboom biedt een gemeenschappelijke route naar objecten zonder de onderliggende bestandssystemen samen te voegen.
Set 2: Breng inodes, gegevensblokken en apparaatwerk in kaart10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een bestandssysteem wijst een inode toe voor een leeg gewoon bestand. Welke bitmap registreert die toewijzing?
  1. De inodebitmap
  2. De gegevensbitmap
  3. De extentbitmap
  4. De directorybitmap
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een inodetabel begint bij schijfblok 4. Blokken zijn 4 KiB en inodes zijn 256 bytes, genummerd vanaf nul. Op welk absoluut byteadres begint inode 23?
  1. 22272
  2. 5888
  3. 16384
  4. 22528
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een partitie heeft 100 blokken. Het superblok gebruikt er 1, de twee bitmaps gebruiken er 2 en de inodetabel gebruikt er 8. Hoeveel blokken blijven over in het gegevensgebied?
  1. 97 blokken
  2. 89 blokken
  3. 92 blokken
  4. 91 blokken
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een indirect blok van 4 KiB bewaart adressen van 8 bytes. Hoeveel adressen passen erin?
  1. 2.048 adressen
  2. 512 adressen
  3. 4.096 adressen
  4. 1.024 adressen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Waar ligt bytepositie 6.500 bij blokken van 2 KiB in de logische blokindeling van het bestand?
  1. Blok 3, bytepositie 1.500
  2. Blok 2, bytepositie 2.404
  3. Blok 4, bytepositie 356
  4. Blok 3, bytepositie 356
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een inode heeft 6 directe pointers, één enkelvoudig indirecte pointer en één dubbelindirecte pointer. Blokken zijn 1 KiB en pointers zijn 4 bytes. Een niet-dunbezet bestand bezet 400 gegevensblokken. Hoeveel pointerblokken buiten de inode zijn nodig?
  1. 2 pointerblokken
  2. 5 pointerblokken
  3. 3 pointerblokken
  4. 4 pointerblokken
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een bestand bestaat uit drie afzonderlijke aaneengesloten reeksen van 40, 15 en 25 blokken. Wat is het minimale aantal extentrecords dat die reeksen beschrijft?
  1. 80 records
  2. 1 record
  3. 3 records
  4. 2 records
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Hoeveel leesbewerkingen van inode- of directoryblokken zijn in een model met een lege cache en directory's van één blok nodig om /lab/raw/data te vinden voordat de inhoud wordt gelezen?
  1. 7 leesbewerkingen
  2. 5 leesbewerkingen
  3. 8 leesbewerkingen
  4. 6 leesbewerkingen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een bestand gebruikt alleen directe gegevenspointers. In een eenvoudig model met een lege cache bezet elke directory één blok. Na het openen van /lab/raw/data leest het programma drie gegevensblokken; bij elke bloktoegang leest het de inode opnieuw en schrijft het atime. Sluiten heeft geen I/O. Wat is het totaal?
  1. 13 I/O-bewerkingen
  2. 19 I/O-bewerkingen
  3. 10 I/O-bewerkingen
  4. 16 I/O-bewerkingen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Bij het aanmaken van twee bestanden wordt hetzelfde inodebitmapblok gewijzigd voordat het wordt weggeschreven. Hoe kan buffering het verkeer voor dat blok verminderen?
  1. Door geen van beide inodes op schijf te reserveren
  2. Door toewijzingsbits te vervangen door inodepointers
  3. Door beide wijzigingen later samen te schrijven
  4. Door de bitmap in beide nieuwe bestanden op te slaan
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 3: Lokaliteit, doorvoer en gedeeltelijke wijzigingen10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Welke schijfoverhead vermindert vooral als de inode van een bestand dicht bij de gegevens wordt geplaatst?
  1. Aantallen directorykoppelingen
  2. Opslagruimte voor pointers
  3. Zoek- en rotatievertraging
  4. Controles van bestandsrechten
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een harde schijf heeft een hoge sequentiële overdrachtssnelheid, maar een bestandssysteem geeft zeer kleine, verspreide leesverzoeken uit. Waarom kan de doorvoer laag blijven?
  1. Verspreide blokken vereisen grotere bestandsposities
  2. De directorydiepte bepaalt elke zoekbeweging naar gegevensblokken
  3. Kleine leesbewerkingen verlagen de maximale schijfbandbreedte
  4. Positionering overheerst de korte overdrachten
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

De groep van een directory heeft ruim voldoende plaats. Waar plaatst FFS normaal de inode en gegevens van een nieuw aangemaakt gewoon bestand?
  1. Samen in de minst gebruikte groep op afstand
  2. Samen in de groep van de bovenliggende directory
  3. In afzonderlijke groepen om al het verkeer te spreiden
  4. Met de inode alleen in een globale tabel
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Waarom gebruikt FFS deelblokken voor kleine bestanden?
  1. Om alle schrijfbewerkingen voor metadata te vermijden
  2. Om de gegevenspointers uit de inode te verwijderen
  3. Om elk bestand over groepen te verspreiden
  4. Om ongebruikte ruimte in grote blokken te verminderen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een schijf haalt maximaal 120 MB/s. Een deel van 3 MB kost 35 ms inclusief positionering en overdracht. Welke deelgrootte bereikt 90% van het maximum als de positioneringstijd gelijk blijft?
  1. 3,78 MB
  2. 10,8 MB
  3. 12 MB
  4. 37,8 MB
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een allocator zoals die van FFS moet bij een projectdirectory ruimte laten voor kleine bestanden in dezelfde directory en tegelijk een groot streamingbestand opslaan. Andere groepen hebben ruim voldoende plaats. De schijf haalt maximaal 160 MB/s en positionering duurt 5 ms. Hoe moeten latere delen van het grote bestand worden geplaatst en hoe groot moeten ze zijn om 90% van het maximum te bereiken?
  1. Gebruik delen van 7,2 MB alleen in de eigen groep
  2. Gebruik delen van 0,8 MB alleen in de eigen groep
  3. Gebruik delen van 7,2 MB in andere groepen
  4. Gebruik delen van 0,8 MB in andere groepen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Na een toevoeging bereiken de nieuwe gegevens en inode de schijf, maar de toewijzingsbitmap niet. Wat is het belangrijkste structurele risico?
  1. Hetzelfde blok kan opnieuw worden toegewezen
  2. Het blok is gereserveerd zonder eigenaar
  3. De inode heeft alle directorynamen verloren
  4. De nieuwe gegevens zijn onbereikbaar vanuit het bestand
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Alleen het nieuwe gegevensblok van een toevoeging bereikt de schijf. De wijzigingen van zowel de inode als de bitmap gaan verloren. Hoe wordt de resulterende toestand geclassificeerd?
  1. Inconsistent, met twee eigenaren van het blok
  2. Vastgelegd, met een verouderde bestandslengte
  3. Een lek, met een toegewezen blok zonder eigenaar
  4. Consistent, zonder de toevoeging
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een crash laat een blok achter dat als toegewezen is gemarkeerd maar waarnaar niet wordt verwezen. De inode van een tweede bestand verwijst naar een ander blok dat nog als vrij is gemarkeerd. Welke wijzigingen in de toewijzingsbits brengen deze twee gevallen bij herstel in overeenstemming?
  1. Wis het eerste bit en zet het tweede
  2. Zet beide bits en behoud alle pointers
  3. Wis beide bits en behoud alle pointers
  4. Zet het eerste bit en wis het tweede
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

De wijzigingen van de inode en bitmap bij een toevoeging blijven behouden, maar de gegevens niet. Waarom kan het bestand een structurele controle doorstaan terwijl het verkeerde bytes bevat?
  1. Bitmaps reconstrueren de ontbrekende bytes
  2. De inode beschrijft de gegevens niet langer
  3. Het eigenaarschap klopt, hoewel de inhoud verouderd is
  4. De controle vergelijkt alleen bestandsnamen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 4: Controleer, leg vast en pas veilig opnieuw toe10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een geldige inode claimt blok 85, maar de bitmap markeert blok 85 als vrij. Welke correctie van de bitmap past bij het eigenaarschap?
  1. Behoud de afwijking voorlopig
  2. Wis de pointer van de inode
  3. Markeer blok 85 als toegewezen
  4. Geef blok 85 bij het checkpoint vrij
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een toegewezen inode bevat geldige pointers en gegevens, maar heeft geen naam die vanuit de hoofddirectory bereikbaar is. Hoe kan fsck de toegang ertoe behouden?
  1. Maak een bereikbare vermelding in lost+found
  2. Laat de inode ongekoppeld en verander het aantal harde koppelingen
  3. Behoud de inode alleen door een reservekopie te herstellen
  4. Geef de toegewezen blokken vrij zonder een naam toe te voegen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

De inhoud van een transactie in een eenvoudig gegevensjournaal is volledig duurzaam opgeslagen, maar het vastleggingsrecord TxE heeft de opslag nooit bereikt. Wat doet herstel na een crash met de transactie?
  1. Pas alleen de inode- en bitmapinhoud toe
  2. Pas de transactie toe omdat de inhoud volledig lijkt
  3. Negeer de transactie omdat vastlegging ontbreekt
  4. Beschouw de inhoud als al overgebracht naar de definitieve locatie
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een transactie is vastgelegd en vóór een crash heeft de helft van de blokinhoud de definitieve locaties bereikt. Waarom kan herstel alle blokinhoud opnieuw toepassen?
  1. Het verwijdert eerst alle al geschreven gegevens
  2. Identieke blokvervanging kan worden herhaald
  3. Vastlegging maakt definitief schrijven overbodig
  4. Overbrengen wijzigt alleen directorynamen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een bestand heeft aanvankelijk twee gegevensblokken. Transactie T1 in een gegevensjournaal voegt blokken 80 en 81 toe en wordt vastgelegd. T2 voegt blok 82 toe in de journaalinhoud, maar heeft geen vastleggingsrecord. Een crash treedt op nadat alleen de inode-inhoud van T1 naar de definitieve locatie is overgebracht. Wat zijn na herstel de bestandslengte en toewijzingstoestanden van blokken 80–82?
  1. Vijf blokken lang; 80, 81 en 82 toegewezen
  2. Vier blokken lang; 80, 81 en 82 toegewezen
  3. Twee blokken lang; 80, 81 en 82 vrij
  4. Vier blokken lang; 80 en 81 toegewezen, 82 vrij
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een journaal begint weer vooraan terwijl een vastgelegde transactie pas gedeeltelijk naar de definitieve locaties is overgebracht. De voorgestelde implementatie gebruikt de ruimte van die transactie direct opnieuw omdat TxE duurzaam is opgeslagen. Welke fout kan dit veroorzaken?
  1. De transactie wordt ondanks TxE niet-vastgelegd
  2. Herstel voegt elke geregistreerde wijziging een tweede keer toe
  3. Herstel moet het hele bestandssysteem overbrengen
  4. Een crash kan de enige kopieën wissen die nodig zijn voor voltooiing
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Bij geordende metadataregistratie in een journaal lopen gegevensschrijfbewerkingen en schrijfbewerkingen van journaalmetadata parallel. Wat moet voltooid zijn voordat TxE duurzaam wordt opgeslagen?
  1. Zowel het schrijven van gegevens als van journaalmetadata
  2. Alleen het schrijven van gegevens naar de definitieve locatie
  3. Het overbrengen van metadata naar definitieve locaties
  4. Alleen het schrijven van de journaalmetadata
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

De vastgelegde transactie T10 registreert blok 70 als directorymetadata. De vastgelegde transactie T11 trekt blok 70 na verwijdering in. De vastgelegde transactie T12 registreert later nieuwe metadata-inhoud voor blok 70. Wat gebeurt er tijdens herstel met die blokinhoud?
  1. Pas T10 opnieuw toe en sla T12 over
  2. Sla zowel T10 als T12 over
  3. Sla T10 over en pas T12 opnieuw toe
  4. Pas zowel T10 als T12 opnieuw toe
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een ext4-bestand wordt hersteld met consistente metadata maar verouderde inhoud, omdat de metadata zijn vastgelegd voordat de bijbehorende gegevens hun definitieve locatie bereikten. Welke gegevensmodus staat deze volgorde toe?
  1. data=writeback
  2. data=ordered
  3. Alle drie de modi evenzeer
  4. data=journal
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een ontwerp met soft updates schrijft eerst geïnitialiseerde gegevens en crasht daarna voordat de pointer beschikbaar wordt gemaakt. Een herstelactie maakt later ongebruikte toegewezen ruimte vrij. Welke afweging laat dit zien?
  1. Beschikbaar gemaakte pointers kunnen veilig ongeschreven gegevens aanduiden
  2. Veilige verwijzingen kunnen samengaan met een lek in de opslagruimte
  3. Elke schrijfbewerking van de toepassing was al duurzaam
  4. Alle controles van metadata worden overbodig
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 5: Verplaatsende logboeken en netwerkcaches10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een LFS-inode verplaatst na een wijziging naar een nieuw schijfadres. Welke structuur koppelt het stabiele nummer aan dat nieuwste adres?
  1. De inodevertaaltabel
  2. De directory
  3. De inodetabel
  4. De gegevensbitmap
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Waarom voorkomt het opslaan van stabiele inodenummers in LFS-directory's recursieve wijzigingen van bovenliggende directory's wanneer de inode van een bestand verplaatst?
  1. Alleen de imap heeft het gewijzigde adres nodig
  2. Directoryvermeldingen bevatten volledige inode-inhoud
  3. Oude en nieuwe inodeadressen blijven beide actueel
  4. Alle directory's blijven vastgezet in het geheugen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Het schrijven van een segment van 6 MB duurt 40 ms op een schijf met een maximum van 200 MB/s. Hoe groot moet een segment bij dezelfde positioneringsvertraging zijn om 95% van het maximum te bereiken?
  1. 114 MB
  2. 38 MB
  3. 19 MB
  4. 8 MB
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een segmentoverzicht kent adres 450 toe aan inode 9, logisch blok 3. De nieuwste inode 9 volgens de imap laat blok 3 naar adres 880 verwijzen. Is het oude blok op 450 nog in gebruik?
  1. Ja, omdat inode 9 nog bestaat
  2. Ja, omdat het overzicht de eigenaar noemt
  3. Nee, omdat de huidige pointer anders is
  4. Nee, omdat alle overgebrachte blokken ongebruikt zijn
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een segmentopruimer leest zes even grote segmenten, elk voor 50% nog in gebruik, en pakt hun nog gebruikte gegevens in nieuwe segmenten samen. Hoeveel segmenten aan vrije capaciteit worden gewonnen en hoeveel segmenten aan nog gebruikte gegevens worden geschreven, als je metadataoverhead buiten beschouwing laat?
  1. 3 gewonnen; 6 geschreven
  2. 6 gewonnen; 6 geschreven
  3. 6 gewonnen; 3 geschreven
  4. 3 gewonnen; 3 geschreven
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Checkpoint A heeft overeenkomstige tijdstempels 52. Checkpoint B heeft een header met 53 en een eindtijdstempel 51. Na het in A vastgelegde logboekeinde volgen geldige segmenten. Welk herstelplan behoudt het nieuwste herstelbare werk?
  1. Gebruik A en herstel daarna voorwaarts via geldige latere segmenten
  2. Gebruik A en verwerp daarna elk segment dat niet in de vertaaltabel staat
  3. Gebruik B en negeer daarna segmenten ouder dan de header
  4. Gebruik B en bouw daarna directory's opnieuw op uit inodetabelplaatsen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een client bewaart een NFS-handle voor een verwijderd bestand. Het inodenummer wordt opnieuw gebruikt voor een ander bestand op hetzelfde volume. Welk veld van de handle voorkomt toegang tot het vervangende bestand?
  1. De bestandspositie van de clientdescriptor
  2. Het generatiegetal van de inode
  3. Het aantal harde koppelingen van de directory
  4. De open bestandspositie van de server
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een client stuurt een NFSv2-WRITE op een expliciete positie. De server voltooit die duurzaam, crasht vóór het antwoord en start opnieuw op. Wat maakt het opnieuw versturen van dat verzoek voldoende in het basismodel voor herstel?
  1. De server herstelt de oude open bestandspositie van de client
  2. De herhaling voegt bytes toe na het opgeslagen resultaat
  3. De client leidt af dat het eerste verzoek nooit is uitgevoerd
  4. Het stabiele resultaat blijft behouden en herhalen is veilig
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Client A sluit een gewijzigd NFS-bestand voordat client B het opent onder consistentie tussen sluiten en opnieuw openen. Wat moet B bij de nieuwe opening zien?
  1. Alleen wijzigingen van vóór de oorspronkelijke opening door A
  2. De oude kopie tot alle attribuuttimers verlopen
  3. De wijzigingen van A na controle op actualiteit
  4. De oude kopie tot de server opnieuw opstart
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

AFS-clients A en B openen dezelfde versie. A wijzigt gebied X en sluit het bestand. B wijzigt gebied Y in de nog open kopie, sluit als laatste en daarna opent C het bestand. Welke versie ontvangt C?
  1. Het oorspronkelijke bestand totdat beide clients opnieuw openen
  2. Het bestand van A totdat de wijzigingsmeldingsbelofte van B verloopt
  3. De volledige versie van B, waarbij de wijziging van A verloren kan gaan
  4. Een samengevoegd bestand met de wijzigingen van beide clients
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 6: Onderzoek ontwerpen van bestandssystemen10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een hulpprogramma kopieert een bestand met succes naar een ander bestandssysteem en verwijdert daarna de bron. Biedt dat dezelfde garantie voor atomaire vervanging als hernoemen binnen één bestandssysteem?
  1. Nee, omdat kopiëren en verwijderen afzonderlijke bewerkingen zijn
  2. Ja, omdat verwijderen de kopie duurzaam maakt
  3. Ja, omdat beide bestanden dezelfde bytes hebben
  4. Nee, omdat voor elke verplaatsing harde koppelingen nodig zijn
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

one en two zijn harde koppelingen naar een bestand en shortcut is een symbolische koppeling met het pad one. Een proces opent two, waarna alle drie de namen worden verwijderd. Wat blijft er over voordat dat proces de descriptor sluit?
  1. Geen gegevens, omdat elk koppelingsobject verdwenen is
  2. Een naamloos open bestand met nul harde koppelingen
  3. Het bestand met één harde koppeling vanuit de descriptor
  4. Een werkende snelkoppeling die het doel bereikbaar houdt
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een inode heeft 8 directe pointers, een enkelvoudig indirecte pointer en een dubbelindirecte pointer. Blokken zijn 2 KiB en adressen zijn 8 bytes. Een niet-dunbezet bestand is 550 KiB lang. Hoeveel blokken bevatten in totaal de gegevens en externe pointerstructuren?
  1. 277 blokken
  2. 279 blokken
  3. 275 blokken
  4. 278 blokken
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een deel van 4 MB bereikt 80 MB/s op een schijf met een maximale snelheid van 100 MB/s. Welke deelgrootte bereikt 95% van het maximum bij ongewijzigde positioneringskosten?
  1. 7,6 MB
  2. 19 MB
  3. 9,5 MB
  4. 76 MB
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Welk record markeert bij eenvoudige gegevensregistratie in een journaal een transactie als vastgelegd nadat de inhoud duurzaam is opgeslagen?
  1. Alleen de toewijzingsbitmap
  2. De volgende directoryvermelding
  3. Het nieuwe inodenummer
  4. Het bijpassende TxE-record
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

T20 registreert blok 44 als directorymetadata. T21 verwijdert die directory, hergebruikt blok 44 voor gebruikersgegevens en legt een intrekking voor 44 vast. T22 registreert andere metadata-inhoud voor 44, maar wordt nooit vastgelegd. Een crash laat alle drie de journaalinhouden leesbaar achter. Wat mag herstel opnieuw toepassen op blok 44?
  1. De inhoud van T22, de nieuwste
  2. De inhoud van T20, de laatst vastgelegde
  3. De inhoud van T20 en daarna die van T22
  4. Noch de inhoud van T20, noch die van T22
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een kandidaat voor LFS-opruiming van drie segmenten bevat één segment aan nog gebruikte gegevens. Een andere bevat twee segmenten aan nog gebruikte gegevens verdeeld over drie segmenten. Welke levert bij gelijke segmentgrootte en zonder metadataoverhead meer vrije capaciteit per geschreven segment met nog gebruikte gegevens op?
  1. Beide: 1 gewonnen per 1 geschreven
  2. De tweede: 2 gewonnen per 1 geschreven
  3. De eerste: 2 gewonnen per 1 geschreven
  4. De eerste: 3 gewonnen per 1 geschreven
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een herontwerp van NFSv2 bevestigt een schrijfbewerking van een middelste blok vanuit vluchtig geheugen en crasht daarna. De client heeft al een succesmelding voor die schrijfbewerking ontvangen en herhaalt daarom alleen een latere niet-bevestigde schrijfbewerking met expliciete positie. Welke zwakte blijft bestaan?
  1. De bevestigde middelste wijziging kan ontbreken
  2. De inodegeneratie moet gelijk zijn aan de laatste positie
  3. De latere herhaling moet het middelste blok dupliceren
  4. Clientposities moeten op de server worden gereconstrueerd
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een client leest herhaaldelijk een bestand opnieuw dat groter is dan het geheugen. Een geldige AFS-kopie in de schijfcache blijft beschikbaar. Wat voorkomt herhaalde downloads via het netwerk?
  1. Onmiddellijke globale zichtbaarheid van elke schrijfbewerking
  2. Elke leesbewerking omzetten in een OPEN op de server
  3. De lokale schijfkopie van het volledige bestand hergebruiken
  4. Het mechanisme voor wijzigingsmeldingsbeloften van de server uitschakelen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een AFS-server maakt het gewijzigde bestand van A beschikbaar en trekt de wijzigingsmeldingsbelofte van B in. B heeft nog een oudere leessessie open. Daarna start de server opnieuw op en verliest de lijsten met wijzigingsmeldingsbeloften. Wat moet er gebeuren met de bestaande sessie van B en bij later hergebruik van de cache?
  1. Behoud de open kopie; detecteer de herstart en controleer opnieuw voor hergebruik
  2. Behoud de open kopie; vertrouw de wijzigingsmeldingsbeloften na een serverherstart
  3. Vervang de open sessie direct; vertrouw alle oude wijzigingsmeldingsbeloften
  4. Vervang de open sessie; haal pas op na herstart van de client
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Kom je niet uit je eigen opgave? Huiswerkhulp

Kernbegrippen

96 Kernbegrippen, elk met een definitie

A

aantal harde koppelingen
Het aantal harde koppelingen legt vast hoeveel directorynamen naar een inode verwijzen, met een speciale telling van puntvermeldingen voor klassieke Unix-directory's.
Twee harde koppelingen naar één gewoon bestand geven een aantal van 2, ongeacht hoeveel descriptoren open zijn.
absoluut pad
Een absoluut pad identificeert een object vanaf de hoofddirectory, in Unix-paden aangegeven met een schuine streep vooraan.
Het pad /srv/reports/today begint bij de hoofddirectory, ook wanneer de huidige directory van het proces /home/lee is.
amortisatie
Amortisatie spreidt vaste kosten over voldoende nuttig werk zodat die kosten een kleinere fractie van de totale tijd vormen.
Een overdracht van 9 MB bij 100 MB/s besteedt een veel kleiner deel van de totale tijd aan een zoekbeweging van 10 ms dan een overdracht van 1 MB.
Andrew File System
Het Andrew File System, of AFS, is een gedistribueerd ontwerp dat volledige bestanden op clients cacht en wijzigingsmeldingsbeloften van de server gebruikt om herhaald werk te verminderen.
Een geldige AFS-kopie in de schijfcache kan zonder nieuwe download opnieuw worden geopend, terwijl een ongeldig verklaarde kopie moet worden ververst.
atime
atime is het tijdstempel van de laatste toegang tot een bestand en registreert toegang tot de inhoud volgens het tijdstempelbeleid van het bestandssysteem.
Een leesbewerking kan atime bijwerken, hoewel het gebruikelijke relatime-beleid van Linux voorkomt dat dit na elke toegang wordt geschreven.
atomaire schrijfeenheid
Een atomaire schrijfeenheid is de hoeveelheid die een opslaginterface gegarandeerd volledig schrijft of bij onderbreking ongewijzigd laat.
Een journaalvastleggingsrecord moet binnen de door het apparaat ondersteunde atomaire eenheid passen voor het eenvoudige protocol met een alles-of-nietsmarkering.
atomaire vervanging
Een atomaire vervanging laat een doelnaam van een oud naar een nieuw bestand overschakelen zonder dat de naam tussendoor ontbreekt.
Een rename binnen hetzelfde bestandssysteem vervangt config, terwijl lezers óf het oude óf het nieuwe volledige bestand bereiken.
attributencache
Een attributencache bewaart bestandsmetadata tijdelijk zodat een client de server niet bij elke toegang om controle hoeft te vragen.
De standaardtimers voor attributen van gewone bestanden in Linux lopen van 3 tot 60 seconden, waardoor tussen controles verouderde gegevens kunnen worden gelezen.

B

bestandsdescriptor
Een bestandsdescriptor is een procesgebonden niet-negatief geheel getal dat verwijst naar een kernelvermelding voor een geopend bestand.
Nadat open 4 teruggeeft, geeft het programma 4 door aan read, write en close voor die open verwijzing.
bestandshandle
Een bestandshandle identificeert een object op afstand met informatie zoals het servervolume, inodenummer en de generatie.
Een client neemt de handle op in READ zodat de server het object kent zonder op een eerder OPEN-verzoek te vertrouwen.
bestandspositie
Een bestandspositie is de bytepositie in een vermelding voor een geopend bestand waar de volgende gewone lees- of schrijfbewerking begint.
Als een leesbewerking vanaf positie 80 het volledige gevraagde aantal van 32 bytes teruggeeft, komt de positie op 112 te staan.
bestandstoewijzingstabel
De bestandstoewijzingstabel, of FAT, bewaart koppelingen naar volgende bestandsblokken in een afzonderlijke tabel en vormt zo vanaf elk eerste blok een keten.
Om het twintigste blok van een bestand te vinden moet je de keten volgen, ook wanneer de tabel zelf in de cache staat.
blokgroep
Een blokgroep is een aaneengesloten bereik van logische schijfblokken met lokale toewijzingsstructuren, inodes en gegevensruimte.
Ext4 gebruikt blokgroepen om lokaliteit na te streven, ook al maakt de schijf de werkelijke geometrie niet zichtbaar.

C

cachen van volledige bestanden
Het cachen van volledige bestanden bewaart een volledig bestand op de client en handelt lokale lees- en schrijfbewerkingen af zolang die gecachete versie bruikbaar blijft.
AFS kan een geldig bestand in de schijfcache opnieuw openen zonder het opnieuw te downloaden, ook nadat het niet meer in het geheugen past.
cachetreffer
Een cachetreffer ontstaat wanneer gevraagde informatie al in de cache aanwezig is en kan worden gebruikt zonder die uit opslag op te halen.
Bij het openen van een naburig bestand kunnen directoryblokken worden hergebruikt die na het vorige doorlopen van een pad bewaard zijn.
checkpointgebied
Het checkpointgebied is een vaste LFS-locatie die adressen van de nieuwste imap-delen vastlegt zodat het verplaatsende logboek kan worden gevonden.
Bij het aankoppelen leest het systeem het checkpointgebied voordat het de inodevertaaltabel laadt en bestandsinodes vindt.
cilindergroep
Een cilindergroep is een FFS-gebied van aangrenzende schijfcilinders dat zijn inodes, bitmaps en gegevens fysiek dicht bij elkaar houdt.
Een klein bestand in de cilindergroep van de directory plaatsen verkort zoekbewegingen tussen de structuren die worden bijgewerkt.
circulair logboek
Een circulair logboek gebruikt een begrensd opslaggebied opnieuw door weer vooraan te beginnen en ruimte vrij te maken van records waarvan het herstelwerk voltooid is.
Wanneer een transactie naar de definitieve locaties is overgebracht, kan de journaalruimte ervan beschikbaar komen voor een latere transactie.
consistentie na een crash
Consistentie na een crash is de eis dat opgeslagen bestandssysteemstructuren na onderbroken wijzigingen naar een onderling overeenstemmende geldige toestand kunnen worden hersteld.
Een toevoeging mag geen inode achterlaten die eigenaar is van een blok dat de allocator nog beschikbaar acht voor een ander bestand.
consistentie tussen sluiten en opnieuw openen
Consistentie tussen sluiten en opnieuw openen maakt de doorgestuurde wijzigingen van een schrijver zichtbaar voor een latere opener, terwijl tijdens open sessies zwakkere zichtbaarheid is toegestaan.
Nadat client A een gewijzigd NFS-bestand sluit, opent client B het en controleert de cache voordat die de wijzigingen leest.
consistentiemodel waarin de laatst sluitende client wint
Het consistentiemodel waarin de laatst sluitende client wint lost gelijktijdige AFS-schrijfbewerkingen op door de als laatste sluitende client de volledige bestandsversie op de server te laten vervangen.
Twee clients die verschillende gebieden bewerken kunnen nog steeds één wijziging verliezen omdat sluiten een volledige lokale kopie beschikbaar maakt.
ctime
ctime is het tijdstempel van de statuswijziging van een inode, dat wordt bijgewerkt bij schrijfbewerkingen en wijzigingen van bijvoorbeeld toegangsrechten, eigenaar of koppelingen.
Het uitvoeren van chmod verandert ctime, hoewel de bytes en dus de wijzigingstijd van de inhoud ongewijzigd blijven.

D

deelblok
Een deelblok is een kleiner toewijzingsstuk dat FFS gebruikt om korte bestanden op te slaan zonder een heel groot bestandssysteemblok te verspillen.
Een kort bestand kan een stuk van 512 bytes bezetten voordat groei vereist dat de inhoud naar een volledig blok wordt gekopieerd.
directe pointer
Een directe pointer is een adres in een inode dat rechtstreeks naar één gegevensblok verwijst zonder afzonderlijk pointerblok.
De derde directe pointer vindt logisch bestandsblok 2 omdat de bloknummering bij nul begint.
directoryvermelding
Een directoryvermelding koppelt een naam aan een inodenummer, zodat een opzoekactie in de directory het genoemde object kan identificeren.
Een harde koppeling toevoegen maakt een extra directoryvermelding voor een bestaande inode zonder bestandsinhoud te kopiëren.
doorlopen van een pad
Het doorlopen van een pad lost een pad component voor component op en gebruikt directory-inhoud om telkens de volgende inode te vinden totdat het doel is bereikt.
Bij het openen van /team/result wordt eerst team in de hoofddirectory gevonden en daarna result in de directory team.
dubbele blokverwijzing
Een dubbele blokverwijzing is een verwijzing die tegenstrijdig eigenaarschap oplevert wanneer twee inodes hetzelfde gegevensblok claimen.
Een herstelactie kan elk bestand een eigen kopie geven zodat het wijzigen van het ene bestand niet ongemerkt de gegevens van het andere verandert.
dubbelindirecte pointer
Een dubbelindirecte pointer bereikt een blok met pointers naar indirecte blokken en voegt zo een tweede adresniveau vóór de gegevens toe.
Een bestand dat de directe en enkelvoudig indirecte capaciteit overschrijdt, wijst een dubbelindirect wortelblok en voldoende indirecte kindblokken toe.
dunbezet bestand
Een dunbezet bestand bevat logische gebieden gevuld met nullen die het bestandssysteem kan weergeven zonder gegevensblokken toe te wijzen.
Eén byte ver voorbij het einde schrijven kan een groot logisch bestand met weinig toegewezen opslag creëren.
duurzaamheid
Duurzaamheid is de eigenschap dat een bevestigde opgeslagen wijziging na een crash of stroomuitval beschikbaar blijft.
Een editor wacht op een geslaagde fsync voordat die meldt dat de nieuwe inhoud van een document duurzaam is opgeslagen.

E

extent
Een extent bestaat uit een beginschijfadres en een reekslengte die samen een aaneengesloten reeks blokken van een bestand beschrijven.
Een aaneengesloten bestand van 1.000 blokken kan één extent gebruiken in plaats van 1.000 afzonderlijke blokadressen op te slaan.

F

fragmentatie
Fragmentatie is de verspreiding van vrije ruimte of bestandsblokken over afzonderlijke gebieden, waardoor toegang meer werk vergt.
Een bestand kan opeenvolgende byteposities hebben maar herhaalde zoekbewegingen vereisen omdat de toegewezen blokken verspreid zijn.
fsck
fsck is een bestandssysteemcontrole die metadata doorzoekt en relaties tussen toewijzingen, pointers, inodes en directory's na beschadiging herstelt.
Het controleprogramma kan een bitmapbit zetten wanneer een geldige inode eigenaar is van het blok maar de bitmap ten onrechte zegt dat het vrij is.
fysieke logregistratie
Fysieke logregistratie legt volledige vervangende blokinhoud vast, zodat herstel een wijziging opnieuw kan uitvoeren door die inhoud naar vaste adressen te schrijven.
Inode-inhoud opnieuw toepassen schrijft dezelfde bytes opnieuw, ook als die inhoud vóór de crash al naar de definitieve locatie was overgebracht.

G

gedistribueerd bestandssysteem
Een gedistribueerd bestandssysteem laat clientmachines via een netwerk bestanden op servers gebruiken met vertrouwde bestandsbewerkingen.
De client vertaalt een read van een programma naar een verzoek dat een serverbestand en het gewenste bytebereik identificeert.
gegevensblok
Een gegevensblok is een toewijzingseenheid met bestandsinhoud of directoryvermeldingen, die via de opgeslagen locatiekoppeling van het object wordt bereikt.
Een gegevensblok van een directory bevat namen en inodenummers, terwijl een blok van een gewoon bestand de bytes daarvan bevat.
generatienummer
Een generatienummer onderscheidt opeenvolgende objecten die hetzelfde inodenummer krijgen en beschermt clients tegen verouderde identiteiten.
Inode 31 met een nieuwere generatie hergebruiken voorkomt dat een oude handle voor de verwijderde inode 31 het vervangende object aanduidt.
geordende journaalregistratie
Geordende journaalregistratie is metadataregistratie waarbij gegevens waarnaar wordt verwezen duurzaam op hun definitieve locatie worden opgeslagen voordat de metadata worden vastgelegd.
Een nieuw gegevensblok en journaalmetadata kunnen parallel worden geschreven, maar beide moeten vóór het vastleggingsrecord voltooid zijn.
gewijzigde buffer
Een gewijzigde buffer is een kopie van gegevens of metadata in het geheugen die is veranderd en nog naar opslag moet worden geschreven.
Meerdere bewerkingen kunnen één gewijzigd blok bijwerken voordat het bestandssysteem de uiteindelijke inhoud naar het apparaat stuurt.

H

harde koppeling
Een harde koppeling is een directorynaam die rechtstreeks naar een bestaande inode verwijst en gelijkwaardig is aan de andere namen daarvan.
Na ln draft copy laat het verwijderen van draft de naam copy naar hetzelfde bestand en de bestaande bytes verwijzen.

I

idempotentie
Idempotentie betekent dat een bewerking herhalen hetzelfde effect heeft als die één keer uitvoeren, waardoor geschikte verzoeken veilig opnieuw kunnen worden geprobeerd.
Een WRITE met expliciete positie herhalen slaat identieke bytes op dezelfde locatie op in plaats van ze opnieuw toe te voegen.
indirect blok
Een indirect blok bewaart een reeks blokadressen en vergroot daarmee de hoeveelheid gegevens die via één pointer in de inode bereikbaar is.
Een indirect blok van 4 KiB met adressen van 4 bytes kan 1.024 afzonderlijke gegevensblokken identificeren.
inode
Een inode is een Unix-achtig bestandssysteemrecord dat de metadata en gegevenslocaties van een object opslaat, maar niet de bestandsnaam.
Twee directorynamen kunnen inode 28 delen, zodat het bestand via een van beide namen wijzigen hetzelfde object bijwerkt.
inodetabel
Een inodetabel is een gebied met inoderecords van vaste grootte waarvan de posities uit hun inodenummers kunnen worden berekend.
Een tabel die begint op byte 16.384 plaatst inode 20 met een grootte van 256 bytes op absoluut byteadres 21.504.
inodevertaaltabel
De inodevertaaltabel, of imap, vertaalt elk stabiel inodenummer naar het schijfadres van de nieuwste versie in een LFS-logboek.
Een directory kan inodenummer 14 behouden, ook wanneer de nieuwste inode van adres 300 naar adres 900 verplaatst.
intrekkingsrecord
Een intrekkingsrecord vertelt herstel om verouderde geregistreerde inhoud van een blok uit transacties tot en met de intrekkende transactie niet opnieuw toe te passen.
Intrekking voorkomt dat oude directory-inhoud gebruikersgegevens overschrijft nadat hetzelfde schijfblok opnieuw is gebruikt.

J

journaal
Een journaal is een gereserveerd logboek op schijf met wijzigingsrecords, zodat vastgelegde wijzigingen na onderbroken schrijfbewerkingen kunnen worden hersteld.
Een crash tijdens het overbrengen naar definitieve locaties kan vanuit het journaal worden hersteld zonder elke inode in het bestandssysteem te doorzoeken.
journaalmodus met ongeordend terugschrijven
De journaalmodus met ongeordend terugschrijven registreert metadata zonder te vereisen dat bijbehorende gegevensblokken vóór vastlegging de definitieve opslag bereiken.
Na herstel met data=writeback kunnen metadata consistent zijn, ook wanneer een recent geschreven bestand verouderde bytes bevat.

K

kopiëren bij schrijven
Kopiëren bij schrijven plaatst gewijzigde blokken op nieuwe adressen en maakt een nieuwe wortel beschikbaar, waarbij de oude versie intact blijft tot de omschakeling.
Een crash vóór het beschikbaar maken laat de oude boom bereikbaar in plaats van een mengsel van wijzigingen op de bestaande plaats te tonen.
koppelpunt
Een koppelpunt is een bestaand directorypad waar de hoofddirectory van een ander bestandssysteem aan de zichtbare directoryboom wordt gekoppeld.
Een schijf aankoppelen op /media/usb verbergt de eerdere inhoud van die directory zolang de koppeling actief blijft.

L

lek in de opslagruimte
Een lek in de opslagruimte is toegewezen opslag die geen bereikbaar object als eigenaar gebruikt, waardoor capaciteit onbeschikbaar is zonder nuttige inhoud te bewaren.
Een bitmapwijziging zonder de nieuwe inodepointer kan een blok reserveren dat na herstel geen bestand kan bereiken.
loggestructureerd bestandssysteem
Een loggestructureerd bestandssysteem schrijft gebufferde gegevens en metadata sequentieel naar ongebruikte ruimte en vervangt oude versies via nieuwe locatiekoppelingen.
Eén bestandsblok wijzigen schrijft een nieuw blok en een nieuwe inode in plaats van hun eerdere schijflocaties te overschrijven.
logisch bestandsblok
Een logisch bestandsblok is een gedeelte van een bestand ter grootte van een blok dat wordt aangeduid met de positie binnen dat bestand, onafhankelijk van de schijflocatie.
Logische blokken 0 en 1 kunnen ver uit elkaar zijn opgeslagen, ook al volgen hun bytebereiken op elkaar.
logische logregistratie
Logische logregistratie legt een beschrijving van een wijzigingsbewerking vast in plaats van volledige vervangende inhoud van elk gewijzigd blok op te slaan.
Een compact bewerkingsrecord beschrijft een wijziging, terwijl een fysiek journaal de nieuwe blokbytes zelf bevat.
lokaliteit in de naamruimte
Lokaliteit in de naamruimte is de neiging om bestanden die dicht bij elkaar in de directoryboom staan, vooral binnen één directory, samen te gebruiken.
Een compiler die meerdere bronbestanden in één project opent, profiteert wanneer hun inodes en inhoud dicht bij elkaar liggen.

M

metadata
Metadata is informatie die een bestand beschrijft, zoals type, grootte, eigenaar, toegangsrechten, tijdstempels en gegevenslocaties.
fstat leest metadata via een descriptor zonder de bestandsinhoud als een metadatarecord te behandelen.
metadataregistratie in een journaal
Metadataregistratie in een journaal registreert wijzigingen van bestandssysteemstructuren, terwijl gewone bestandsgegevens rechtstreeks naar hun definitieve locaties worden geschreven.
Zowel de geordende modus als de modus met ongeordend terugschrijven registreert metadata, maar alleen de geordende modus schrijft gegevens verplicht vóór vastlegging.
momentopname
Een momentopname bewaart een beeld van een eerdere bestandssysteemtoestand door de oudere blokken en locatiekoppelingen te behouden die die versie bepalen.
Kopiëren bij schrijven kan de oude boom beschikbaar houden terwijl gewijzigde blokken voor de huidige versie worden geschreven.
mtime
mtime is het tijdstempel van de laatste wijziging van bestandsinhoud en onderscheidt veranderingen van opgeslagen bytes van andere statuswijzigingen van de inode.
Toegangsrechten wijzigen werkt ctime bij, terwijl bestandsinhoud schrijven zowel mtime als ctime bijwerkt.

N

Network File System
Het Network File System, of NFS, is een familie protocollen voor toegang tot serverbestanden, met een toestandsloos ontwerp voor v2 en een ontwerp met toestand voor v4.
Een Linux-client probeert normaal eerst NFS-versie 4.2, dus beschrijft het oudere toestandsloze model niet elke koppeling.
nog gebruikt blok
Een nog gebruikt blok is een opgeslagen blok waarnaar de nieuwste geldige locatiekoppeling voor het bestand van de eigenaar en de logische positie nog verwijst.
Een overzicht noemt inode 14 en blok 2, maar het oude adres is ongebruikt als de nieuwste inode naar elders verwijst.

O

onbereikbare inode
Een onbereikbare inode is een toegewezen inode die niet via de directoryboom vanaf de hoofddirectory van het bestandssysteem kan worden bereikt.
Na directoryschade kan fsck een verder geldige onbereikbare inode in lost+found plaatsen voor inspectie.
ongeldige bestandsinhoud
Ongeldige bestandsinhoud is onbedoelde oude of ongeldige inhoud die via een bestand zichtbaar wordt, ook wanneer de pointers en toewijzingsgegevens overeenkomen.
Als een nieuwe blokpointer wordt vastgelegd voordat de nieuwe bytes van dat blok aankomen, kan een geldig ogend bestand de eerdere inhoud van het blok tonen.
ongeldige blokverwijzing
Een ongeldige blokverwijzing is een opgeslagen blokadres buiten het geldige adresbereik van het bestandssysteem dat daardoor geen geldige toegewezen gegevens kan identificeren.
Als een inode voorbij het einde van de partitie verwijst, wist fsck die ongeldige pointer tijdens herstel.
overbrengen van vastgelegde journaalblokken naar hun definitieve locatie
Het overbrengen van vastgelegde journaalblokken naar hun definitieve locatie kopieert bij journaalregistratie de geregistreerde blokken van een vastgelegde transactie naar hun gewone definitieve locaties in het bestandssysteem.
Journaalruimte blijft nodig totdat het overbrengen elke vereiste blokinhoud veilig op de bestemming heeft geplaatst.

P

paginacache
De paginacache is geheugen dat bestandsgegevens en bijbehorende blokken bewaart, zodat latere toegang bewerkingen op het opslagapparaat kan vermijden.
Een tweede leesbewerking van een ongewijzigd gecachet blok kan bytes naar het programma kopiëren zonder opnieuw van schijf te lezen.
positioneringskosten
Positioneringskosten zijn de zoek- en rotatievertraging die een harde schijf heeft voordat de overdracht van gevraagde gegevens kan beginnen.
Twee leesbewerkingen van 4 KiB op ver uit elkaar gelegen locaties kunnen veel meer tijd aan positionering besteden dan aan het overdragen van hun kleine inhoud.

R

recursief wijzigingsprobleem
Het recursieve wijzigingsprobleem ontstaat wanneer het verplaatsen van één object afdwingt dat pointers in bovenliggende objecten worden herschreven, die daardoor verplaatsen en verdere herschrijvingen afdwingen.
Stabiele inodenummers en de imap voorkomen dat een verplaatste bestandsinode wijzigingen tot aan de hoofddirectory afdwingt.
relatief pad
Een relatief pad identificeert een object vanaf de huidige werkdirectory van het proces in plaats van vanaf de hoofddirectory.
Vanuit /srv/reports bereikt het pad ../logs de directory /srv/logs door eerst de vermelding naar de bovenliggende directory te volgen.

S

schrijfbewerking met minder geschreven bytes dan aangevraagd
Een schrijfbewerking met minder geschreven bytes dan aangevraagd is een geslaagde schrijfaanroep die meldt dat minder bytes zijn geschreven dan het programma vroeg.
Als write 200 teruggeeft bij een verzoek om 500 bytes, moet het programma de resterende 300 bytes nog afhandelen.
schrijfbuffering
Schrijfbuffering bewaart gewijzigde blokken tijdelijk in het geheugen zodat het systeem schrijfbewerkingen kan combineren, plannen of soms weglaten.
Twee bestanden kort na elkaar aanmaken kan één bitmap in het geheugen bijwerken en die bitmap later slechts één keer schrijven.
segment
Een segment is een grote sequentiële eenheid van LFS-uitvoer met gebufferde gegevens en metadata die samen naar ongebruikte ruimte worden geschreven.
Veel kleine wijzigingen in één segment combineren spreidt de positioneringskosten van een schijf over een langere overdracht.
segment met vaak gewijzigde blokken
Een segment met vaak gewijzigde blokken bevat blokken die vaak worden vervangen, zodat door te wachten meer blokken ongebruikt kunnen raken vóór het opruimen.
Het opruimen van een heet segment uitstellen kan het kopiëren besparen van gegevens die een volgende schrijfbewerking van een toepassing snel verouderd maakt.
segmentopruimer
De segmentopruimer is het LFS-onderdeel dat nog gebruikte blokken uit gedeeltelijk gebruikte segmenten kopieert en de oude segmenten vrijgeeft voor hergebruik.
Vier voor een kwart gebruikte segmenten samenvoegen tot één levert drie segmenten aan capaciteit op, maar kost kopieer-I/O.
segmentoverzicht
Een segmentoverzicht legt eigenaarschapsinformatie vast, zoals inodenummer en logische positie, voor blokken die in een LFS-segment zijn opgeslagen.
De segmentopruimer gebruikt het overzicht om te bepalen welke huidige inodepointer met het adres van een blok moet worden vergeleken.
soft updates
Soft updates ordenen afhankelijke schrijfopdrachten voor metadata en gegevens om onveilige verwijzingen te voorkomen zonder wijzigingen in een journaal te registreren.
Geïnitialiseerde gegevens vóór de pointer schrijven kan na een crash een lek achterlaten, maar voorkomt een bereikbaar ongeldig blok.
spoorbuffer
Een spoorbuffer is schijfgeheugen dat gegevens bewaart die van een spoor zijn gelezen, waardoor software minder rotatietussenruimten hoeft te regelen.
De schijf kan het volgende gevraagde blok uit de spoorbuffer teruggeven, ook nadat het onder de kop is gepasseerd.
superblok
Een superblok bewaart de aantallen, indelingsinformatie en identificerende waarden die nodig zijn om een bestandssysteem te interpreteren en aan te koppelen.
Het besturingssysteem leest het superblok om de inodetabel te vinden voordat het afzonderlijke bestanden opzoekt.
symbolische koppeling
Een symbolische koppeling is een afzonderlijk bestand waarvan de inhoud een doelpad aangeeft dat het systeem volgt bij het oplossen van een pad.
Een koppeling naar /media/archive kan een ander bestandssysteem bereiken, maar werkt niet als het doelpad verdwijnt.

T

tijdelijk gebruiksrecht
Een tijdelijk gebruiksrecht is in tijd beperkte, door de server beheerde toestand of een belofte die een client moet verlengen om die te behouden, zodat die na een storing kan verlopen.
Een NFSv4-server kan de toestand van een gecrashte client opruimen wanneer het tijdelijke gebruiksrecht verloopt zonder verlenging.
toegangscontrolelijst
Een toegangscontrolelijst voegt regels voor toegangsrechten toe voor genoemde gebruikers of groepen buiten de rechtenklassen eigenaar, groep en anderen.
Een ACL kan een bepaald projectlid toegang geven zonder alle andere gebruikers dezelfde rechten te geven.
toegangsrechtenbits
Toegangsrechtenbits coderen lees-, schrijf- en uitvoerrechten afzonderlijk voor de eigenaar van een bestand, de groep en andere gebruikers.
Modus 750 geeft de eigenaar alle drie de rechten, de groep lees- en uitvoerrecht en anderen geen rechten.
toestandsloze server
Een toestandsloze server voert zelfstandige verzoeken uit zonder per client toestand van geopende bestanden, zoals descriptoren en posities, te bewaren.
Een NFSv2-server kan na herstart weer verzoeken afhandelen zonder de tabel met geopende bestanden van elke client opnieuw op te bouwen.
toevoegmodus
De toevoegmodus is een modus voor een geopend bestand die elke schrijfbewerking aan het huidige bestandseinde plaatst en met O_APPEND wordt gekozen.
Een logproces gebruikt O_APPEND zodat elk nieuw bericht na de bestaande bestandsinhoud wordt geplaatst.
toewijzingsbitmap
Een toewijzingsbitmap gebruikt één bit per bijgehouden object om vast te leggen of die inode of dat gegevensblok is toegewezen of vrij is.
Een nieuw gegevensblok toewijzen zet het bit ervan in de gegevensbitmap, terwijl een nieuw bestand ook een bit in de inodebitmap nodig heeft.
transactie
Een transactie groepeert verwante wijzigingen onder één beslissing tot vastlegging, zodat herstel een volledige wijziging accepteert of negeert.
Een toevoegingstransactie kan nieuwe inode-inhoud, inhoud van een toewijzingsbitmap en het nieuwe gegevensblok bevatten.
transactiecontrolesom
Een transactiecontrolesom vat geregistreerde inhoud samen zodat herstel onvolledige of beschadigde transactie-inhoud kan detecteren.
Een passend ogende vastleggingsmarkering is onvoldoende wanneer controle laat zien dat een deel van de inhoud ontbreekt.

U

uitzonderingsregel voor grote bestanden
De uitzonderingsregel voor grote bestanden spreidt latere delen van een groot FFS-bestand over groepen zodat het niet de hele groep van zijn directory kan gebruiken.
De eerste blokken met directe pointers blijven lokaal, terwijl latere indirecte delen naar andere weinig gebruikte groepen gaan.
umask
Een umask is een procesinstelling die geselecteerde toegangsrechtenbits verwijdert uit de rechten die voor een nieuw bestand worden aangevraagd.
Zonder standaard-ACL verandert umask 0022 een aanvraag voor 0666 in de rechten 0644.

V

vastleggingsrecord
Een vastleggingsrecord markeert een transactie als volledig en herstelbaar nadat de vereiste journaalinhoud duurzame opslag heeft bereikt.
Inhoudsblokken zonder geldig bijpassend vastleggingsrecord worden door het eenvoudige herstelprotocol voor opnieuw uitvoeren genegeerd.
vermelding in de tabel met geopende bestanden
Een vermelding in de tabel met geopende bestanden is een kernelrecord met de bestandspositie, toegangsmodus, inodeverwijzing en verwijzingsteller van een geopend bestand.
Descriptoren die met dup zijn gemaakt, wijzen naar één vermelding, zodat een positiewijziging via een van beide hun gedeelde positie verandert.
verouderde cache
Een verouderde cache bevat een oudere kopie van een object die niet meer overeenkomt met de versie die de server momenteel beschikbaar heeft gemaakt.
Een client met een al geopend bestand kan oude gecachete bytes lezen nadat een andere client een gewijzigde versie heeft gesloten.
virtueel bestandssysteem
Het virtuele bestandssysteem is een kernellaag die gemeenschappelijke bestandsbewerkingen aanbiedt voor verschillende onderliggende bestandssysteemtypen.
Een programma kan read gebruiken op een ext4-bestand en een NFS-bestand, terwijl hun implementaties verschillende opslag afhandelen.
voorwaarts herstel
Voorwaarts herstel doorzoekt geldige logboekwijzigingen na een checkpoint en past die toe om een nieuwere toestand dan dat checkpoint te reconstrueren.
Een segment dat na het laatste checkpoint is geschreven kan nog worden hersteld wanneer de wijziging geldig en volledig is.

W

wijzigen van de bestandslengte
Het wijzigen van de bestandslengte verandert de logische lengte van een bestand; inkorten verwijdert de bytes voorbij het nieuwe einde, terwijl verlengen bytes creëert die als nullen worden gelezen.
Een bestaand bestand openen met O_TRUNC maakt het leeg voordat het programma vervangende inhoud schrijft.
wijzigingsmeldingsbelofte
Een AFS-wijzigingsmeldingsbelofte is een belofte van de server om een client te melden wanneer een gecachet object verandert, zodat hergebruik zonder herhaalde controles mogelijk is.
Een gewijzigd bestand beschikbaar maken zorgt dat de server de wijzigingsmeldingsbeloften van andere clients intrekt, zodat latere openingen hun kopieën verversen.

Over deze les

Door StudeliFout melden

Maak je eigen Studiemateriaal

Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.

Aan de slag