Dateisysteme

Lerne, wie ein Betriebssystem Dateien so speichert, dass sie Stromausfälle und Abstürze überstehen. Nutze Systemaufrufe für Dateien und Verzeichnisse, von open und read bis hin zu fsync, rename, Links und Berechtigungen. Sieh dir an, wie ein einfaches Dateisystem Inodes, Bitmaps und Datenblöcke anordnet, wie das Fast File System zusammengehörige Daten nahe beieinander hält und wie fsck und Journaling die Konsistenz der Festplatte nach einem Absturz sichern. Zum Abschluss lernst du logstrukturierte Dateisysteme kennen und erfährst, wie NFS und AFS Dateien über ein Netzwerk bereitstellen.

MittelEinheit 8 von 9 in Kurs: Betriebssysteme – Prozesse, Speicher, Threads und Dateisysteme

Was du lernst

  1. Nutze die Systemaufrufe, mit denen ein Programm Dateien erzeugt, liest, schreibt, benennt, schützt und organisiert. Sage voraus, wie sich jeder Aufruf auf Dateioffsets, Namen und Daten auf der Festplatte auswirkt.
    • Lies und schreibe Dateien über Dateideskriptoren
      Öffne Dateien, lies und schreibe sie über Dateideskriptoren, verschiebe den Dateioffset und erkläre, wie Prozesse offene Dateien gemeinsam nutzen.
    • Sorge für dauerhafte Schreibvorgänge und atomare Aktualisierungen
      Erzwinge das Schreiben von Daten auf einen dauerhaften Speicher, wenn sie einen Absturz überstehen müssen, und ersetze den Inhalt einer Datei so, dass lesende Prozesse entweder die alte oder die neue Version sehen.
    • Organisiere Namen mit Verzeichnissen und Links
      Erzeuge, liste und entferne Verzeichnisse und erkläre, wie harte Links, symbolische Links und das Löschen einer Datei Namen und Inodes beeinflussen.
    • Lies Metadaten aus, kontrolliere Zugriffe und hänge Dateisysteme ein
      Lies die Metadaten einer Datei mit stat, setze und interpretiere Berechtigungsbits und erkläre, wie getrennte Dateisysteme zu einem Verzeichnisbaum verbunden werden.
  2. Beschreibe die Strukturen eines einfachen Unix-artigen Dateisystems auf der Festplatte, berechne die Position eines Inodes und der Blöcke einer Datei und verfolge die Festplattenzugriffe beim Öffnen, Lesen und Schreiben einer Datei.
    • Gliedere eine Festplatte in Blöcke, Bitmaps, Inodes und Verzeichnisse
      Teile eine Festplatte in Superblock, Belegungsbitmaps, Inode-Tabelle und Datenbereich ein, ermittle die Position eines Inodes anhand seiner Nummer und beschreibe, wie Verzeichnisse und freier Speicherplatz gespeichert werden.
    • Finde die Daten einer Datei mit Zeigern, indirekten Blöcken und Extents
      Erkläre, wie direkte Zeiger, indirekte Blöcke und Extents eines Inodes die Offsets einer Datei auf Festplattenblöcke abbilden, und berechne die größte Datei, die eine Zeigerstruktur unterstützt.
    • Verfolge die Festplattenzugriffe bei Dateioperationen und die Auswirkungen des Cachings
      Zähle die Blocklese- und Schreibvorgänge beim Öffnen, Lesen, Erzeugen und Schreiben einer Datei und erkläre, wie Caching und Schreibpufferung diese Zugriffe verändern.
  3. Untersuche, warum frühe Unix-Dateisysteme auf Festplatten langsam waren, und erkläre, wie Gruppen, Platzierungsregeln und die Strategie für große Dateien im Fast File System zusammengehörige Daten nahe beieinander halten.
    • Erkläre, warum frühe Unix-Dateisysteme langsam waren und wie Gruppen das Problem beheben
      Erkenne die Probleme der Speicheraufteilung, durch die das ursprüngliche Unix-Dateisystem Festplattenbandbreite verschwendete, und beschreibe, wie Zylindergruppen und Blockgruppen die Festplatte organisieren.
    • Wende die FFS-Platzierungsregeln an und bestimme die Größe von Teilstücken großer Dateien
      Nutze die FFS-Platzierungsheuristiken für Verzeichnisse und Dateien, wende die Ausnahmeregel für große Dateien an, berechne, wie groß ein Teilstück zur Amortisierung der Positionierung sein muss, und beschreibe weitere Verbesserungen von FFS.
  4. Erkläre, warum ein Absturz während einer Aktualisierung ein Dateisystem beschädigen kann, und vergleiche die nachträgliche Reparatur mit fsck, die Vorbeugung von Schäden durch Journaling und andere Ansätze.
    • Erkläre das Problem der Absturzkonsistenz
      Zeige, warum eine Dateioperation mehrere Blockschreibvorgänge benötigt, liste auf, was ein Absturz dazwischen auf der Festplatte hinterlassen kann, und ordne jedes Ergebnis ein.
    • Prüfe und repariere ein Dateisystem mit fsck
      Beschreibe, was das Dateisystemprüfprogramm nach einem Absturz untersucht und repariert, und erkläre, warum das Durchsuchen der gesamten Festplatte schlecht skaliert und nicht jedes Problem aufdecken kann.
    • Sichere Aktualisierungen durch Daten-Journaling und spiele das Protokoll erneut ein
      Schreibe eine Aktualisierung in ein Journal, bevor du das Dateisystem an Ort und Stelle änderst, erkläre, warum der Commit-Block zuletzt geschrieben wird, und stelle den Zustand nach einem Absturz wieder her, indem du abgeschlossene Transaktionen erneut einspielst.
    • Verringere den Journalingaufwand und vergleiche andere Ansätze
      Erkläre, wie Metadaten-Journaling das doppelte Schreiben von Daten vermeidet, warum geordnetes Journaling Daten vor dem Commit schreibt, wie Widerrufsdatensätze einen Fehler bei der Blockwiederverwendung verhindern und wie andere Entwürfe Dateisysteme konsistent halten.
  5. Erkläre, warum das sequenzielle Schreiben aller Daten in ein Protokoll Schreibvorgänge beschleunigt, wie das Dateisystem mithilfe der Inode-Zuordnungstabelle und des Checkpoint-Bereichs Daten in diesem Protokoll findet und wie Bereinigung und Wiederherstellung nach einem Absturz funktionieren.
    • Schreibe sequenziell in Segmente und finde Inodes über die Inode-Zuordnungstabelle
      Erkläre die Motivation für ein logstrukturiertes Dateisystem, bestimme die Größe eines Segments für eine angestrebte Bandbreite und verfolge, wie die Inode-Zuordnungstabelle und der Checkpoint-Bereich eine Datei finden.
    • Gewinne Speicherplatz mit dem Cleaner zurück und stelle den Zustand nach einem Absturz wieder her
      Erkläre, wie LFS gültige Blöcke findet und verdichtet, die zu bereinigenden Segmente auswählt und sich nach einem Absturz wiederherstellt und wie seine Ideen in Copy-on-Write- und Flash-Dateisystemen fortleben.
  6. Erkläre, wie NFS und AFS vielen Client-Rechnern die Nutzung von Dateien auf Servern ermöglichen, wie sie Abstürze behandeln und wie ihre Caching-Entscheidungen bestimmen, wann ein Client die Änderungen eines anderen sieht.
    • Erkläre, wie NFS mithilfe zustandsloser Anfragen nach Ausfällen weiterarbeitet
      Beschreibe die Client-Server-Struktur von NFS, wie Dateihandles und idempotente Anfragen einem Client erlauben, sich durch Wiederholung von Serverabstürzen zu erholen, und warum der Server Schreibvorgänge vor seiner Antwort dauerhaft speichern muss.
    • Vergleiche Caching und Konsistenz bei NFS und AFS
      Erkläre, wie NFS und AFS Dateidaten auf Clients zwischenspeichern, wann sie die Änderungen eines Clients für andere sichtbar machen und welche Arbeitslasten den jeweiligen Entwurf begünstigen.

Dateisysteme einfach erklärt

6 Kapitel

1

Nutze die Datei- und Verzeichnisschnittstelle

Dateioperationen betreffen verschiedene Arten von Zustand: Bytes, Namen, aktuelle Positionen offener Dateien und Berechtigungen. Verfolge einen Deskriptor durch Lesevorgänge und gemeinsam genutzte Offsets und unterscheide anschließend einen abgeschlossenen Aufruf von dauerhaftem Speichern. Verzeichnisse und Links erklären, warum das Löschen eines Namens nicht das Objekt löschen muss. Metadaten und das Einhängen vervollständigen das Bild davon, wie ein Programm eine Datei über einen gemeinsamen Verzeichnisbaum erreicht und nutzt.

1.1 Lies und schreibe Dateien über Dateideskriptoren

Eine Datei ist eine dauerhaft gespeicherte Folge von Bytes. Das Dateisystem speichert diese Bytes, ohne zu entscheiden, ob sie Text, ein Bild oder Maschinencode bedeuten. Ein Verzeichnis gibt der Datei einen lesbaren Namen; ihre Inode-Nummer identifiziert sie innerhalb des Dateisystems.

Öffne eine Datei und prüfe das Ergebnis

open(path, flags, mode) gibt einen Dateideskriptor zurück, eine nicht negative Ganzzahl, die in späteren Aufrufen verwendet wird. Bei einem Fehler wird -1 zurückgegeben und errno gesetzt. Wähle für den Zugriff O_RDONLY, O_WRONLY oder O_RDWR. O_CREAT erzeugt eine fehlende Datei, O_TRUNC leert eine vorhandene Datei und O_APPEND platziert jeden Schreibvorgang am aktuellen Ende.

Für eine neue Datei fordert mode Berechtigungen an und die umask des Prozesses entfernt Bits. Ohne eine Standard-Zugriffskontrollliste (ACL) für das Verzeichnis ergibt sich mode & ~umask. Die Anforderung 0666 mit umask 0022 ergibt 0644 oder rw-r--r--. Dieses Argument ändert die Berechtigungen einer bereits vorhandenen Datei nicht.

Deskriptoren gehören zu einem Prozess. Normalerweise stehen 0, 1 und 2 für Standardeingabe, Standardausgabe und Standardfehlerausgabe. open wählt den kleinsten ungenutzten Deskriptor, häufig 3. Unter Linux zeigt strace cat notes.txt die Aufrufe: das Öffnen der Eingabe, ihr Lesen, das Schreiben auf Deskriptor 1 und anschließend das Schließen der Eingabe.

Verfolge den Offset, nicht die angeforderte Anzahl

read(fd, buf, n) gibt die tatsächlich gelesene Bytezahl zurück, höchstens n. Bei einer von null verschiedenen Anforderung an eine reguläre Datei bedeutet null, dass am oder hinter dem Dateiende keine Bytes mehr vorhanden sind; -1 bedeutet einen Fehler. Auch write gibt eine tatsächliche Anzahl zurück, die kleiner als angefordert sein kann. Prüfe diese Anzahl, bevor du einen Pufferzeiger weitersetzt oder die Operation für abgeschlossen erklärst.

Angenommen, log.txt enthält 300 Byte. Vier Anforderungen von je 100 Byte geben 100, 100, 100 und 0 zurück. Der Offset, die Position der nächsten Operation, steht danach bei 100, 200, 300 und 300. Das Dateiende wird durch eine zurückgegebene Anzahl angezeigt, nicht durch ein spezielles Byte in der Datei.

lseek(fd, 200, SEEK_SET) setzt den Offset auf 200. Das anschließende Lesen von 50 Byte gibt die Bytes 200 bis 249 zurück und hinterlässt den Offset bei 250. SEEK_CUR zählt vom aktuellen Offset aus; SEEK_END zählt vom Dateiende aus. Das Verschieben ändert eine Zahl im Speicher. Es bewegt keinen Festplattenkopf und liest selbst keine Daten. pread und pwrite nutzen eine ausdrücklich angegebene Position, ohne diesen Offset zu ändern.

Bestimme, welche Deskriptoren einen Offset gemeinsam nutzen

Die Deskriptortabelle des Prozesses zeigt auf Einträge in der Tabelle geöffneter Dateien des Kernels. Jeder Eintrag für eine offene Datei enthält den Zugriffsmodus, den Offset, eine Inode-Referenz und einen Referenzzähler.

Entstehung der DeskriptorenVerhalten des Offsets
Zwei getrennte open-AufrufeUnabhängige Offsets, auch für denselben Inode
dup oder dup2Ein gemeinsamer Eintrag für die offene Datei und ein gemeinsamer Offset
Durch fork geerbte DeskriptorenEltern- und Kindprozess teilen den Eintrag und den Offset

Setzt ein Kindprozess den Offset eines gemeinsam genutzten Deskriptors auf Byte 10, beginnt auch der nächste Lesevorgang des Elternprozesses über diesen Eintrag bei 10. Der Inode identifiziert die Datei, aber der Eintrag für die offene Datei enthält den Offset: Zwei lesende Prozesse können eine Datei gemeinsam nutzen, ohne ihre Position zu teilen. Die Shell-Umleitung nutzt dup2, damit die Standardausgabe auf einen anderen Eintrag für eine offene Datei verweist. close gibt einen Deskriptor frei; der Eintrag verschwindet, nachdem seine letzte Referenz freigegeben wurde. Das Schließen allein erzwingt nicht das Schreiben gepufferter Daten auf dauerhaften Speicher.

Wichtige Erkenntnisse

  • Prüfe die von jedem read und write zurückgegebene Bytezahl.
  • Ein Offset gehört zu einem Eintrag in der Tabelle geöffneter Dateien, nicht zum Inode.
  • Getrennte Öffnungen haben getrennte Offsets; duplizierte und geerbte Deskriptoren teilen einen Offset.
  • lseek ändert den Offset ohne Festplattenzugriff.
  • close gibt einen Deskriptor frei; es garantiert keine Dauerhaftigkeit.

1.2 Sorge für dauerhafte Schreibvorgänge und atomare Aktualisierungen

Ein erfolgreicher Schreibvorgang und eine absturzsichere Aktualisierung beantworten unterschiedliche Fragen. Ein Schreibvorgang meldet, dass Bytes angenommen wurden. Dauerhaftigkeit betrifft die Frage, ob sie einen Absturz überstehen; Atomarität betrifft die Frage, ob eine Aktualisierung nur als Ganzes beobachtet werden kann.

Erzwinge das Schreiben auf dauerhaften Speicher

Betriebssysteme puffern Schreibvorgänge meist im Speicher und senden veränderte Blöcke später an das Speichergerät, häufig innerhalb von ungefähr 5 bis 30 Sekunden. Das bündelt kleine Schreibvorgänge und lässt das Programm schnell weiterlaufen. Ein Absturz kann Daten löschen, die noch in diesen Puffern warten.

fsync(fd) erzwingt das Schreiben der veränderten Daten und Metadaten der Datei auf das Speichergerät und wartet, bis das Gerät den Abschluss meldet. Ein Programm muss das Ergebnis prüfen, bevor es eine dauerhafte Speicherung meldet. close gibt den Deskriptor frei und ersetzt dieses Warten nicht.

Eine Datei braucht auch einen dauerhaft gespeicherten Namen. Der Eintrag, der den Namen auf den Inode abbildet, gehört zu den Daten ihres Verzeichnisses, nicht zu denen der Datei. Wird nach dem Erzeugen einer Datei nur diese synchronisiert, können ihre Bytes dauerhaft gespeichert sein, ohne dass ihr neuer Name garantiert erhalten bleibt. Öffne das enthaltende Verzeichnis und synchronisiere es, wenn der Name dauerhaft erhalten bleiben muss.

Ersetze eine Datei, ohne eine unvollständige Version sichtbar zu machen

Beim direkten Überschreiben eines Dokuments entsteht ein Zeitraum, in dem lesende Prozesse auf unvollständige Inhalte stoßen können. O_TRUNC setzt seine Länge zunächst auf null. Unterbricht ein Absturz die späteren Schreibvorgänge, ist die alte vollständige Kopie bereits verschwunden.

Schreibe den Ersatz stattdessen unter einem temporären Namen in dasselbe Verzeichnis. Nutze dann rename, um das Ziel zu ersetzen. Für ein vorhandenes Ziel auf demselben Dateisystem macht POSIX diese Ersetzung atomar: Der Zielname verweist auf die alte Datei oder den Ersatz, ohne dass der Name dazwischen fehlt. Lesende Prozesse sehen unter diesem Namen keine Mischung ihrer Inhalte.

Für settings.json lautet die Folge für eine dauerhafte Ersetzung:

  1. Schreibe den gesamten neuen Inhalt nach settings.json.tmp und prüfe auf partielle Schreibvorgänge und Fehler.
  2. Rufe fsync für die temporäre Datei auf und prüfe, ob der Aufruf erfolgreich war.
  3. Rufe rename("settings.json.tmp", "settings.json") auf und prüfe, ob der Aufruf erfolgreich war.
  4. Rufe fsync für das enthaltende Verzeichnis auf und prüfe, ob der Aufruf erfolgreich war.

Die temporäre Datei ist vollständig und dauerhaft gespeichert, bevor sich der Name ändert. Die abschließende Synchronisierung des Verzeichnisses macht diese Namensänderung dauerhaft. Ein Absturz während der Folge hinterlässt am Ziel eine vollständige alte oder eine vollständige neue Version; nach der letzten erfolgreichen Synchronisierung ist die neue Version dauerhaft gespeichert. Die atomare Ersetzung des Namens allein verspricht nicht, dass ein nicht synchronisiertes Umbenennen einen Stromausfall übersteht.

rename über Dateisystemgrenzen hinweg schlägt mit EXDEV fehl. Ein Befehl, der darauf mit Kopieren und Löschen reagiert, führt mehrere Operationen aus, sodass diese Ausweichlösung keine atomare Ersetzung garantiert.

Ändere die Länge, ohne jedes Byte zu schreiben

truncate(path, length) und ftruncate(fd, length) setzen die Länge der Datei. Beim Verkleinern werden Bytes jenseits des neuen Endes verworfen. Beim Verlängern wird der neue Bereich als Nullen gelesen. Auch das Positionieren hinter dem Ende und anschließende Schreiben erzeugt eine Lücke, die als Nullen gelesen wird.

Eine dünn besetzte Datei kann eine solche Lücke darstellen, ohne dafür Datenblöcke zuzuweisen. Schreibst du ausgehend von einer leeren Datei ein Byte an Offset 8192, entsteht eine Datei der Länge 8193 Byte; der vorangehende ungeschriebene Bereich wird als Nullen gelesen. Ihre logische Größe kann den physisch zugewiesenen Speicherplatz übersteigen.

Wichtige Erkenntnisse

  • fsync speichert Dateidaten und Metadaten nach erfolgreichem Abschluss dauerhaft.
  • Synchronisiere das Verzeichnis, um einen neuen oder ersetzten Namen dauerhaft zu speichern.
  • Schreibe, synchronisiere, benenne um und synchronisiere dann das Verzeichnis für eine dauerhafte Ersetzung.
  • Eine Lücke in einer dünn besetzten Datei wird als Nullen gelesen und kann ohne Datenblöcke auskommen.

Verzeichnisse trennen die Namen, die Menschen verwenden, von den Objekten, die das Dateisystem speichert. Jedes Verzeichnis hat einen eigenen Inode und eigene Datenblöcke; seine Einträge bilden Namen auf Inode-Nummern ab.

Folge Pfaden durch den Baum

Ein absoluter Pfad beginnt bei /. Ein relativer Pfad beginnt beim aktuellen Arbeitsverzeichnis des Prozesses. Der Eintrag . bezeichnet das Verzeichnis selbst und .. sein übergeordnetes Verzeichnis; das übergeordnete Verzeichnis der Wurzel ist die Wurzel selbst. Von /home/lee aus führt der relative Pfad ../shared nach /home/shared.

Eine Endung wie .txt ist Teil eines Namens. Programme können anhand der Endung entscheiden, wie sie die Bytes interpretieren, aber das Dateisystem verlangt nicht, dass eine .txt-Datei Text enthält.

mkdir erzeugt ein Verzeichnis mit . und ... Um Einträge aufzulisten, nutzt ein Programm opendir, ruft readdir auf, bis keine Einträge mehr vorhanden sind, und ruft closedir auf. Ein Ergebnis von readdir enthält einen Namen und eine Inode-Nummer. Programme ändern Verzeichnisinhalte durch Aufrufe wie link, unlink und rename, nicht durch gewöhnliche write-Aufrufe. rmdir entfernt ein leeres Verzeichnis.

Gib einer Datei zwei gleichwertige Namen

link(old, new) erzeugt einen harten Link: einen weiteren Verzeichniseintrag, der auf denselben Inode zeigt. Keiner der Namen ist als Original bevorzugt. Der Linkzähler des Inodes hält fest, wie viele Namen auf ihn verweisen.

Betrachte diese Befehle, wenn kein Prozess die Datei geöffnet hat:

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

Das Erzeugen von b erhöht den Linkzähler von 1 auf 2. Das Entfernen von a senkt ihn auf 1; b erreicht weiterhin dieselben Bytes, sodass cat b „hi“ ausgibt. Das Entfernen von b senkt den Zähler auf 0, sodass der Inode und seine Blöcke zurückgewonnen werden können.

Ein offener Deskriptor ergänzt eine zweite Regel für die Lebensdauer. Wird der letzte Name entfernt, während ein Prozess die Datei noch geöffnet hat, kann dieser Prozess weiterhin darauf zugreifen. Die Freigabe wartet sowohl auf null Links als auch darauf, dass keine offenen Referenzen mehr bestehen. Das erklärt, warum das Löschen einer großen geöffneten Protokolldatei ihren Speicherplatz möglicherweise nicht sofort freigibt.

Ein harter Link kann Dateisystemgrenzen nicht überschreiten: Die Inode-Nummer des Ziels hätte in der anderen Inode-Tabelle keine Bedeutung. Die meisten Unix-Systeme verbieten auch harte Links auf Verzeichnisse, um einen Baum ohne Zyklen zu erhalten. Nach der klassischen Unix-Zählweise hat ein leeres Verzeichnis zwei Links, aus seinem Eintrag im übergeordneten Verzeichnis und seinem eigenen .. Jedes Unterverzeichnis trägt durch .. einen weiteren bei; drei Unterverzeichnisse ergeben den Zählerstand 5.

Speichere einen Pfad in einem symbolischen Link

Ein symbolischer Link oder Softlink ist eine eigenständige Datei, deren Inhalt ein Zielpfad ist. ln -s /home/ana/report.txt r erzeugt r mit dem 20 Byte langen Zielpfad als Inhalt. Beim Folgen des Links wird dieser Pfad aufgelöst. Symbolische Links können Dateisystemgrenzen überschreiten und auf Verzeichnisse zeigen.

LinkartWas der Verzeichniseintrag erreichtAuswirkung des Entfernens des Zielnamens
Harter LinkDen gemeinsam genutzten InodeEin anderer harter Link erreicht weiterhin die Datei
Symbolischer LinkEin separates Linkobjekt mit einem PfadDer Link hängt, wenn sein gespeicherter Pfad nicht mehr aufgelöst werden kann

Ein symbolischer Link erhöht den Linkzähler seines Ziels nicht. Das Behalten des Linkobjekts erhält daher das Ziel nicht.

Wichtige Erkenntnisse

  • Verzeichnisse bilden Namen auf Inode-Nummern ab; Pfade wählen eine Folge dieser Namen aus.
  • Harte Links sind gleichwertige Namen für einen Inode.
  • Das Entfernen eines Links entfernt einen Namen; die Freigabe wartet auch darauf, dass offene Referenzen enden.
  • Symbolische Links speichern Pfade und können hängen.
  • Harte Links bleiben innerhalb eines Dateisystems.

1.4 Lies Metadaten aus, kontrolliere Zugriffe und hänge Dateisysteme ein

Der Inhalt einer Datei ist nur ein Teil ihres Zustands. Metadaten halten fest, wer sie nutzen darf, welche Größe und welchen Typ sie hat und wann sie geändert wurde. Durch das Einhängen werden Objekte mehrerer Dateisysteme über einen einzigen Namensbaum erreichbar.

Lies die Metadaten richtig

stat(path, &buf) liest Metadaten über einen Pfad; fstat(fd, &buf) liest sie über einen offenen Deskriptor. Zu den Ergebnissen gehören Inode-Nummer, Typ, Berechtigungen, Eigentümer- und Gruppenkennung, Größe, zugewiesene Blöcke und Linkzähler. Die Dateigröße zählt die logischen Bytes; die zugewiesenen Blöcke messen den tatsächlich genutzten Speicherplatz, der bei einer dünn besetzten Datei kleiner sein kann.

Drei Zeitstempel beschreiben unterschiedliche Ereignisse:

FeldBedeutungBeispielereignis
atimeLetzter ZugriffInhalt lesen
mtimeLetzte InhaltsänderungBytes schreiben
ctimeLetzte Statusänderung des InodesSchreiben, Berechtigungen ändern oder einen harten Link hinzufügen

ctime ist nicht die Erstellungszeit. Eine Aktualisierung von atime allein ändert ctime nicht. Das klassische Unix-stat hat kein Feld für die Erstellungszeit; Linux-statx kann eine gespeicherte Erstellungszeit ausgeben, wenn das Dateisystem sie unterstützt.

Entschlüssele Berechtigungsbits

Lese-, Schreib- und Ausführungsrechte werden für Eigentümer, Gruppe und andere getrennt gespeichert. Jede Klasse entspricht einer Oktalziffer: Lesen zählt 4, Schreiben 2 und Ausführen 1. Bei rw-r----- erhält der Eigentümer 4 + 2 = 6, die Gruppe 4 und andere erhalten 0. chmod 640 report.txt setzt diese Bits.

Verzeichnisberechtigungen gelten für Namen und die Pfadauflösung. Lesen erlaubt das Auflisten von Namen. Ausführen erlaubt das Durchsuchen, also die Verwendung des Verzeichnisses in einem Pfad. Schreiben zusammen mit Ausführen erlaubt das Erzeugen, Löschen und Umbenennen von Einträgen. Wer den Namen kennt, kann eine Datei in einem Verzeichnis mit Ausführungs-, aber ohne Leseberechtigung möglicherweise öffnen, sofern die Berechtigungen der Datei den Zugriff erlauben. Das Auflisten dieses Verzeichnisses schlägt dennoch fehl.

Dieser Unterschied ist beim Löschen wichtig: Das Entfernen eines Eintrags ändert das enthaltende Verzeichnis. Das Schreibbit einer Datei steuert die Änderung ihrer Bytes; es ist nicht die Berechtigung des Verzeichnisses, ihren Namen zu entfernen. Root umgeht die meisten gewöhnlichen Berechtigungsprüfungen. Zugriffskontrolllisten (ACLs) können benannten Benutzern und Gruppen über die drei grundlegenden Klassen hinaus Rechte gewähren.

Hänge ein weiteres Dateisystem ein

mkfs initialisiert ein Dateisystem auf einer Partition oder einem anderen Gerät, einschließlich seines eigenen Wurzelverzeichnisses und seiner Metadaten. Dabei wird der bisherige Dateisysteminhalt des Geräts zerstört. Führe den Befehl daher nur auf einem für die Initialisierung vorgesehenen Gerät aus.

mount hängt diese Wurzel an ein vorhandenes Verzeichnis, den Einhängepunkt. Ein unter /media/usb eingehängtes Laufwerk macht den Inhalt seiner Wurzel dort zugänglich. Der bisherige Inhalt von /media/usb ist verborgen, solange das Dateisystem eingehängt ist; beim Einhängen wird er nicht mit dem eingehängten Baum zusammengeführt. Ein Aufruf von mount ohne Argumente listet die aktuellen Einhängungen auf.

Die Schicht des virtuellen Dateisystems (VFS) im Kernel stellt ext4, XFS, FAT sowie speicherbasierten und Netzwerkdateisystemen eine gemeinsame Schnittstelle bereit. Programme können bei jedem dieser Systeme open und read aufrufen. Der vereinte Namensraum führt ihre Inode-Tabellen nicht zusammen: Gleiche Inode-Nummern auf verschiedenen Dateisystemen können voneinander unabhängige Dateien bezeichnen. Harte Links und atomares Umbenennen bleiben daher auf das jeweilige Dateisystem beschränkt.

Wichtige Erkenntnisse

  • stat und fstat liefern Metadaten; ctime erfasst Statusänderungen.
  • Berechtigungsziffern addieren für jede Benutzerklasse Lesen = 4, Schreiben = 2 und Ausführen = 1.
  • Die Ausführungsberechtigung für Verzeichnisse erlaubt die Pfadauflösung; die Leseberechtigung erlaubt das Auflisten.
  • Das Einhängen fügt die Wurzel eines Dateisystems ein und verbirgt den bisherigen Inhalt des Einhängepunkts.
  • Das VFS stellt verschiedenen Dateisystemtypen eine gemeinsame Schnittstelle bereit, aber keine globale Inode-Tabelle.
  • Logische Dateigröße und zugewiesener Speicherplatz können sich unterscheiden.
2

Erkläre, wie ein einfaches Dateisystem Daten speichert und findet

Hinter einem lesbaren Pfad verbirgt sich eine Folge von Suchvorgängen, Zuweisungen und Blockzugriffen. Erstelle eine kleine Festplattenaufteilung, berechne eine Inode-Adresse und bilde Byteoffsets über direkte Zeiger, indirekte Blöcke oder Extents ab. Verfolge dann die Ein-/Ausgaben hinter gängigen Aufrufen. Wenn du ausdrücklich angibst, was im Cache liegt, kannst du erklären, warum dasselbe Programm bei einem Lauf viele Geräteoperationen und beim nächsten nur sehr wenige auslösen kann.

2.1 Gliedere eine Festplatte in Blöcke, Bitmaps, Inodes und Verzeichnisse

Ein Dateisystem muss sich merken, wo Bytes liegen und welcher Speicherplatz verfügbar ist. Eine einfache Unix-artige Aufteilung macht diese Aufgaben sichtbar, indem sie Belegungsinformationen, Inodes und Inhalte trennt.

Teile die Partition in Bereiche ein

Ein Block ist die grundlegende Zuweisungseinheit des Dateisystems. Ein 4-KiB-Block enthält 4.096 Byte oder acht herkömmliche Sektoren zu je 512 Byte. Binäre Größen verwenden KiB, MiB und GiB; Übertragungsraten wie MB/s verwenden dezimale Millionen Byte pro Sekunde.

Der Lehrentwurf vsfs, das sehr einfache Dateisystem, enthält diese Strukturen:

StrukturGespeicherte Informationen
SuperblockDateisystemgröße, Positionen der Bereiche, Inode-Anzahl und identifizierende magische Zahl
Inode-BitmapEin Belegungsbit pro Inode
DatenbitmapEin Belegungsbit pro Datenblock
Inode-TabelleMetadaten und Datenzeiger für jeden Inode-Platz
DatenbereichInhalte regulärer Dateien und Verzeichnisse

Ein Bitmap-Bit mit dem Wert 1 bedeutet belegt; 0 bedeutet frei. Der Superblock gibt dem Betriebssystem beim Einhängen vor, wie es den Rest der Partition interpretieren muss. Die beiden Bitmaps beschreiben unterschiedliche Ressourcen: Einer Datei kann bereits ein Inode zugewiesen sein, bevor sie Datenblöcke hat.

Finde einen Inode anhand seiner Nummer

Nimm eine Partition mit 64 Blöcken zu je 4 KiB. Lege den Superblock in Block 0, die Inode-Bitmap in Block 1, die Datenbitmap in Block 2 und die Inode-Tabelle in den Blöcken 3 bis 7 ab. Die Daten belegen die Blöcke 8 bis 63. Fünf Blöcke der Inode-Tabelle mit Inodes zu je 256 Byte fassen 80 Inodes, weil jeder Block 16 fasst. Es gibt 56 Datenblöcke. Eine 4 KiB große Bitmap kann 32.768 Objekte beschreiben, sodass in dieser kleinen Aufteilung ein großer Teil jeder Bitmap ungenutzt bleibt.

Werden die Inode-Plätze ab null nummeriert, beginnt Inode 37 genau 37 × 256 = 9.472 Byte nach Beginn der Tabelle. Die Tabelle beginnt bei Byte 12.288, was die absolute Byteadresse 21.760 ergibt. Die Division durch 4.096 ergibt Festplattenblock 5 mit Rest 1.280. Die Division durch 512 ergibt dagegen Sektor 42 mit Rest 256. Lies den Block oder Sektor, der den Inode enthält, und wähle darin die Bytes des Inodes aus.

Die allgemeine Methode lautet: Tabellenanfang in Byte plus Inode-Nummer mal Inode-Größe. Halte die Anfangsadresse der Tabelle vom Offset des Inodes innerhalb der Tabelle getrennt. Lässt du diese Basisadresse weg, erhältst du den falschen Festplattenblock.

Trenne Namen, Metadaten und Inhalte

Ein Inode oder Indexknoten speichert Typ, Berechtigungen, Eigentumsverhältnisse, Größe, Zeiten, Linkzähler, zugewiesene Blöcke und Datenpositionen. Er enthält nicht den Dateinamen. Der Name gehört in einen Verzeichniseintrag, sodass mehrere Namen einen Inode gemeinsam nutzen können.

Ein Verzeichnis hat einen Inode vom Typ Verzeichnis und Datenblöcke mit Einträgen. Ein einfacher Eintrag speichert eine Inode-Nummer, die Datensatzlänge, die Namenslänge und den Namen. Anhand der Datensatzlänge kann bei der Suche der ganze Eintrag übersprungen werden, einschließlich des durch Löschen entstandenen wiederverwendbaren Platzes. Große Verzeichnisse profitieren von Indizes: XFS nutzt B-Bäume und ext4 hashbasierte Baumindizes.

Beim Erzeugen einer Datei wird ein freies Bit in der Inode-Bitmap gesucht und gesetzt. Die Zuweisung von Daten ändert entsprechend die Datenbitmap. Ein Allokator kann eine Folge von Blöcken reservieren, damit die Datei zusammenhängend wachsen kann. Die Bitmap gibt an, ob ein Block frei ist; der Inode gibt an, zu welcher Datei er gehört. Diese Strukturen müssen übereinstimmen.

Wichtige Erkenntnisse

  • Der Superblock beschreibt die Aufteilung; Bitmaps erfassen die Belegung.
  • Ein Inode enthält Metadaten und Datenpositionen, während Verzeichnisse Namen enthalten.
  • Berechne eine Inode-Adresse aus der Tabellenbasis, der Inode-Nummer und der Inode-Größe.
  • Inode- und Datenzuweisung nutzen getrennte Bitmaps.

2.2 Finde die Daten einer Datei mit Zeigern, indirekten Blöcken und Extents

Ein Programm sieht aufeinanderfolgende Byteoffsets, aber die zugehörigen Datenblöcke können über die Festplatte verstreut sein. Das Dateisystem benötigt eine Zuordnung von jedem logischen Dateiblock zu seiner physischen Position.

Folge direkten und indirekten Zeigern

Ein direkter Zeiger in einem Inode bezeichnet einen Datenblock. Bei 4-KiB-Blöcken liegt Byteoffset 10.000 im logischen Block 2, weil zwei vollständige Blöcke 8.192 Byte umfassen. Der Offset innerhalb dieses Blocks beträgt 1.808. Logische Blöcke beginnen bei 0, sodass Block 2 den dritten direkten Zeiger nutzt.

Ein indirekter Zeiger bezeichnet einen Block, der Datenblockadressen enthält. Ein Block von 4.096 Byte mit 4 Byte großen Adressen fasst 1.024 Zeiger. Ein doppelt indirekter Zeiger bezeichnet einen Block, dessen Zeiger zu 1.024 indirekten Blöcken führen. Dreifache Indirektion fügt eine weitere Ebene hinzu. Dieser mehrstufige Index ist bewusst unausgeglichen: Kleine Dateien nutzen direkte Zeiger ohne zusätzliche Lesezugriffe auf Zeigerblöcke, während bei großen Dateien Aufwand für zusätzliche Ebenen anfällt.

Für einen Inode mit 12 direkten Zeigern und einem Zeiger jeder indirekten Ebene gilt:

Höchste genutzte EbeneDatenkapazität bei 4-KiB-Blöcken
Nur direkt12 Blöcke = 48 KiB
Einfach indirekt12 + 1.024 Blöcke = 4.144 KiB
Doppelt indirekt12 + 1.024 + 1.024² Blöcke = 4299210752 Byte
Dreifach indirektFügt 1.024³ Blöcke hinzu = weitere 4 TiB

Dies sind Kapazitäten dieser Zeigerstruktur. Zeigerblöcke belegen ebenfalls Speicherplatz, aber ihre Bytes gehören nicht zum Dateiinhalt.

Zähle die Zeigerblöcke einer Datei

Eine 5 MiB große Datei belegt 1.280 Datenblöcke zu je 4 KiB. Weise die ersten 12 direkten Zeigern zu. Weise die nächsten 1.024 dem einfach indirekten Block zu. Es bleiben 244 Datenblöcke.

Diese 244 benötigen einen doppelt indirekten Wurzelblock und einen indirekten Block darunter. Insgesamt braucht die Datei drei Zeigerblöcke: den einfach indirekten Block, den doppelt indirekten Wurzelblock und dessen einen Kindblock. Wer nur den doppelt indirekten Wurzelblock zählt, übersieht den Kindblock, der die Datenadressen tatsächlich enthält. Alle 1.024 möglichen Kindblöcke zu zählen verschwendet Platz: Nur der benötigte Kindblock wird zugewiesen.

Vergleiche Extents und Ketten

Ein Extent speichert einen Startblock auf der Festplatte und die Länge einer Folge. Eine zusammenhängende Folge von 1.000 Blöcken kann einen Extent statt 1.000 einzelner Zeiger nutzen. Ext4, XFS und NTFS verwenden Extents. Ext4 kann bis zu vier Extents in seinem Inode halten und nutzt für weitere einen Baum. Fragmentierung teilt Folgen auf und erhöht die Anzahl benötigter Extent-Einträge.

Die verkettete Zuweisung folgt einer Kette von Blöcken. Die Dateizuordnungstabelle (FAT) speichert die Verweise auf den jeweils nächsten Block in einer separaten Tabelle, die meist im Speicher zwischengespeichert wird. Ein Verzeichniseintrag bezeichnet den ersten Block, und um einen späteren Block zu erreichen, muss man den vorherigen Verweisen folgen. FAT nutzt keine Unix-Inodes und unterstützt keine zwei harten Links auf eine Datei.

ZuordnungHauptstärkeHauptaufwand
Direkte und indirekte ZeigerDirekter Zugriff auf kleine Dateien; skalierbare IndizierungZusätzliche Zeigerblöcke für große Dateien
ExtentsKompakte Beschreibung zusammenhängender FolgenViele Einträge bei Fragmentierung
FAT-KettenEinfache verkettete Zuweisung mit zwischengespeicherten VerweisenDurchlaufen der Kette für Zugriffe nahe dem Ende

Aufeinanderfolgende Offsets beweisen nie, dass die Daten physisch zusammenhängen. Der Allokator wählt Positionen, und die Zuordnung hält diese Wahl fest.

Wichtige Erkenntnisse

  • Dividiere einen Byteoffset durch die Blockgröße, um seinen bei null beginnenden logischen Block zu finden.
  • Ein indirekter Block enthält Blockadressen; jede zusätzliche Ebene vervielfacht die Reichweite.
  • Zähle zugewiesene Zeigerblöcke getrennt von Datenblöcken.
  • Extents beschreiben zusammenhängende Folgen kompakt.
  • FAT folgt Verweisen auf den nächsten Block statt einem Unix-Inode-Index.
  • Logische Nachbarschaft garantiert keine physische Nachbarschaft.

2.3 Verfolge die Festplattenzugriffe bei Dateioperationen und die Auswirkungen des Cachings

Ein Systemaufruf kann mehrere Festplattenoperationen benötigen oder gar keine. Um die Arbeit zu verfolgen, gehst du die Strukturen durch, die das Dateisystem heranziehen muss, und gibst an, welche davon bereits im Cache liegen.

Löse einen Pfad auf, bevor du Inhalte liest

Im einfachen Modell ohne Cache liest das Öffnen von /docs/plan.txt fünf Blöcke:

  1. Den Wurzel-Inode, dessen Nummer bekannt ist.
  2. Die Daten des Wurzelverzeichnisses, um docs zu finden.
  3. Den Inode von docs.
  4. Die Verzeichnisdaten von docs, um plan.txt zu finden.
  5. Den Inode der Datei.

Jedes Verzeichnis passt in einen Block, und zunächst liegt kein benötigter Block im Speicher. Das Dateisystem prüft die Berechtigungen und erzeugt einen Eintrag für die offene Datei. Das Öffnen hat die Metadaten der Datei gefunden; ihren Inhalt hat es noch nicht gelesen. ext2 und ext4 verwenden die Wurzel-Inode-Nummer 2.

In einem bewusst ohne Cache gehaltenen Lesemodell liest jeder anschließende Blocklesevorgang den Inode der Datei und die Daten und schreibt die Zugriffszeit des Inodes. Zwei Blöcke ergeben sechs zusätzliche Ein-/Ausgaben, einschließlich des Öffnens also elf. Das Schließen benötigt in diesem Modell keinen Festplattenzugriff. Diese Zahlen beschreiben die ausdrücklichen Regeln des Modells für erneutes Lesen und Zeitstempel; ein realer Cache verändert sie.

Berücksichtige die Zuweisung beim Erzeugen

Das Erzeugen von /docs/log.txt erfordert mehr als das Finden eines vorhandenen Inodes. Im selben einfachen Modell erfolgen vier Lesezugriffe für die Inodes und Verzeichnisdaten der Wurzel und von docs. Das Lesen und Schreiben der Inode-Bitmap ergänzt zwei Ein-/Ausgaben. Die Aktualisierung der Daten von docs ergänzt einen Schreibvorgang. Das Lesen und Schreiben des neuen Inodes ergänzt zwei und die Aktualisierung des Inodes von docs eine Ein-/Ausgabe. Insgesamt sind es zehn.

Jeder neu zugewiesene Datenblock ergänzt fünf Ein-/Ausgaben: die Datenbitmap lesen und schreiben, den Inode der Datei lesen und schreiben und den Datenblock schreiben. Zwei Blöcke ergeben daher einschließlich des Erzeugens zwanzig Ein-/Ausgaben. Diese Nachverfolgung zählt die einfachen Datenstrukturen, bevor Journalingzugriffe oder das Verhalten eines realen Caches hinzukommen.

Eine Aufstellung hilft: Liste die Struktur auf, ob sie gelesen oder geschrieben wird und warum. Ein Datenschreibvorgang benötigt auch eine Belegungsinformation und eine Zeigeraktualisierung. Eine Verzeichnisänderung ändert auch die Metadaten dieses Verzeichnisses.

Berücksichtige den Einfluss des Caches

Ein Cache-Treffer nutzt einen Block, der bereits im Speicher liegt. Linux nutzt einen einheitlichen Seitencache gemeinsam mit dem virtuellen Speicher, keinen dauerhaft getrennten Dateicache fester Größe. Ein erneutes Öffnen kann die Verzeichnis- und Inode-Blöcke der vorherigen Pfadauflösung wiederverwenden. Das Lesen zwischengespeicherter Inhalte benötigt keinen Gerätezugriff. Die übliche Linux-Strategie relatime sorgt zudem dafür, dass atime nicht bei jedem Lesen geschrieben wird.

Schreibpufferung verzögert das Senden veränderter Blöcke an die Festplatte. Zwei kurz aufeinanderfolgende Dateierzeugungen können dieselbe Inode-Bitmap im Speicher aktualisieren und sie später einmal schreiben. Das Dateisystem kann die Arbeit für einen besseren Durchsatz umordnen. Eine kurzlebige temporäre Datei kann erzeugt und entfernt werden, bevor ihr Inhalt überhaupt das Speichergerät erreicht.

Pufferung verbessert die Leistung, schafft aber ein Zeitfenster ohne Dauerhaftigkeit. fsync schließt dieses Fenster für eine Datei, indem es auf die erforderlichen Schreibvorgänge wartet. Linux-O_DIRECT erlaubt geeigneten Programmen, den Seitencache zu umgehen, wenn sie ihre eigenen Puffer verwalten; das Umgehen eines Caches ist für sich genommen nicht dasselbe wie das Synchronisieren auf dauerhaften Speicher.

Wichtige Erkenntnisse

  • Verfolge die Pfadauflösung getrennt vom Lesen der Dateidaten.
  • Die Anzahl der Ein-/Ausgaben hängt vom Cacheinhalt und der Zeitstempelstrategie ab.
  • Das Erzeugen einer Datei aktualisiert Belegungsinformationen, Verzeichniseinträge und Inodes.
  • Schreibpufferung bündelt Aktualisierungen und verbessert die Ablaufplanung, verzögert aber die dauerhafte Speicherung.
  • Ein Systemaufruf entspricht keiner festen Anzahl von Geräteoperationen.
3

Erkläre, wie das Fast File System Lokalität zur Beschleunigung nutzt

Eine schnelle Schnittstelle braucht eine zum Speichergerät passende Anordnung. Frühe Unix-Dateisysteme verschwendeten Festplattenbandbreite durch kleine Übertragungen und weit entfernte Metadaten. FFS gruppiert zusammengehörige Objekte und stimmt diese Lokalität auf die Anforderungen großer Dateien ab. Seine Platzierungsregeln und die Berechnung der Teilstückgröße zeigen, wie ein Entwurf die Leistung verbessern kann, während Programme weiterhin vertraute Operationen nutzen.

3.1 Erkläre, warum frühe Unix-Dateisysteme langsam waren und wie Gruppen das Problem beheben

Eine Festplatte kann eine lange Folge von Bytes schnell übertragen, sobald ihr Kopf sie erreicht. Kleine verstreute Anfragen verschwenden Zeit durch Positionierung und Warten auf die Rotation. Das Fast File System ändert die Platzierung so, dass gewöhnliche Dateioperationen mehr von der Übertragungsbandbreite der Festplatte nutzen.

Untersuche die alte Unix-Aufteilung

Die frühe Unix-Aufteilung platzierte alle Inodes nahe dem Anfang und alle Dateidaten dahinter. Das Lesen einer Datei konnte daher eine lange Positionierung von den Metadaten zu den Inhalten erfordern. Eine Freispeicherliste verstreute die Zuweisungen nach und nach, während Dateien erzeugt und gelöscht wurden. Selbst eine sequenzielle Datei konnte viele voneinander unabhängige Festplattenzugriffe verursachen.

Kleine 512-Byte-Blöcke verschlimmerten dies. Für jede Positionierungsverzögerung erhielt man nur eine kurze Übertragung, bevor die nächste Anfrage eine weitere Positionierung oder Rotation benötigte. Historische Messungen ergaben, dass der alte Entwurf teilweise nur 2 % der Festplattenbandbreite erreichte. Diese Zahl beschreibt den gemessenen frühen Entwurf, keine feste Schranke von Unix-Schnittstellen.

Das Anfang der 1980er-Jahre in Berkeley entwickelte Fast File System (FFS) behielt vertraute Aufrufe wie open, read und write bei und änderte zugleich die Aufteilung und die Zuweisungsstrategie. Größere Blöcke, typischerweise 4 KiB, erhöhten die pro Anfrage übertragene Bytezahl. Die nahe Platzierung von Metadaten und Inhalten verringerte die Entfernung zwischen zusammengehörigen Anfragen.

Bilde Gruppen mit eigenen Ressourcen

Ein Zylinder umfasst die Spuren auf den Plattenoberflächen einer Festplatte, die denselben Radius haben. FFS bildet Zylindergruppen aus benachbarten Zylindern. Inode und Daten einer Datei können in derselben Gruppe liegen, sodass die Positionierung von den Metadaten zu den Daten kurz bleibt.

Jede Gruppe enthält eine Superblockkopie, eigene Inode- und Datenbelegungsbitmaps, einen Teil der Inode-Tabelle und Datenblöcke. Die Gruppe ähnelt einem kleinen Dateisystem, aber alle Gruppen gehören zu einem Dateisystem. Eine Superblockkopie hilft auch bei der Wiederherstellung, wenn eine Kopie beschädigt ist. Ext4 hält Kopien nur in ausgewählten Gruppen vor, nicht in jeder Gruppe.

Moderne Laufwerke verbergen ihre physische Geometrie. Ext2, ext3 und ext4 nutzen daher Blockgruppen, Folgen aufeinanderfolgender logischer Blockadressen, um dasselbe Lokalitätsziel zu verfolgen, ohne auf genaue Zylinder angewiesen zu sein.

Verfolge das Erzeugen einer kleinen Datei

Das Erzeugen von /docs/a.txt benötigt einen freien Inode, einen Datenblock, Änderungen an den Belegungsbitmaps und einen neuen Verzeichniseintrag. FFS versucht, die Datei in der Gruppe ihres übergeordneten Verzeichnisses zu platzieren. Der neue Inode, die Dateidaten, Bitmaps und Verzeichnisaktualisierungen können dann nahe beieinanderliegen.

Die Operation benötigt weiterhin mehrere getrennte Aktualisierungen. Die Gruppierung spart Positionierungszeit; sie fasst nicht alle Metadaten und Daten in einem Block zusammen. Eine Anordnung, die die Festplatte berücksichtigt, verringert den Aufwand für den Zugriff auf diese Strukturen, ohne die Dateioperationen des Programms zu ändern.

SpeichereigenschaftFolge für die Platzierung
Positionierung und Rotation der FestplatteNahe Blöcke vermeiden wiederholte lange Positionierungsverzögerungen
Hohe sequenzielle ÜbertragungsrateGrößere Anfragen übertragen mehr Bytes pro Verzögerung
SSD ohne Positionierung oder RotationEntfernung ist viel weniger wichtig, aber Anfragegröße und Schreibverhalten bleiben wichtig

Wichtige Erkenntnisse

  • Lange Positionierungen, Fragmentierung und kleine Blöcke begrenzten den Festplattendurchsatz früher Unix-Systeme.
  • FFS-Gruppen platzieren Inodes, Belegungsbitmaps und Daten nahe beieinander.
  • Moderne Blockgruppen erhalten Lokalität, ohne die physische Festplattengeometrie zu benötigen.
  • FFS verbessert die Platzierung und behält die vorhandene Dateischnittstelle bei.

3.2 Wende die FFS-Platzierungsregeln an und bestimme die Größe von Teilstücken großer Dateien

FFS nutzt Namen als Hinweise darauf, auf welche Dateien ein Programm gemeinsam zugreifen wird. Es begrenzt auch, wie viel Platz eine große Datei in einer Gruppe belegen kann, und stimmt so Lokalität und Platz für spätere Zuweisungen aufeinander ab.

Platziere Verzeichnisse und Dateien

Ein neues Verzeichnis kommt in eine Gruppe mit relativ wenigen Verzeichnissen und vielen freien Inodes. Das verteilt unterschiedliche Verzeichnisse und lässt zugleich Platz für ihre späteren Dateien. Der Inode einer regulären Datei kommt in die Gruppe ihres übergeordneten Verzeichnisses und ihre Daten nahe an ihren Inode.

Für /a/b, /a/c und /a/d werden die drei Dateien nahe dem Verzeichnis /a platziert. Eine Datei /b/f folgt ihrem eigenen übergeordneten Verzeichnis /b, meist in eine andere Gruppe. Das nutzt Namensraumlokalität: Ein Compiler, der an einem Projekt arbeitet, öffnet häufig mehrere Dateien im selben Verzeichnis. Die Verzeichnisbeziehung lässt Zugriffsmuster erwarten; sie ist keine Garantie für jedes Programm.

Mache eine Ausnahme für eine große Datei

Eine große Datei könnte die freien Blöcke ihrer Gruppe verbrauchen und alle späteren Nachbarn an andere Stellen verdrängen. FFS hält den ersten Teil, der über 12 direkte Zeiger erreicht wird, in der Gruppe des Inodes. Bei 4-KiB-Blöcken sind das 48 KiB. Spätere Teilstücke, die jeweils über einen indirekten Block mit 1.024 Zeigern erreicht werden, umfassen 4 MiB Daten und kommen in andere schwach belegte Gruppen.

Dies opfert etwas Lokalität innerhalb der großen Datei, um die Lokalität für die anderen Dateien des Verzeichnisses zu erhalten. Bei der großen Datei fällt zwischen Teilstücken eine Positionierungsverzögerung an. Daher muss jedes Teilstück groß genug sein, damit sich dieser Aufwand lohnt.

Leite die Teilstückgröße her

Die Positionierung dauere T Sekunden und die Übertragungsrate betrage R Byte pro Sekunde. Die Übertragung eines Teilstücks C dauert C/R Sekunden. Der Anteil der gesamten Zeit, der auf die Übertragung entfällt, ist:

F=C/RT+C/R.

Auflösen ergibt:

C=F1−FRT.

Bei 100 MB/s und 10 ms Positionierung beträgt R mal T gleich 1 MB. Ein Teilstück von 1 MB benötigt 10 ms Übertragung plus 10 ms Positionierung und erreicht damit 50 % der maximalen Bandbreite. Für 90 % multiplizierst du 1 MB mit 0,9/0,1 und erhältst 9 MB. Für 99 % beträgt der Faktor 99, was 99 MB ergibt. Wandle Millisekunden in Sekunden um, bevor du mit MB/s multiplizierst. Der Nenner enthält sowohl Übertragungs- als auch Positionierungszeit; würdest du nur durch die Übertragungszeit dividieren, bliebe der Verwaltungsaufwand verborgen.

Übertragungsraten haben sich schneller verbessert als Positionierungsverzögerungen. Um denselben Anteil der maximalen Bandbreite zu erreichen, sind daher größere Teilstücke nötig, wenn der Abstand wächst.

Berücksichtige kleine Dateien und erhalte die Kompatibilität

FFS nutzte außerdem Teilblöcke von 512 Byte, damit kleine Dateien keinen ganzen 4-KiB-Block verschwendeten. Wachsende Dateien wurden in vollständige Blöcke kopiert; die C-Bibliothek pufferte Schreibvorgänge in Stücken von 4 KiB, um wiederholtes Verschieben zu verringern. Die historische Parametrisierung ließ Rotationsabstände zwischen aufeinanderfolgenden Blöcken, damit ein angeforderter nächster Block den Kopf noch nicht passiert hatte. Moderne Spurpuffer machen diese Technik überflüssig, indem sie eine Spur intern einlesen.

Lange Namen, symbolische Links und atomares rename waren zusätzliche Fähigkeiten von FFS. Die Beschleunigung durch die Anordnung selbst erforderte keine Änderung vorhandener Programme.

Wichtige Erkenntnisse

  • FFS nutzt ein Verzeichnis als Hinweis darauf, dass auf seine Dateien gemeinsam zugegriffen wird.
  • Verzeichnisse werden auf Gruppen verteilt; ihre regulären Dateien bleiben in der Nähe.
  • Teilstücke großer Dateien werden verteilt, um Platz für benachbarte Dateien zu lassen.
  • Berücksichtige bei der Berechnung der effektiven Bandbreite Positionierungs- und Übertragungszeit.
  • Teilblöcke verringern Platzverschwendung bei kleinen Dateien; Spurpuffer ersetzen die Abstimmung von Rotationsabständen.
  • FFS fügte Fähigkeiten hinzu und beschleunigte vorhandene Aufrufe.
4

Sichere die Konsistenz eines Dateisystems bei Abstürzen

Ein Absturz kann eine logische Dateioperation zwischen mehreren physischen Schreibvorgängen unterbrechen. Vergleiche die Zustände nach einem unvollständigen Anhängen und untersuche dann, wie ein Prüfprogramm Metadaten repariert und wie ein Journal die Wiederherstellung auf aufgezeichnete Transaktionen stützt. Die Reihenfolge von Daten und die Wiederverwendung von Blöcken zeigen, warum ein gültiger Commit mehr als eine Markierung benötigt. Andere Konsistenzentwürfe lösen dasselbe Problem mit anderem Aufwand.

4.1 Erkläre das Problem der Absturzkonsistenz

Für ein Programm sieht ein Anhängen wie eine Handlung aus. Auf der Festplatte ändert es mehrere Strukturen, und ein Absturz kann dazu führen, dass nur einige davon aktualisiert werden. Bei der Absturzkonsistenz geht es darum, wie sich diese Teilergebnisse verhindern oder reparieren lassen.

Verfolge drei unabhängige Schreibvorgänge

Das Anhängen eines 4-KiB-Blocks an eine vorhandene Datei ändert:

  • Db, den neuen Datenblock mit den angehängten Bytes.
  • I, den Inode mit einer größeren Dateigröße und einem Zeiger auf diesen Block.
  • B, die Datenbitmap, die den Block als belegt markiert.

Erreichen alle drei das Speichergerät, ergibt sich die beabsichtigte konsistente Aktualisierung. Erreicht keiner das Speichergerät, bleibt der alte konsistente Zustand erhalten. Die Gefahr liegt in den sechs teilweisen Kombinationen. Das Gerät kann Anfragen umordnen; sie ohne Warten in einer bestimmten Reihenfolge auszugeben, legt daher die Abschlussreihenfolge nicht fest.

Ordne jedes Teilergebnis ein
Schreibvorgänge, die erhalten bleibenErgebnis
Nur DbNeue Bytes sind vorhanden, aber kein Zeiger erreicht sie; der alte Dateisystemzustand bleibt konsistent
Nur IDer Inode zeigt auf alte Inhalte und die Bitmap bezeichnet den Block weiterhin als frei
Nur BEin belegter Block hat keinen Eigentümer: ein Speicherplatzleck
I und BDie Metadaten stimmen überein, aber der neue Dateibereich enthält alte Inhalte
I und DbDie Datei zeigt auf gültige neue Daten, die die Bitmap weiterhin als frei bezeichnet
B und DbNeue Bytes sind belegt, aber nicht erreichbar: verlorene Daten und ein Speicherplatzleck

Eine Inkonsistenz entsteht, wenn Metadaten nicht übereinstimmen, etwa wenn ein Inode einen Block beansprucht, dessen Belegungsbit frei anzeigt. Der Allokator könnte denselben Block dann einer anderen Datei zuweisen. Ein Speicherplatzleck belegt Speicherplatz, den keine Datei erreichen kann. Datenmüll kann schwerer zu erkennen sein: I und B stimmen vollständig überein, obwohl Db nie angekommen ist.

Db allein verursacht kein Speicherplatzleck, weil die Bitmap die Wiederverwendung dieses Blocks weiterhin erlaubt. Bytes an eine freie Stelle zu schreiben ist nicht dasselbe, wie sie zuzuweisen. B allein verursacht ein Speicherplatzleck, weil die Belegung ohne zugehörigen Zeiger erhalten blieb.

Trenne Struktur und Bedeutung

Ein Prüfprogramm kann Zeiger mit Bitmaps vergleichen. Es kann im Allgemeinen nicht feststellen, ob plausible Bytes diejenigen sind, die ein Programm speichern wollte. Das Ergebnis mit I und B zeigt diese Grenze: Eine strukturell gültige Datei kann falsche Inhalte haben.

Der gewünschte Übergang ist über die Aktualisierung hinweg atomar: Die Wiederherstellung führt zum vollständigen alten oder zum vollständigen neuen Zustand. Ein einfaches Speichermodell bietet atomare Schreibvorgänge nur für einen Sektor, traditionell 512 Byte. Mehrere Dateisystemblöcke überschreiten diese Einheit, sodass das Dateisystem ein stärkeres Protokoll aufbauen muss. Die tatsächlichen Garantien für atomare Schreibvorgänge hängen vom Gerät und der Schnittstelle ab; der Commit-Datensatz des Journalprotokolls muss in die unterstützte atomare Einheit passen.

Pufferung erhöht die Anzahl der Änderungen, die verloren gehen können, ist aber nicht die Grundursache. Selbst wenn jeder Schreibvorgang sofort ausgegeben wird, bleibt zwischen den getrennten Abschlüssen eine mögliche Absturzstelle. Auch das Erzeugen, Umbenennen und Löschen von Dateien ändert mehrere Strukturen. Um ihre Fehlerzustände zu verstehen, beginnst du mit derselben Übung: Bestimme jeden geänderten Block und frag dich, was geschieht, wenn nur ein Teil erhalten bleibt.

Wichtige Erkenntnisse

  • Eine logische Dateioperation kann mehrere unabhängig abgeschlossene Blockschreibvorgänge benötigen.
  • Vergleiche Daten, Inode-Zeiger und Belegungsbits nach jedem möglichen Absturzpunkt.
  • Konsistente Metadaten können dennoch auf falsche Dateiinhalte zeigen.
  • Atomarität über mehrere Blöcke benötigt ein Dateisystemprotokoll über einen einzelnen atomaren Geräteschreibvorgang hinaus.

4.2 Prüfe und repariere ein Dateisystem mit fsck

Ein Dateisystemprüfprogramm repariert Beziehungen zwischen gespeicherten Strukturen, nachdem ein Schaden eingetreten ist. Seine Stärke ist der umfassende Blick auf Metadaten; seine Schwächen sind der Aufwand des Durchsuchens und die fehlende Kenntnis der beabsichtigten Dateiinhalte.

Rekonstruiere die Belegung

fsck, die Abkürzung für die Dateisystemprüfung, untersucht ein nicht sauber geschlossenes Dateisystem vor dem normalen Einhängen. Es prüft, ob die Größe und die Zähler des Superblocks plausibel sind, und kann einen Sicherungs-Superblock verwenden, wenn die Hauptkopie beschädigt ist.

Anschließend durchsucht es Inodes und indirekte Blöcke, um festzustellen, auf welche Datenblöcke Dateien tatsächlich verweisen. Aus diesen Informationen über die Zuordnung stellt es die Belegungsbitmaps wieder her. Zeigt ein ansonsten gültiger Inode auf Block 74, während die Bitmap 74 als frei bezeichnet, muss die Bitmap auf belegt geändert werden. Würde man lediglich der Bitmap vertrauen, könnte eine spätere Zuweisung die Daten der Datei überschreiben.

Die umgekehrte Abweichung ist ein in der Bitmap als belegt markiertes Bit ohne zugehörigen Inode-Zeiger. Das Wiederherstellen der Bitmap kann diesen Speicherplatz zurückgewinnen. Die Reparatur stellt eine konsistente Beziehung her; beliebige fehlende Anwendungsbytes kann sie nicht rekonstruieren.

Prüfe Objekte, Namen und Links

Jeder zugewiesene Inode braucht einen gültigen Typ, etwa reguläre Datei, Verzeichnis oder symbolischer Link. Ein Inode, der nicht repariert werden kann, wird zurückgesetzt und die Belegungsinformationen werden angepasst.

Durch das Durchlaufen des Baums von der Wurzel aus kann fsck die Verzeichnisverweise auf jeden Inode zählen. Es vergleicht diese beobachteten Verweise mit den gespeicherten Linkzählern und korrigiert Fehler. Ein zugewiesener Inode, den kein Verzeichnis erreicht, kann nach lost+found verschoben werden. So erhält der wiederhergestellte Inhalt einen erreichbaren Namen, ohne dass sein ursprünglicher Pfad bekannt sein muss.

Weitere Prüfungen umfassen:

  • Doppelte Zuordnung: Zwei Inodes beanspruchen einen Datenblock. Eine Reparatur kann einen Inode zurücksetzen oder jeder Datei eine eigene Kopie geben.
  • Ungültige Adressen: Zeiger außerhalb des gültigen Bereichs des Dateisystems müssen zurückgesetzt werden.
  • Verzeichnisstruktur: . und .. müssen gültig sein und in der einfachen Verzeichnisstruktur die ersten Einträge belegen, Einträge müssen auf zugewiesene Inodes verweisen und Verzeichnisse dürfen nicht mehrere übergeordnete Verzeichnisse haben.

Diese Prüfungen wirken zusammen. Das Zurücksetzen eines ungültigen Inodes ändert auch, welche Blöcke belegt sein sollten und welche Verzeichniseinträge gültig bleiben. Eine Reparatur braucht daher einen zusammenhängenden Blick auf die Metadaten und nicht nur eine Liste einzelner verdächtiger Bits.

Verstehe, was ein fehlerfreies Ergebnis aussagt

Angenommen, Inode und Bitmap eines Anhängevorgangs haben die Festplatte erreicht, die Daten aber nicht. Der Zeiger liegt im gültigen Bereich, das Belegungsbit ist gesetzt und die Linkstruktur ist gültig. fsck findet keine Abweichung in den Metadaten, die es reparieren könnte. Die Datei kann die Prüfung bestehen und dennoch in ihrem neu hinzugefügten Bereich alte Bytes enthalten.

Die Laufzeit hängt außerdem hauptsächlich von der Größe des Dateisystems ab, nicht vom Umfang der Änderungen vor einem Absturz. Ein Absturz während einer Aktualisierung von drei Blöcken kann dennoch das Durchsuchen aller Metadaten erfordern. Bei einem großen Dateisystem kann das Minuten bis Stunden dauern; währenddessen ist der normale Zugriff nicht verfügbar.

Journaling verringert den üblichen Wiederherstellungsaufwand nach einem Absturz, indem es kürzlich erfolgte Aktualisierungen aufzeichnet. Es macht ein Prüfprogramm nicht überflüssig: Softwarefehler oder ausfallende Hardware können Strukturen auf eine Weise beschädigen, die das erneute Einspielen des Journals nicht reparieren kann. fsck bleibt für diese Fälle ein Reparaturwerkzeug.

Wichtige Erkenntnisse

  • fsck rekonstruiert die Belegung aus Inode-Zeigern und korrigiert Beziehungen zwischen Metadaten.
  • Das Durchlaufen von Verzeichnissen prüft Linkzähler und findet nicht erreichbare zugewiesene Inodes.
  • Eine Prüfung kann doppelte Blockzuordnungen und ungültige Zeiger reparieren.
  • Eine fehlerfreie Metadatenprüfung kann nicht feststellen, ob Anwendungsbytes korrekt sind.
  • Das vollständige Durchsuchen der Metadaten skaliert mit der Dateisystemgröße, selbst nach einer kleinen unterbrochenen Aktualisierung.

4.3 Sichere Aktualisierungen durch Daten-Journaling und spiele das Protokoll erneut ein

Ein Journal zeichnet eine Aktualisierung auf, bevor das Dateisystem ihre gewöhnlichen Speicherpositionen überschreibt. Nach einem Absturz zeigt diese Aufzeichnung der Wiederherstellung, welche vollständigen Änderungen erneut ausgeführt werden können. Das ist Vorausprotokollierung. Ext3, ext4, XFS und NTFS nutzen Journaling, obwohl sich ihre genauen Protokollformate unterscheiden.

Beschreibe eine Aktualisierung als Transaktion

Bei einem Anhängevorgang protokolliert Daten-Journaling Kopien des neuen Inodes I, der Bitmap B und des Datenblocks Db. Ein Transaktionsanfangsdatensatz, TxB, enthält eine Kennung und die endgültigen Zielpositionen der Blöcke. Ein Transaktionsenddatensatz, TxE, enthält die zugehörige Kennung und markiert den Abschluss.

Das Protokollieren vollständiger Ersatzblockabbilder ist physische Protokollierung. Das Protokollieren einer Operationsbeschreibung heißt dagegen logische Protokollierung. Die physische Wiederholung hat eine nützliche Eigenschaft: Wird dasselbe Abbild erneut an dieselbe Adresse geschrieben, hat das dieselbe Wirkung. Die Wiederherstellung kann daher einen Checkpoint wiederholen, der vor dem Absturz teilweise abgeschlossen wurde.

Setze den Abschluss hinter die Nutzdaten

Das grundlegende Protokoll hat vier Phasen:

  1. Journal schreiben: TxB sowie I, B und Db ins Journal schreiben und auf den dauerhaften Abschluss warten.
  2. Commit: TxE schreiben und warten. Die Transaktion ist nun abgeschlossen.
  3. Checkpoint: I, B und Db aus dem Journal an ihre endgültigen Positionen kopieren.
  4. Freigeben: Den Journalplatz dieser Transaktion für eine spätere Wiederverwendung freigeben.

TxE darf nicht vor seinen Nutzdaten dauerhaft gespeichert werden. Würden alle fünf Blöcke ohne Garantie für die Reihenfolge ausgegeben, könnte ein Gerät TxB und TxE abschließen und Db ungeschrieben lassen. Die Wiederherstellung würde eine unvollständige Transaktion für gültig halten. Im Grundmodell passt TxE in einen atomaren Sektorschreibvorgang und ist daher als vollständiger Commit-Datensatz entweder vorhanden oder nicht vorhanden.

Auch Schreibcaches von Geräten müssen die Grenze für dauerhafte Speicherung beachten. Das Leeren des Caches oder erzwungene Schreibvorgänge verhindern, dass ein flüchtiger Gerätecache dem Protokoll sichere Nutzdaten vorgaukelt, obwohl ein Stromausfall sie noch löschen könnte.

Stelle den Zustand nach zwei Absturzpunkten wieder her

Ein Absturz nach den Nutzdaten, aber vor TxE, hinterlässt eine nicht abgeschlossene Transaktion. Die Wiederherstellung ignoriert sie und behält den alten Dateizustand bei.

Ein Absturz nach TxE, aber während des Checkpointings, hinterlässt eine abgeschlossene Transaktion. Die Wiederherstellung schreibt alle ihre Abbilder der Reihe nach an ihre endgültigen Positionen. Einige Schreibvorgänge wiederholen möglicherweise bereits erledigte Arbeit, was für diese Blockabbilder harmlos ist. Das ist Wiederherstellung durch erneutes Ausführen. Journalplatz darf erst wiederverwendet werden, wenn die abgeschlossenen Abbilder ihre endgültigen Positionen erreicht haben.

Das Journal ist ein Ringprotokoll. Sein Superblock verfolgt den aktiven Bereich und erlaubt so die Wiederverwendung abgeschlossener Bereiche. Werden mehrere Aktualisierungen zu einer Transaktion gebündelt, kann ein gemeinsam genutzter Verzeichnisblock oder eine Bitmap einmal protokolliert werden. Das standardmäßige Commit-Intervall von ext4 beträgt 5 Sekunden, sodass der Abschluss nicht automatisch unmittelbar nach jedem Anwendungsschreibvorgang erfolgt.

Unterscheide Prüfsummen und Dauerhaftigkeit

Eine Transaktionsprüfsumme kann fehlende oder unvollständig geschriebene Nutzdatenblöcke aufdecken, selbst wenn ein Commit-Datensatz vorhanden ist. Ein prüfsummenbasiertes Protokoll kann Journalschreibvorgänge gemeinsam ausgeben und nur Transaktionen akzeptieren, deren Prüfung erfolgreich ist. Prüfsummen erkennen unvollständige Datensätze; das Leeren von Caches stellt sicher, dass bestätigte Bytes tatsächlich erhalten bleiben.

Ein gepufferter, nicht abgeschlossener Schreibvorgang einer Anwendung kann weiterhin verschwinden. Ein Programm, das einen dauerhaften Abschluss benötigt, nutzt fsync und prüft den Erfolg.

Wichtige Erkenntnisse

  • Vorausprotokollierung zeichnet vollständige Aktualisierungen auf, bevor ihre endgültigen Positionen geändert werden.
  • Im Grundprotokoll werden die Nutzdaten vor dem Commit-Datensatz dauerhaft gespeichert.
  • Die Wiederherstellung führt abgeschlossene Transaktionen erneut aus und ignoriert nicht abgeschlossene.
  • Das erneute Schreiben identischer Blockabbilder ist nach einem teilweisen Checkpoint sicher.
  • Das Checkpointing muss abgeschlossen sein, bevor Journalplatz wiederverwendet wird.
  • Bündelung verringert Metadatenzugriffe, während fsync die benötigte Dauerhaftigkeit herstellt.

4.4 Verringere den Journalingaufwand und vergleiche andere Ansätze

Daten-Journaling schreibt Dateiinhalte ins Journal und dann an ihre endgültigen Positionen. Das Protokollieren allein der Metadaten verringert diese Zugriffe, doch die Reihenfolge von Daten und Metadaten bestimmt weiterhin, was bei der Wiederherstellung sichtbar werden kann.

Schreibe Daten vor dem Abschluss ihrer Zeiger

Beim geordneten Metadaten-Journaling geht Db direkt an seine endgültige Position. TxB, I und B gehen ins Journal. Diese beiden Gruppen von Schreibvorgängen können parallel ablaufen, müssen aber beide abgeschlossen sein, bevor TxE die Metadaten festschreibt. Nach dem Abschluss können I und B per Checkpoint übertragen und der Journalplatz freigegeben werden.

Die Abhängigkeit ist entscheidend: Der Block, den ein Zeiger bezeichnet, muss bereit sein, bevor dieser Zeiger wiederhergestellt werden kann. Wird I zuerst festgeschrieben, kann die Wiederherstellung einen gültigen Zeiger auf Bytes eines früheren Nutzers des Blocks einsetzen. Die Metadaten würden übereinstimmen, ohne die beabsichtigten Daten zu enthalten.

Ext4-ModusWas ins Journal gelangtRegel für Daten vor dem Commit
data=journalDaten und MetadatenDaten sind Teil der protokollierten Transaktion
data=orderedMetadatenReferenzierte Daten erreichen ihre endgültige Position vor dem Commit
data=writebackMetadatenKeine solche Garantie für die Reihenfolge der Daten

Der geordnete Modus ist der Standard. Metadaten-Journaling allein bedeutet nicht, dass der geordnete Modus verwendet wird: Der Writeback-Modus kann strukturell intakte Dateien mit veralteten Inhalten wiederherstellen. Der Daten-Journalingmodus veranschaulicht das vollständige Protokoll, verursacht aber einen zweiten Schreibvorgang für die Dateidaten.

Verhindere, dass erneutes Einspielen einen wiederverwendeten Block beschädigt

Verzeichnisinhalte zählen als Metadaten. Angenommen, ein Verzeichnisblock an Adresse 1000 wird protokolliert, dann wird das Verzeichnis entfernt und dieselbe Adresse für gewöhnliche Dateidaten verwendet. Diese neuen Benutzerdaten werden im Modus mit reinem Metadaten-Journaling nicht protokolliert. Das erneute Einspielen des alten Verzeichnisabbilds nach einem Absturz würde die Bytes der neuen Datei überschreiben.

Ein abgeschlossener Widerrufsdatensatz weist die Wiederherstellung an, protokollierte Kopien dieses Blocks aus Transaktionen bis einschließlich der widerrufenden Transaktion zu überspringen. Er verbietet nicht jede zukünftige Verwendung der Adresse. Protokolliert eine spätere Transaktion diesen Block erneut, kann das spätere Abbild weiterhin eingespielt werden. Diese zeitliche Grenze unterscheidet den Widerruf von einer dauerhaften Markierung eines Blocks als unbrauchbar.

Vergleiche Alternativen

Soft Updates setzen Abhängigkeiten zwischen gewöhnlichen Schreibvorgängen ohne Journal durch. Das Schreiben initialisierter Daten vor einem Zeiger verhindert erreichbaren Datenmüll, obwohl unterbrochene Operationen Speicherplatzlecks hinterlassen können, die eine spätere Hintergrundprüfung zurückgewinnt. Das FFS von FreeBSD nutzt diesen Ansatz. Die Verfolgung aller Abhängigkeiten erschwert die Implementierung.

Copy-on-Write (COW) schreibt geänderte Blöcke an ungenutzte Positionen und veröffentlicht den neuen Baum durch eine atomare Umstellung des Wurzelzeigers. Der alte Baum bleibt bis zur Umstellung verfügbar. ZFS, Btrfs und WAFL nutzen verwandte Entwürfe; das Erhalten alter Blöcke ermöglicht auch Snapshots.

Forschungsentwürfe mit Rückverweisen speichern die Zuordnung von Daten zurück zu Inodes, sodass unvollständige Aktualisierungen erkennbare Abweichungen hinterlassen. Optimistische Absturzkonsistenz verringert das Warten und nutzt Prüfsummen und andere Prüfungen, um unvollständige Arbeit zu erkennen. Jeder Ansatz wägt Schreibzugriffe, Wiederherstellungsgarantien und Implementierungsaufwand gegeneinander ab. Geordnetes Metadaten-Journaling hält die Wiederherstellung kurz und schreibt gewöhnliche Dateidaten einmal.

Wichtige Erkenntnisse

  • Geordnetes Journaling sendet Daten an ihre endgültigen Positionen, bevor die zugehörigen Metadatenzeiger festgeschrieben werden.
  • Reines Metadaten-Journaling und geordnetes Journaling sind keine Synonyme.
  • Widerrufsdatensätze verhindern, dass veraltete protokollierte Abbilder wiederverwendete Blöcke überschreiben.
  • Soft Updates ordnen Abhängigkeiten; Copy-on-Write veröffentlicht einen neuen Baum.
  • Weniger Schreibzugriffe können eine sorgfältigere Reihenfolge oder Prüfung erfordern.
5

Erkläre, wie ein logstrukturiertes Dateisystem schreibt und Speicherplatz zurückgewinnt

Sequenzielle Schreibvorgänge nutzen eine Festplatte gut aus, doch das Verschieben jedes aktualisierten Blocks schafft neue Probleme beim Auffinden und bei der Speicherplatzverwaltung. Verfolge LFS von gepufferten Segmenten über die Inode-Zuordnungstabelle und den Checkpoint-Bereich und sieh dann, wie der Cleaner gültige Blöcke findet und freie Segmente wiederherstellt. Die Wiederherstellung muss die neueste gültige Zuordnung ermitteln, ohne einen unterbrochenen Checkpoint für vollständig zu halten.

5.1 Schreibe sequenziell in Segmente und finde Inodes über die Inode-Zuordnungstabelle

Ein logstrukturiertes Dateisystem wandelt verstreute kleine Aktualisierungen in große sequenzielle Schreibvorgänge um. Das hilft bei einer Festplatte mit hoher Übertragungsrate, deren Positionierungs- und Rotationsverzögerungen weiterhin aufwendig sind.

Sammle Aktualisierungen in einem Segment

Das von Rosenblum und Ousterhout entwickelte und 1991 veröffentlichte LFS aus Berkeley ging von veränderten Arbeitslasten aus. Größere Arbeitsspeicher bedienten mehr Lesezugriffe aus dem Cache, sodass Schreibvorgänge einen größeren Anteil der Festplattenzugriffe ausmachten. Die sequenzielle Bandbreite wuchs schneller als die Positionierungsgeschwindigkeit. FFS benötigte beim Erzeugen einer kleinen Datei weiterhin mehrere kurze Schreibvorgänge für Metadaten und Daten, und auch bei Paritäts-RAID waren kleine Schreibvorgänge ungünstig.

LFS puffert geänderte Daten, Inodes und Zuordnungsinformationen gemeinsam im Speicher. Es schreibt sie als ein großes Segment in einen ungenutzten Festplattenbereich. Die Aktualisierung eines Blocks erzeugt eine neue Version an einer neuen Adresse; die vorherige Version bleibt physisch vorhanden, bis die Bereinigung ihr Segment zurückgewinnt.

Segmente amortisieren die Positionierung ebenso wie große FFS-Teilstücke. Bei einer Rate R, einer Positionierungszeit T und einem gewünschten Übertragungszeitanteil F beträgt die gepufferte Größe:

D=F1−FRT.

Bei 200 MB/s und 5 ms erfordern 95 % genau 19 MB. Die Übertragung dauert 95 ms, die Positionierung 5 ms und die effektive Rate beträgt 19 MB pro 0,1 s = 190 MB/s. Ein hoher angestrebter Anteil kann ein Segment erfordern, das größer als die üblichen Hunderte Kilobyte bis mehrere Megabyte ist. Die erforderliche Größe ergibt sich aus dem Gerät und dem Ziel, nicht aus dem Wort „Segment“.

Finde einen Inode, der seinen Ort immer wieder ändert

Die Formel für eine feste Inode-Tabelle funktioniert nicht mehr: Jede Inode-Aktualisierung wird an eine neue Adresse geschrieben. LFS ergänzt eine Inode-Zuordnungstabelle, kurz imap, die jede Inode-Nummer auf ihre neueste Festplattenadresse abbildet. Aktualisierte imap-Stücke werden neben die Inodes, die sie beschreiben, in das Protokoll geschrieben.

Ein fester Checkpoint-Bereich (CR) hält fest, wo sich die neuesten imap-Stücke befinden. Er wird periodisch aktualisiert, zum Beispiel alle 30 Sekunden, sodass der gelegentliche Schreibvorgang an einer festen Position die Zugriffe nicht dominiert.

Die Suchfolge lautet:

  1. Lies beim Einhängen den CR, um die aktuellen imap-Stücke zu finden.
  2. Lade die imap in den Speicher.
  3. Suche die angeforderte Inode-Nummer in der imap.
  4. Lies diesen neuesten Inode und folge seinen Datenzeigern.

Sobald die imap im Cache liegt, folgen gewöhnliche Dateilesezugriffe weitgehend demselben Weg vom Inode zu den Daten wie in FFS. Die zusätzliche Zuordnung macht das Verschieben mit vertretbarem Aufwand möglich, ohne die stabile Identität der Datei zu ändern.

Halte Verzeichniseinträge stabil

Ein Verzeichnis speichert Namen und Inode-Nummern. Wird /docs/report.txt aktualisiert, wechselt sein Inode den Ort, behält aber seine Nummer. Die imap ändert sich; der Verzeichniseintrag muss sich allein wegen dieser Verschiebung nicht ändern.

Ohne diese zusätzliche Zuordnung müsste ein Verzeichnis mit physischen Inode-Adressen jedes Mal neu geschrieben werden, wenn sich ein untergeordneter Inode verschiebt. Sein eigener Inode würde sich dann ebenfalls verschieben und eine Änderung im übergeordneten Verzeichnis erzwingen, und so weiter bis zur Wurzel. Die imap unterbricht dieses rekursive Aktualisierungsproblem.

LFS macht Schreibvorgänge sequenziell, nicht alle Lesezugriffe. Unveränderte Blöcke einer Datei können in älteren Segmenten bleiben, während spätere Versionen anderer Blöcke an andere Stellen wandern. Beim Lesen dieser Datei können weiterhin Positionierungen zwischen Segmenten nötig sein; große Speichercaches gehören zur Motivation des Entwurfs.

Wichtige Erkenntnisse

  • LFS schreibt gepufferte Daten und Metadaten gemeinsam in großen Segmenten an ungenutzte Stellen.
  • Die imap bildet stabile Inode-Nummern auf wechselnde Inode-Adressen ab.
  • Der feste Checkpoint-Bereich gibt die Position der neuesten imap-Stücke an.
  • Verzeichniseinträge behalten Inode-Nummern und vermeiden so das rekursive Neuschreiben übergeordneter Verzeichnisse.
  • Die Segmentgröße muss die Positionierung amortisieren; Lesezugriffe können weiterhin verstreut sein.

5.2 Gewinne Speicherplatz mit dem Cleaner zurück und stelle den Zustand nach einem Absturz wieder her

Das Schreiben neuer Versionen an ungenutzte Stellen lässt alte Bytes physisch zurück. LFS muss alte, nicht erreichbare Versionen von gültigen Blöcken unterscheiden, große freie Bereiche zurückgewinnen und nach einem Absturz eine nutzbare Zuordnung wiederherstellen.

Bereinige ganze Segmente

Der Cleaner liest teilweise belegte Segmente, kopiert ihre gültigen Blöcke in weniger neue Segmente und gibt die alten Segmente frei. Enthalten vier gleich große Segmente jeweils ein Viertel gültige Daten, füllen ihre gültigen Daten zusammen ein neues Segment. Die Freigabe der vier alten Segmente nach dem Kopieren gewinnt drei Segmente nutzbarer Kapazität.

Das Bereinigen ganzer Segmente erhält große zusammenhängende Bereiche für spätere sequenzielle Schreibvorgänge. Das Kopieren verursacht Aufwand: Gültige Blöcke werden erneut gelesen und geschrieben, obwohl keine Anwendung sie geändert hat. Bei einer fast vollen Festplatte mit überwiegend gültigen Daten in den Segmenten muss möglicherweise viel kopiert werden, um wenig freien Platz zurückzugewinnen.

Entscheide, ob ein Block gültig ist

Eine Segmentzusammenfassung bezeichnet den zu jedem Block gehörenden Inode und den logischen Dateiblockoffset. Um einen Block an Adresse A zu prüfen, suchst du mithilfe der imap den neuesten zugehörigen Inode. Folge seinem Zeiger für den gespeicherten logischen Block. Ist der Zeiger weiterhin gleich A, ist dies die gültige Version. Zeigt er anderswohin, ist A veraltet.

Eine Zusammenfassung ordnet beispielsweise Adresse 600 dem Inode 14 und dem logischen Block 2 zu. Der aktuelle Inode 14 verweist für den logischen Block 2 auf Adresse 920. Block 600 ist ungültig, selbst wenn seine Bytes wie gültige Daten aussehen. Die Gültigkeit hängt von der aktuellen Erreichbarkeit ab, nicht davon, wie kürzlich ein Block geschrieben wurde oder ob sein Inhalt nützlich aussieht.

Versionsnummern beschleunigen das Aussortieren. Wird eine Datei gelöscht oder auf null gekürzt, steigt ihre Version in der imap. Ein Segmentblock mit einer älteren Version kann als ungültig eingestuft werden, ohne den Inode zu lesen.

Die Bereinigungsstrategie berücksichtigt auch erwartete Änderungen. Heiße Segmente enthalten häufig überschriebene Blöcke; durch Warten können weitere ihrer Blöcke ungültig werden, ohne sie zu kopieren. Kalte Segmente ändern sich wenig, sodass die ursprüngliche LFS-Strategie sie früher bereinigt. Die Strategie muss den Anteil gültiger Daten, das Alter und den verfügbaren Platz gegeneinander abwägen; die Temperatur eines Segments allein misst nicht den unmittelbaren Kopieraufwand.

Stelle die Zuordnung und kürzliche Änderungen wieder her

LFS hält zwei Checkpoint-Bereiche an gegenüberliegenden Enden der Festplatte vor und aktualisiert sie abwechselnd. Jede Aktualisierung schreibt einen Kopf mit Zeitstempel, den Hauptteil und einen abschließenden passenden Zeitstempel. Die Wiederherstellung wählt den neuesten Bereich, dessen Anfang und Ende übereinstimmen. Eine unterbrochene neuere Aktualisierung verdrängt keinen älteren vollständigen Checkpoint.

Der Checkpoint enthält möglicherweise nicht die zuletzt abgeschlossenen Segmente. Die Wiederherstellung führt daher vom darin gespeicherten Protokollende aus eine Vorwärtswiederherstellung durch: Sie findet gültige spätere Aktualisierungen und wendet sie an, um die aktuelle Zuordnung wiederherzustellen. Daten, die nie eine gültige wiederherstellbare Aktualisierung bildeten, können nach einem Stromausfall nicht aus dem Speicher rekonstruiert werden.

Verwandte Copy-on-Write-Systeme bewahren alte Blöcke auf, um Snapshots zu unterstützen; ZFS, Btrfs und WAFL teilen diese Grundidee. SSD-Controller nutzen häufig logstrukturierte Flash Translation Layers, während F2FS logstrukturierte Ideen auf Dateisystemebene für Flash-Speicher anwendet. Alle benötigen weiterhin eine Möglichkeit, den von veralteten Versionen hinterlassenen Platz zurückzugewinnen.

Wichtige Erkenntnisse

  • Der Cleaner kopiert gültige Blöcke in weniger Segmente und gibt die alten Segmente frei.
  • Die Gültigkeit ergibt sich aus der neuesten Inode-Zuordnung, nicht aus dem scheinbaren Inhalt eines Blocks.
  • Abweichende Versionsnummern können ungültige Blöcke schnell erkennen lassen.
  • Wartest du mit der Bereinigung heißer Segmente, kannst du das Kopieren von Blöcken vermeiden, die bald ungültig werden.
  • Die Wiederherstellung wählt einen vollständigen Checkpoint und führt gültige spätere Aktualisierungen durch Vorwärtswiederherstellung aus.
  • Die Bereinigung verursacht zusätzliche Ein-/Ausgaben und kann aufwendig werden, wenn wenig freier Platz bleibt.
6

Vergleiche, wie verteilte Dateisysteme Dateien über ein Netzwerk bereitstellen

Werden Dateien zwischen Rechnern geteilt, können Antworten ausbleiben und zwischengespeicherte Kopien voneinander abweichen. NFS zeigt, wie in sich vollständige Anfragen und sichere Wiederholungen eine Art der Wiederherstellung nach Ausfällen vereinfachen. AFS zeigt, wie Ganzdatei-Caching und Callbacks die Serverarbeit verringern. Vergleiche ihre Grenzen für die gemeinsame Nutzung und ihren Zustand bei Ausfällen, um vorherzusagen, wann ein anderer Client eine Änderung sieht und wann gleichzeitige Aktualisierungen verloren gehen können.

6.1 Erkläre, wie NFS mithilfe zustandsloser Anfragen nach Ausfällen weiterarbeitet

Ein verteiltes Dateisystem hält Dateien auf einem Server vor, während Programme auf Client-Rechnern vertraute Dateiaufrufe nutzen. Der Client übersetzt diese Aufrufe in Netzwerkanfragen. Verzögerungen und Ausfälle werfen eine Frage auf, die bei lokalen Aufrufen meist verborgen bleibt: Was soll ein Client tun, wenn er nicht erkennen kann, ob eine Anfrage abgeschlossen wurde?

Halte den Zustand offener Dateien auf dem Client

Das Network File System (NFS) von Sun entstand in den 1980er-Jahren. NFSv2 machte seinen Server hinsichtlich offener Dateien zustandslos. Der Server speichert Dateien, merkt sich aber nicht die Deskriptoren oder aktuellen Offsets jedes Clients. Jede Anfrage enthält genug Informationen zur Ausführung ohne eine vorherige Öffnungsanfrage.

Ein Dateihandle bezeichnet das Server-Volume, die Inode-Nummer und die Inode-Generation. Die Generation ändert sich, wenn eine Inode-Nummer wiederverwendet wird. Dadurch kann ein altes Handle nicht versehentlich eine andere Datei am wiederverwendeten Platz bezeichnen.

Um /home/ana/notes.txt zu öffnen, beginnt der Client mit einem Wurzel-Handle und sendet LOOKUP für home, ana und notes.txt. Das resultierende Handle behält er in seinem eigenen Zustand für offene Dateien. Das Lesen der ersten 4 KiB wird zu einer READ-Anfrage mit diesem Handle, Offset 0 und Anzahl 4.096. Das Schließen des lokalen Deskriptors benötigt keine NFSv2-CLOSE-Anfrage, weil der Server keinen offenen Eintrag freizugeben hat.

Wiederhole eine Anfrage ohne erneute Wirkung

Trifft keine Antwort ein, kann der Client nicht zwischen einer verlorenen Anfrage, einem nicht verfügbaren Server und einer verlorenen Antwort unterscheiden. Nach einer Zeitüberschreitung sendet er die Anfrage erneut.

Eine Operation ist idempotent, wenn ihre Wiederholung dieselbe Wirkung wie ihre einmalige Ausführung hat. READ, LOOKUP und GETATTR ändern gespeicherte Inhalte nicht. Ein WRITE mit ausdrücklich angegebenem Offset schreibt in diesem Modell bei einer Wiederholung ebenfalls sicher dieselben Bytes an dieselbe Stelle. Die Wiederholung einer Anfrage mit der Anweisung „Hänge diese Bytes am aktuellen Ende an“ würde dagegen eine zweite Kopie hinzufügen; der Offset in einem NFS-WRITE vermeidet diese Mehrdeutigkeit.

Einige Anfragen erfordern besondere Sorgfalt. Wird ein erfolgreiches MKDIR nach dem Verlust seiner Antwort wiederholt, kann „existiert bereits“ zurückgegeben werden. Das Verzeichnis ist vorhanden, aber die wiederholte Antwort unterscheidet sich von der ursprünglichen Erfolgsmeldung. Zustandslose Wiederherstellung macht nicht jede Operation zu einer einfach wiederholbaren Anfrage.

Mache Bestätigungen verlässlich

NFSv2 muss ein WRITE dauerhaft speichern, bevor es den Erfolg bestätigt. Andernfalls könnte der Server einen Block bestätigen, ihn bei einem Absturz aus dem Speicher verlieren und dann spätere Blöcke annehmen. Der Client würde glauben, dass alle Schreibvorgänge erfolgreich waren, während der Datei eine Aktualisierung in der Mitte fehlt.

Bestätigungen nach dauerhafter Speicherung vermeiden diesen Fehler auf Kosten der Leistung. NFSv3 führte nicht dauerhaft bestätigte Schreibvorgänge ein, gefolgt von COMMIT, sodass mehrere Schreibvorgänge gemeinsam dauerhaft werden können. Der Client muss eine nicht dauerhafte Bestätigung von einem dauerhaften Abschluss unterscheiden.

Unterscheide die Protokollversionen

Ein zustandsbehaftetes Protokoll braucht Mechanismen, um den Zustand offener Dateien und Sperren nach einem Serverneustart wiederherzustellen und den Zustand abgestürzter Clients freizugeben. NFSv4 nimmt diese Komplexität bewusst in Kauf: Es hat OPEN, CLOSE, Sperren und zeitlich begrenzte Leases, die Clients erneuern. Der Linux-Client versucht normalerweise zuerst Version 4.2 und greift bei Bedarf auf ältere Versionen zurück. Die Bezeichnung von NFSv2 als zustandslos beschreibt daher nicht jede NFS-Version.

Wichtige Erkenntnisse

  • NFSv2 hält Deskriptoren und Offsets auf Clients; jede Anfrage ist in sich vollständig.
  • Dateihandles enthalten eine Generation, um veraltete Identitäten nach der Wiederverwendung eines Inodes abzulehnen.
  • Ausdrücklich angegebene Offsets machen die Wiederholung desselben WRITE im Wiederholungsmodell sicher.
  • NFSv2 bestätigt Schreibvorgänge erst nach dauerhafter Speicherung; NFSv3 kann die Dauerhaftigkeit bis COMMIT aufschieben.
  • NFSv4 ist zustandsbehaftet und nutzt Wiederherstellungsmechanismen und Leases.

6.2 Vergleiche Caching und Konsistenz bei NFS und AFS

Clientseitiges Caching spart Netzwerkübertragungen, erzeugt aber mehrere Kopien gemeinsam genutzter Dateien. Die Konsistenzregel bestimmt, wann ein anderer Rechner eine alte Kopie nicht mehr verwenden darf und die Änderungen des schreibenden Clients holen muss.

Prüfe NFS-Caches an Grenzen der gemeinsamen Nutzung

Bei Close-to-Open-Konsistenz von NFS sendet das Schließen einer geänderten Datei gepufferte Schreibvorgänge an den Server. Ein späteres Öffnen auf einem anderen Client prüft die Aktualität und sieht diese Änderungen. GETATTR oder eine entsprechende Prüfung vergleicht Serverattribute mit zwischengespeicherten Attributen und verwirft veraltete zwischengespeicherte Daten, wenn eine Änderung erkannt wird.

Eine Prüfung bei jedem Zugriff würde den Server belasten. Linux speichert Attribute regulärer Dateien standardmäßig für Zeiträume zwischen 3 und 60 Sekunden zwischen. Ein Prozess, der eine Datei geöffnet hält, kann daher zwischen den Prüfungen veraltete zwischengespeicherte Daten lesen. Das Öffnen ist eine stärkere Grenze für die gemeinsame Nutzung als ein beliebiger Lesezugriff über einen bereits offenen Deskriptor. Das Close-to-Open-Verhalten verspricht keine sofortige Sichtbarkeit jedes einzelnen Schreibvorgangs.

Nutze ganze Dateien mit AFS-Callbacks erneut

Das Andrew File System (AFS) wurde in den 1980er-Jahren an der Carnegie Mellon University entworfen, um viele Clients pro Server zu unterstützen. Existiert keine gültige lokale Kopie, holt das Öffnen die gesamte Datei auf die lokale Festplatte. Lese- und Schreibvorgänge nutzen dann diese Kopie, und das Schließen einer geänderten Datei sendet die gesamte neue Version an den Server. Eine gültige zwischengespeicherte Kopie kann erneut geöffnet werden, ohne sie nochmals herunterzuladen.

AFSv1 prüfte die Gültigkeit bei jedem Öffnen und überließ die Pfadauflösung dem Server. AFSv2 verlagerte die Pfadauflösung auf Clients, die Verzeichnisse zwischenspeichern, und führte Callbacks ein. Der Server verspricht, einen Client zu benachrichtigen, wenn sich ein zwischengespeichertes Objekt ändert. Bis dieses Versprechen aufgehoben wird, nutzt der Client seine Kopie ohne wiederholte Prüfungen. Seine Dateikennung enthält ein Volume, eine Dateikennung und einen Eindeutigkeitswert.

Verfolge zwei überlappende Sitzungen

Angenommen, die Clients A und B öffnen beide eine Datei. A ändert seine lokale Kopie und schließt die Datei, wodurch die neue Version an den Server gesendet wird. Der Server hebt die Callbacks der anderen Clients auf. Ein späteres Öffnen auf B holt die neue Version, aber die bereits offene Sitzung von B behält ihre vorhandene Kopie bis zum Schließen und erneuten Öffnen.

Ändern beide Rechner ihre Kopien, ersetzt der zuletzt schließende die gesamte Datei auf dem Server. Blöcke aus den beiden Kopien werden nicht zusammengeführt. Auch zwei Änderungen an unterschiedlichen Offsets können zum Verlust der Änderungen eines Clients führen, weil nach dem Prinzip der zuletzt Schließende gewinnt eine vollständige Version ausgewählt wird. Prozesse auf einem Client-Rechner sehen die Schreibvorgänge der jeweils anderen sofort.

Callbacks sind Serverzustand. Nach einem Clientneustart sind zwischengespeicherte Dateien verdächtig, weil Benachrichtigungen verpasst worden sein können. Nach einem Serverneustart müssen Clients die verlorenen Callback-Zusagen durch Lebenszeichen oder eine Servermitteilung erkennen und die Gültigkeit erneut prüfen.

Stimme das Caching auf die Arbeitslast ab
Arbeitslast oder AspektNFSAFS
Kleiner Teil einer großen DateiÜberträgt angeforderte BlöckeGanzdateiübertragung kann Aufwand verschwenden
Wiederholtes Lesen großer Dateien, die nicht in den Speicher passenHängt von verfügbaren zwischengespeicherten Blöcken abLokale Festplattenkopie vermeidet weitere Netzwerkdownloads
Verfolgung der AktualitätAttributprüfungenServer-Callbacks
Gleichzeitige gemeinsame NutzungBenötigt KoordinationBenötigt Koordination; der zuletzt Schließende kann eine andere Version überschreiben

AFS bot außerdem einen globalen Namensraum, Zugriffskontrolllisten und von Administratoren verwaltete Volumes. AFSv2 erhöhte die Anzahl der Clients pro Server historisch auf etwa 50 gegenüber rund 20 bei AFSv1. Keine der beiden Cache-Regeln ersetzt ausdrückliche Koordination, etwa Dateisperren, wenn Programme sichere gemeinsame Aktualisierungen benötigen.

Wichtige Erkenntnisse

  • NFS nutzt Close-to-Open-Prüfungen, während Attribut-Caching dazu führen kann, dass lesende Prozesse bei offenen Dateien veraltete Daten sehen.
  • AFS nutzt einen Ganzdateicache auf der Festplatte erneut, solange ein Callback gültig bleibt.
  • AFS veröffentlicht Änderungen beim Schließen; eine bereits offene Sitzung auf einem anderen Rechner behält ihre alte Kopie.
  • Gleichzeitig schreibende AFS-Clients ersetzen ganze Versionen, sodass der zuletzt Schließende gewinnt.
  • Der Callback-Zustand erfordert nach Ausfällen eine erneute Prüfung.
  • Die Übertragungsgranularität bestimmt, welche Arbeitslasten von welchem Cache-Entwurf profitieren.

Dateisysteme: Beispiele

6 Interaktive Lektionen

1

Verfolge eine Datei vom Öffnen bis zur dauerhaften Ersetzung

19 Schritte
Verfolge Deskriptoren, Namen, Berechtigungen und einen Speichervorgang, der einen Absturz übersteht.
  1. 1
    EinführungVerfolge vier Arten von Zustand

    Eine Dateioperation kann Bytes, eine Position in einer offenen Datei, einen Verzeichnisnamen oder eine Berechtigungsinformation ändern. Verfolge ein kleines Programm durch diese Ebenen und erstelle dann eine dauerhafte Ersetzung. Wenn du die Ebenen getrennt hältst, erklären sich zwei zunächst überraschende Ergebnisse: Eine Datei kann nutzbar bleiben, nachdem ihr letzter Name entfernt wurde, und das Schließen einer Datei macht einen Speichervorgang für sich genommen nicht dauerhaft.

  2. 2
    BeispielÖffne und lies einen Bytebereich

    Eine 260 Byte große Datei wird zum Lesen geöffnet. Angenommen, open gibt Deskriptor 3 zurück und das erste read(3, buf, 80) gibt 80 zurück. Der Deskriptor bezeichnet die offene Referenz dieses Prozesses; der Offset beträgt nun 80. Die zurückgegebene Anzahl sagt dir, wie weit du weitergehen musst. Die angeforderte Anzahl ist nur eine obere Schranke, sodass das Programm den Rückgabewert prüfen muss.

  3. 3
    HerausforderungBestimme den nächsten Offset

    Die nächste Anforderung fragt 100 Byte an, gibt aber 60 zurück. Bei welchem Offset beginnt der folgende gewöhnliche Lesevorgang?

    ---reveal---

    Er beginnt bei Byte 140: Der vorherige Offset 80 erhöht sich um die 60 tatsächlich gelesenen Bytes. Eine Erhöhung um die angeforderten 100 würde fälschlich Bytes überspringen. Ein Lesevorgang, der am Dateiende 0 zurückgibt, würde den Offset unverändert lassen.

  4. 4
    AnalogieTeile ein Lesezeichen

    Ein Eintrag für eine offene Datei ist wie ein gemeinsames Lesezeichen in einem Buchexemplar. dup bietet einen weiteren Zugang zu demselben Lesezeichen; zwei getrennte open-Aufrufe erzeugen zwei Lesezeichen. Der Vergleich betrifft nur die Position: Beide Öffnungen greifen weiterhin auf dieselbe zugrunde liegende Datei zu. Änderungen an ihren Bytes können beide lesenden Prozesse betreffen, obwohl ihre Offsets unabhängig sind.

  5. 5
    BeispielVerfolge einen duplizierten Deskriptor

    Das Programm ruft other = dup(3) und dann lseek(other, 20, SEEK_SET) auf. Deskriptor 3 nutzt nun ebenfalls Offset 20, weil beide Deskriptoren denselben Eintrag für eine offene Datei erreichen. Ein Lesevorgang von 15 Byte über Deskriptor 3 hinterlässt ihren gemeinsamen Offset bei 35. Das Positionieren selbst ändert den Zustand im Speicher; es liest keinen Block und bewegt keinen physischen Festplattenkopf.

  6. 6
    TippWähle die passende Positionsoperation

    Nutze pread, wenn ein Lesevorgang eine bestimmte Byteposition angeben soll, ohne den Offset des Eintrags für die offene Datei zu ändern. Das ist wichtig, wenn Deskriptoren diesen Eintrag nach dup oder fork gemeinsam nutzen. Ein gewöhnliches read erhöht den gemeinsamen Offset; pread tut das nicht. Prüfe bei beiden Aufrufen die zurückgegebene Anzahl und mögliche Fehler, bevor du annimmst, dass die angeforderten Bytes gelesen wurden.

  7. 7
    ErklärungSpeichere angenommene Bytes dauerhaft

    Ein erfolgreiches write legt neue Bytes meist in Speicherpuffern ab. Ein späterer Absturz kann sie löschen, bevor das Speichergerät sie erhält. fsync wartet darauf, dass die veränderten Daten und Metadaten der Datei laut Meldung des Geräts das Speichergerät erreicht haben. Das Schließen eines Deskriptors gibt eine offene Referenz frei; es bewirkt nicht dieselbe dauerhafte Speicherung.

  8. 8
    BeispielBereite einen vollständigen Ersatz vor

    Ein Editor möchte settings.json ersetzen. Er schreibt zunächst den gesamten Ersatzinhalt in settings.json.tmp im selben Verzeichnis und prüft die geschriebenen Anzahlen und mögliche Fehler. Das alte Ziel bleibt währenddessen unberührt. Dann synchronisiert er die temporäre Datei erfolgreich und stellt so sicher, dass die vollständigen Ersatzbytes dauerhaft gespeichert sind, bevor er den Zielnamen ändert.

  9. 9
    BeispielVeröffentliche und speichere den neuen Namen dauerhaft

    Als Nächstes benennt der Editor die temporäre Datei über settings.json um. Die Ersetzung innerhalb desselben Dateisystems ist atomar: Der Name erreicht die alte oder die neue Datei, ohne einen Zeitraum, in dem der Name fehlt. Schließlich synchronisiert der Editor das enthaltende Verzeichnis. Dieser letzte Schritt speichert die Namensänderung dauerhaft, weil der Verzeichniseintrag zum Verzeichnis und nicht zur Datei gehört.

  10. 10
    HerausforderungFinde den fehlenden Schritt zur dauerhaften Speicherung

    Ein Programm schreibt und synchronisiert eine neue Datei, benennt sie über das Ziel um und meldet sofort eine dauerhafte Speicherung. Welche Operation ist noch nötig?

    ---reveal---

    Synchronisiere das enthaltende Verzeichnis und prüfe, ob der Aufruf erfolgreich war. Die Dateisynchronisierung schützt den Inhalt des Ersatzes, während die Verzeichnissynchronisierung den geänderten Namen schützt. Das atomare Umbenennen allein stellt nicht sicher, dass die Namensänderung einen Absturz übersteht.

  11. 11
    BeispielFüge einen zweiten Namen hinzu

    Der Befehl ln draft saved erzeugt einen harten Link. Beide Namen verweisen auf einen Inode und der Linkzähler der regulären Datei wird zu 2. Nach dem Entfernen von draft bleibt saved mit dem Zählerstand 1 nutzbar. Der Inhalt wurde nicht kopiert: Die Operation hat einen Verzeichniseintrag hinzugefügt. Ein symbolischer Link wäre dagegen ein eigenes Objekt, das einen aufzulösenden Pfad speichert.

  12. 12
    HerausforderungEntferne alle Namen einer offenen Datei

    Ein Prozess hat saved geöffnet. Ein anderer Prozess entfernt den letzten harten Link darauf. Kann der erste Prozess die Datei noch lesen, und wann kann der Speicherplatz zurückgewonnen werden?

    ---reveal---

    Der offene Deskriptor bleibt nutzbar. Die Rückgewinnung wartet, bis weder Namen noch offene Referenzen vorhanden sind. Der Linkzähler erfasst Namen; erreicht er null, endet eine bestehende offene Referenz daher nicht von selbst.

  13. 13
    KernaussageEin Pfad ist keine Objektreferenz

    Ein symbolischer Link speichert einen Zielpfad. Wird das Ziel gelöscht oder umbenannt, kann der Link daher hängen. Ein harter Link bezeichnet den Inode direkt und bleibt nach dem Entfernen seiner anderen Namen erhalten. Symbolische Links können Dateisystemgrenzen überschreiten, weil Pfade Einhängepunkte überschreiten können; harte Links können das nicht, weil Inode-Nummern nur innerhalb eines Dateisystems Bedeutung haben.

  14. 14
    BeispielEntschlüssele Zugriffsrechte

    Die Berechtigungszeichenfolge rw-r----- teilt sich in Eigentümer rw-, Gruppe r-- und andere ---. Bei Lesen = 4, Schreiben = 2 und Ausführen = 1 lauten die Ziffern 6, 4 und 0. Somit setzt chmod 640 report Lese- und Schreibrechte für den Eigentümer, Leserechte für die Gruppe und keine Rechte für andere. Die drei Ziffern beschreiben getrennte Benutzerklassen, keine gemeinsame Summe.

  15. 15
    HerausforderungErreiche eine Datei mit bekanntem Namen

    Ein Benutzer hat Ausführungs-, aber keine Leseberechtigung für /srv/data, und die Berechtigungen der Datei erlauben das Lesen von /srv/data/plan. Kann der Benutzer den bekannten Pfad öffnen und das Verzeichnis auflisten?

    ---reveal---

    Der Benutzer kann den bekannten Pfad öffnen, weil die Ausführungsberechtigung das Durchsuchen des Verzeichnisses erlaubt. Das Auflisten benötigt Leseberechtigung für das Verzeichnis und schlägt daher fehl. Auch die Dateiberechtigungen werden geprüft; das Durchsuchen des Verzeichnisses allein gewährt keinen Zugriff auf jede darin enthaltene Datei.

  16. 16
    TippInterpretiere ctime richtig

    Nach chmod ändert sich ctime, weil sich der Status des Inodes geändert hat. Es ist kein Erstellungszeitstempel. mtime erfasst Änderungen am Dateiinhalt; atime erfasst Zugriffe, oft mit verzögerter Aktualisierung. Wenn du diese Bedeutungen auseinanderhältst, kannst du die Ausgabe von stat interpretieren, ohne zu schließen, dass eine Berechtigungsänderung eine neue Datei erzeugt oder ihre Bytes neu geschrieben hat.

  17. 17
    VerbindungVerbinde Bäume, ohne Identitäten zusammenzuführen

    Das Einhängen fügt die Wurzel eines anderen Dateisystems an einem Verzeichnis wie /media/usb ein und verbirgt dessen bisherigen Inhalt, solange das Dateisystem eingehängt ist. Die Schicht des virtuellen Dateisystems stellt beiden Bäumen gemeinsame Aufrufe bereit. Sie führt ihre Inode-Tabellen nicht zusammen: Inode 25 auf einem Dateisystem kann mit Inode 25 auf dem anderen nichts zu tun haben.

  18. 18
    HerausforderungErsetze eine Datei über einen zweiten Namen

    Ein Programm hält die alte Datei über den harten Link backup geöffnet. Ein Editor veröffentlicht eine vollständige neue Datei, indem er eine temporäre Datei über current umbenennt und dann das Verzeichnis synchronisiert. Welche Inhalte erreicht der alte Deskriptor und welche ein erneutes Öffnen von current?

    ---reveal---

    Der Deskriptor und backup erreichen weiterhin den alten Inode. Ein erneutes Öffnen von current erreicht den Inode des Ersatzes. Das Umbenennen ändert einen Verzeichniseintrag, ohne bestehende offene Referenzen auf ein anderes Ziel zu richten; die Synchronisierung speichert diesen Namenswechsel dauerhaft.

  19. 19
    ZusammenfassungNutze das richtige Zustandsmodell

    Verfolge gewöhnliche Lesepositionen über Einträge für offene Dateien und Namen über Verzeichnisse und Inodes. Für eine dauerhafte Ersetzung stellst du die temporäre Datei fertig, synchronisierst sie, benennst sie um und synchronisierst dann das Verzeichnis. Untersuche bei Zugriffs- oder Löschproblemen neben den Metadaten der Datei auch die relevanten Verzeichnisrechte und offenen Referenzen.

2

Finde Bytes auf der Festplatte und zähle den Aufwand

17 Schritte
Finde Inodes und Datenblöcke und verfolge dann eine Pfadauflösung mit leerem Cache und den entsprechenden Zugriff aus dem Cache.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungÜbersetze Namen in Blöcke
  2. 2
    BeispielErstelle die Partitionsaufteilung
  3. 3
    HerausforderungZähle Inode-Plätze
  4. 4
    BeispielBerechne eine absolute Inode-Adresse
  5. 5
    BeispielWähle Bytes innerhalb des enthaltenden Blocks
  6. 6
    KernaussageHalte den Dateinamen aus dem Inode heraus
  7. 7
    BeispielFinde einen logischen Datenblock
  8. 8
    ErklärungErweitere den Zeigerbaum
  9. 9
    BeispielWeise den ersten Teil einer großen Datei zu
  10. 10
    HerausforderungVervollständige die Anzahl der Zeigerblöcke
  11. 11
    VerbindungBeschreibe eine Folge statt jeder Adresse
  12. 12
    BeispielLöse einen Pfad bei leerem Cache auf
  13. 13
    HerausforderungWende das Lesemodell an
  14. 14
    TippZähle jede geänderte Struktur
  15. 15
    KernaussageSpare Gerätezugriffe durch den Speicher
  16. 16
    HerausforderungWiederhole eine Suche nach dem Zwischenspeichern
  17. 17
    ZusammenfassungUnterscheide drei Übersetzungen
3

Platziere zusammengehörige Dateien und bemesse ihre Übertragungen

13 Schritte
Nutze die FFS-Lokalitätsregeln und leite die für eine Zielbandbreite benötigte Teilstückgröße her.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungVerbringe Zeit mit der Übertragung nutzbarer Bytes
  2. 2
    ErklärungUntersuche entfernte Metadaten und kleine Übertragungen
  3. 3
    AnalogieHalte eine Arbeitsmenge zusammen
  4. 4
    BeispielLege lokale Ressourcen in jeder Gruppe ab
  5. 5
    HerausforderungErkläre, was die Gruppierung verändert
  6. 6
    BeispielPlatziere die Dateien eines Verzeichnisses
  7. 7
    KernaussageLass Platz für benachbarte Dateien
  8. 8
    BeispielMiss den Verwaltungsaufwand
  9. 9
    BeispielBerechne die Größe für ein Ziel von 90 %
  10. 10
    HerausforderungSage die Teilstückgröße für ein schnelleres Laufwerk voraus
  11. 11
    TippStimme die Zuweisung auch auf kleine Dateien ab
  12. 12
    HerausforderungHalte Platz für gemeinsam erzeugte Dateien frei
  13. 13
    ZusammenfassungStimme Lokalität, Platz und Übertragungsgröße aufeinander ab
4

Verfolge einen Anhängevorgang durch Absturz und Wiederherstellung

18 Schritte
Vergleiche partielle Schreibvorgänge, Reparatur durch ein Prüfprogramm, Journal-Commit und geordnete Wiederherstellung von Metadaten.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungStelle eine vollständige Aktualisierung wieder her
  2. 2
    BeispielBenenne die drei geänderten Blöcke
  3. 3
    HerausforderungOrdne eine Zuweisung ohne Zeiger ein
  4. 4
    BeispielFinde verborgenen Datenmüll
  5. 5
    KernaussageUnterscheide drei Fehlerarten
  6. 6
    ErklärungRekonstruiere Zuordnungen mit fsck
  7. 7
    HerausforderungBewerte eine fehlerfreie Prüfung
  8. 8
    VerbindungRepariere Namen, ohne sie zu erfinden
  9. 9
    BeispielSchreibe zuerst die Nutzdaten zur Wiederholung
  10. 10
    BeispielSchließe die vollständige Transaktion ab
  11. 11
    HerausforderungStelle nach einem teilweisen Checkpoint wieder her
  12. 12
    TippPrüfe Transaktionsabschluss und Dauerhaftigkeit getrennt
  13. 13
    BeispielVermeide das doppelte Protokollieren der Daten
  14. 14
    HerausforderungErkenne die fehlende Reihenfolgeregel
  15. 15
    BeispielSchütze einen wiederverwendeten Block vor altem Protokollinhalt
  16. 16
    VerbindungVeröffentliche stattdessen einen neuen Baum
  17. 17
    HerausforderungStelle die Struktur wieder her, ohne die Absicht wiederherzustellen
  18. 18
    ZusammenfassungFrag dich, was die Wiederherstellung beweisen kann
5

Schreibe, finde und bereinige ein wanderndes Protokoll

15 Schritte
Verfolge eine LFS-Aktualisierung durch ihre Zuordnung, Gültigkeitsprüfung und Wiederherstellung nach einem Absturz.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungHalte die Identität stabil, während Positionen wechseln
  2. 2
    VerbindungFasse viele kurze Aktualisierungen zu einer Übertragung zusammen
  3. 3
    BeispielSchreibe eine neue Version
  4. 4
    ErklärungAktualisiere die Inode-Zuordnungstabelle
  5. 5
    HerausforderungPrüfe das übergeordnete Verzeichnis
  6. 6
    BeispielFinde die Zuordnungstabelle nach dem Einhängen
  7. 7
    BeispielBestimme die Größe eines sequenziellen Segments
  8. 8
    KernaussageSchließe nicht auf sequenzielle Lesezugriffe
  9. 9
    BeispielPrüfe die Gültigkeit des alten Blocks
  10. 10
    HerausforderungBerechne den zurückgewonnenen Speicherplatz
  11. 11
    TippVermeide das Kopieren bald ungültiger Daten
  12. 12
    BeispielWähle einen vollständigen Checkpoint
  13. 13
    HerausforderungStelle Änderungen nach dem Checkpoint wieder her
  14. 14
    HerausforderungStelle die Zuordnung vor der Gültigkeitsprüfung wieder her
  15. 15
    ZusammenfassungBerücksichtige den Aufwand für Zuordnung und Bereinigung
6

Wiederhole Anfragen und sage die Sichtbarkeit gemeinsamer Dateien voraus

16 Schritte
Vergleiche die NFS-Wiederherstellung nach Ausfällen mit den zeitlichen Abläufen der gemeinsamen Cache-Nutzung bei NFS und AFS.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungGehe mit Unsicherheit zwischen Rechnern um
  2. 2
    BeispielErstelle eine in sich vollständige Leseanfrage
  3. 3
    KernaussageZustandslos bedeutet nicht ohne Speicherung
  4. 4
    HerausforderungWiederhole ein WRITE nach verlorener Antwort
  5. 5
    TippErkenne eine Wiederholung mit veränderter Antwort
  6. 6
    BeispielBestätige erst nach dauerhafter Speicherung
  7. 7
    VerbindungHalte die Protokollversionen auseinander
  8. 8
    BeispielTeile Änderungen an einer NFS-Öffnungsgrenze
  9. 9
    HerausforderungErkläre einen veralteten Lesezugriff aus dem Cache
  10. 10
    AnalogieErsetze wiederholte Prüfungen durch eine Zusage
  11. 11
    BeispielBehalte die Kopie einer bestehenden AFS-Sitzung
  12. 12
    HerausforderungSage das Ergebnis zweier schreibender Clients voraus
  13. 13
    KernaussageBerücksichtige Callbacks nach einem Absturz
  14. 14
    VerbindungWähle die Übertragungsgranularität für die Arbeitslast
  15. 15
    HerausforderungUnterscheide eine sichere Wiederholung von einer sicheren gemeinsamen Bearbeitung
  16. 16
    ZusammenfassungStelle zwei getrennte Netzwerkfragen

Dateisysteme: Übungsaufgaben

60 Übungsfragen in 6 Sets

Set 1: Deskriptoren, Namen und dauerhaftes Speichern10 Übungsfragen

Frage 1 von 10

Ein Lesevorgang aus einer regulären Datei fordert 120 Byte an und gibt 45 zurück. Er beginnt bei Offset 30. Wo beginnt der nächste gewöhnliche Lesevorgang?
  1. Offset 75
  2. Offset 120
  3. Offset 150
  4. Offset 45
Antwort zeigenAntwort ausblenden
Antwort: A
Der Offset erhöht sich um die 45 tatsächlich zurückgegebenen Bytes von 30 auf 75. Eine Verschiebung auf 150 würde die angeforderte Anzahl 120 verwenden, aber eine Anforderung ist nur eine obere Schranke für die gelesenen Bytes. Auch ein erfolgreicher kurzer Lesevorgang erhöht den Offset um seine tatsächliche Anzahl.

Frage 2 von 10

Ein Prozess öffnet dieselbe Datei getrennt als a und b und liest dann 24 Byte über a. Welchen Offset hat b vor seinem ersten Lesevorgang?
  1. 24, weil der Inode geteilt wird
  2. 0, weil der erste Lesevorgang beide Einträge zurücksetzt
  3. 24, weil alle Deskriptoren Offsets teilen
  4. 0, weil die Öffnungen getrennte Einträge haben
Antwort zeigenAntwort ausblenden
Antwort: D
Jede getrennte Öffnung erzeugt einen eigenen Eintrag für die offene Datei und damit einen eigenen Offset, anfangs null. Ein gemeinsam genutzter Inode bedeutet keinen gemeinsam genutzten offenen Eintrag. Der Lesevorgang über a erhöht nur den Offset von a; mit dup erzeugte Deskriptoren würden dagegen eine Position teilen.

Frage 3 von 10

Eine Datei hat mindestens 200 Byte. Ein Prozess öffnet sie als a, erzeugt b = dup(a) und öffnet sie getrennt als c. Nach fork setzt der Kindprozess den Offset von b auf 70. Der Elternprozess liest 12 Byte über a und ruft dann pread(c, buf, 9, 100) auf. Wie lauten die abschließenden Offsets von a, b und c?
  1. 82, 82, 0
  2. 82, 82, 109
  3. 12, 70, 0
  4. 82, 70, 109
Antwort zeigenAntwort ausblenden
Antwort: A
a und b teilen auch nach fork einen Eintrag. Daher setzt das Positionieren durch den Kindprozess ihre Position auf 70 und der Lesevorgang des Elternprozesses erhöht sie auf 82. Die getrennte Öffnung c beginnt bei null und pread belässt den Offset dort. Eine Erhöhung von c auf 109 würde Ein-/Ausgabe an einer ausdrücklich angegebenen Position mit einem gewöhnlichen read verwechseln.

Frage 4 von 10

Ein Programm hat eine vorhandene Datei vollständig und erfolgreich geschrieben. Welcher Aufruf wartet unmittelbar darauf, dass die veränderten Daten und Metadaten dieser Datei das Speichergerät erreichen?
  1. close(fd)
  2. fstat(fd, &buf)
  3. lseek(fd, 0, SEEK_SET)
  4. fsync(fd)
Antwort zeigenAntwort ausblenden
Antwort: D
fsync wartet darauf, dass die veränderten Daten und Metadaten der Datei laut Meldung des Geräts das Speichergerät erreichen. close gibt den Deskriptor frei und kann Schreibvorgänge gepuffert zurücklassen. Das Lesen von Metadaten oder Ändern des Offsets fordert diese dauerhafte Speicherung nicht an.

Frage 5 von 10

Ein Editor schreibt einen vollständigen temporären Ersatz in das Verzeichnis des Ziels und synchronisiert ihn erfolgreich. Welche Folge schließt eine dauerhafte Ersetzung ab?
  1. Die temporäre Datei schließen, dann umbenennen
  2. Die temporäre Datei umbenennen, dann das Verzeichnis synchronisieren
  3. Die Zieldatei kürzen, dann die temporäre Datei umbenennen
  4. Das Verzeichnis synchronisieren, dann die temporäre Datei umbenennen
Antwort zeigenAntwort ausblenden
Antwort: B
Das Umbenennen veröffentlicht den vollständigen Ersatz atomar und das Synchronisieren des Verzeichnisses speichert diese Namensänderung dauerhaft. Eine Synchronisierung des Verzeichnisses vor dem Umbenennen kann keine Änderung dauerhaft speichern, die noch nicht stattgefunden hat. Das bloße Schließen der temporären Datei speichert die spätere Verzeichnisaktualisierung nicht dauerhaft.

Frage 6 von 10

In einer neuen leeren Datei wird auf Offset 12.288 positioniert und dort ein Byte geschrieben. Wie groß ist die Datei logisch und was enthält die vorausgehende Lücke?
  1. 1 Byte; die Lücke liegt außerhalb der Datei
  2. 12.289 Byte; die Lücke enthält alte Festplattenbytes
  3. 12.289 Byte; die Lücke wird als Nullen gelesen
  4. 12.288 Byte; die Lücke wird als Nullen gelesen
Antwort zeigenAntwort ausblenden
Antwort: C
Das Byte bei Offset 12.288 verlängert die Datei bis einschließlich dieser Position, was die Länge 12.289 ergibt. Ungeschriebene Bytes innerhalb des erweiterten Bereichs werden als Nullen gelesen, und eine dünn besetzte Darstellung kann die Zuweisung von Blöcken für die Lücke vermeiden. Wer nur das geschriebene Byte zählt, verwechselt zugewiesene Daten mit der logischen Dateilänge.

Frage 7 von 10

Zwei Namen, red und blue, sind harte Links auf eine geschlossene reguläre Datei. Was geschieht mit blue, nachdem red entfernt wurde?
  1. Der Name bleibt mit Linkzähler 2 nutzbar
  2. Der Name bleibt mit Linkzähler 1 nutzbar
  3. Der Name verschwindet mit dem gemeinsamen Inode
  4. Der Name wird zu einem hängenden symbolischen Link
Antwort zeigenAntwort ausblenden
Antwort: B
Das Entfernen des Links entfernt nur den Namen red und senkt den Linkzähler des gemeinsamen Inodes von 2 auf 1. blue bleibt ein gleichwertiger Name für diesen Inode und erreicht weiterhin seinen Inhalt. Ihn als hängend zu betrachten, würde das Pfadverhalten symbolischer Links auf einen harten Link übertragen.

Frage 8 von 10

Eine reguläre Datei hat einen Namen und einen offenen Deskriptor. Ein anderer Prozess entfernt den Namen. Wann kann das Dateisystem ihren Inode und ihre Daten zurückgewinnen?
  1. Wenn der Prozess den Deskriptor das nächste Mal positioniert
  2. Nachdem die verbleibenden offenen Referenzen enden
  3. Nachdem eine spätere Verzeichnisauflistung endet
  4. Sobald der letzte Name verschwindet
Antwort zeigenAntwort ausblenden
Antwort: B
Das Entfernen des letzten Links setzt den Linkzähler auf null, aber der offene Deskriptor hält das Objekt weiterhin zugänglich. Die Rückgewinnung wartet sowohl auf null Links als auch darauf, dass keine offenen Referenzen mehr bestehen. Der Name kann sofort aus dem Verzeichnis entfernt werden, während die namenlose Datei für ihren aktuellen Nutzer erhalten bleibt.

Frage 9 von 10

Ein Benutzer kann /srv/team durchsuchen, aber dessen Namen nicht auflisten. Der Benutzer kennt /srv/team/brief, und die Berechtigungen dieser Datei erlauben das Lesen. Welcher Zugriff ist möglich?
  1. Auflisten und Öffnen gelingen beide
  2. Auflisten gelingt, aber Öffnen schlägt fehl
  3. Öffnen gelingt, aber Auflisten schlägt fehl
  4. Auflisten und Öffnen schlagen beide fehl
Antwort zeigenAntwort ausblenden
Antwort: C
Die Ausführungsberechtigung für das Verzeichnis erlaubt das Durchsuchen eines bekannten Pfads, während die Leseberechtigung für das Verzeichnis das Auflisten von Namen erlaubt. Die bekannte lesbare Datei kann daher geöffnet werden, obwohl das Verzeichnis nicht aufgelistet werden kann. Die Leseberechtigung für die Datei allein würde ein fehlendes Durchsuchungsrecht nicht umgehen, aber hier ist das Durchsuchen erlaubt.

Frage 10 von 10

Ein Laufwerk wird an einem Verzeichnis eingehängt, das bereits Dateien enthält. Was geschieht mit diesen bisherigen Dateien, während das Dateisystem eingehängt ist?
  1. Sie werden in das eingehängte Dateisystem kopiert
  2. Sie werden beim Einhängen entfernt
  3. Sie werden mit der eingehängten Wurzel zusammengeführt
  4. Sie werden von der eingehängten Wurzel verborgen
Antwort zeigenAntwort ausblenden
Antwort: D
Das Einhängen macht die Wurzel des anderen Dateisystems am Einhängepunkt sichtbar und verbirgt den bisherigen Inhalt des Verzeichnisses. Es führt die Einträge der beiden Verzeichnisse nicht zusammen und löscht die verdeckten Dateien nicht. Ein vereinter Pfadbaum bietet einen gemeinsamen Zugang zu Objekten, ohne die zugrunde liegenden Dateisysteme zusammenzuführen.
Set 2: Ordne Inodes und Datenblöcke zu und ermittle den Geräteaufwand10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein Dateisystem weist einer leeren regulären Datei einen Inode zu. Welche Bitmap erfasst diese Zuweisung?
  1. Die Inode-Bitmap
  2. Die Datenbitmap
  3. Die Extent-Bitmap
  4. Die Verzeichnisbitmap
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Inode-Tabelle beginnt bei Festplattenblock 4. Blöcke sind 4 KiB und Inodes 256 Byte groß; die Nummerierung beginnt bei null. Bei welcher absoluten Byteadresse beginnt Inode 23?
  1. 22272
  2. 5888
  3. 16384
  4. 22528
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine Partition hat 100 Blöcke. Ihr Superblock belegt 1, ihre beiden Bitmaps belegen 2 und ihre Inode-Tabelle belegt 8. Wie viele Blöcke bleiben in ihrem Datenbereich?
  1. 97 Blöcke
  2. 89 Blöcke
  3. 92 Blöcke
  4. 91 Blöcke
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein indirekter Block von 4 KiB speichert Adressen zu je 8 Byte. Wie viele Adressen passen hinein?
  1. 2.048 Adressen
  2. 512 Adressen
  3. 4.096 Adressen
  4. 1.024 Adressen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Wo liegt Byteoffset 6.500 bei 2-KiB-Blöcken in der logischen Blockzuordnung der Datei?
  1. Block 3, Byteoffset 1.500
  2. Block 2, Byteoffset 2.404
  3. Block 4, Byteoffset 356
  4. Block 3, Byteoffset 356
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein Inode hat 6 direkte Zeiger, einen einfach indirekten und einen doppelt indirekten Zeiger. Blöcke sind 1 KiB und Zeiger 4 Byte groß. Eine nicht dünn besetzte Datei belegt 400 Datenblöcke. Wie viele Zeigerblöcke werden außerhalb des Inodes benötigt?
  1. 2 Zeigerblöcke
  2. 5 Zeigerblöcke
  3. 3 Zeigerblöcke
  4. 4 Zeigerblöcke
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine Datei besteht aus drei getrennten zusammenhängenden Folgen von 40, 15 und 25 Blöcken. Wie viele Extent-Einträge beschreiben diese Folgen mindestens?
  1. 80 Einträge
  2. 1 Eintrag
  3. 3 Einträge
  4. 2 Einträge
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Wie viele Lesezugriffe auf Inode- oder Verzeichnisblöcke finden /lab/raw/data in einem Modell mit leerem Cache und Verzeichnissen von je einem Block, bevor der Inhalt gelesen wird?
  1. 7 Lesezugriffe
  2. 5 Lesezugriffe
  3. 8 Lesezugriffe
  4. 6 Lesezugriffe
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Datei nutzt nur direkte Datenzeiger. In einem einfachen Modell mit leerem Cache belegt jedes Verzeichnis einen Block. Nach dem Öffnen von /lab/raw/data liest das Programm drei Datenblöcke; jeder Blockzugriff liest den Inode erneut und schreibt atime. Das Schließen verursacht keine Ein-/Ausgabe. Wie hoch ist die Gesamtzahl?
  1. 13 Ein-/Ausgaben
  2. 19 Ein-/Ausgaben
  3. 10 Ein-/Ausgaben
  4. 16 Ein-/Ausgaben
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Beim Erzeugen zweier Dateien wird derselbe Block der Inode-Bitmap geändert, bevor er geschrieben wird. Wie kann Pufferung die Zugriffe für diesen Block verringern?
  1. Sie vermeidet die Reservierung beider Inodes auf der Festplatte
  2. Sie ersetzt Belegungsbits durch Inode-Zeiger
  3. Sie bündelt beide Änderungen in einem späteren Schreibvorgang
  4. Sie speichert die Bitmap in beiden neuen Dateien
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Lokalität, Durchsatz und teilweise Aktualisierungen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Welchen Festplattenaufwand verringert vor allem die Platzierung des Inodes einer Datei nahe ihren Daten?
  1. Linkzähler von Verzeichnissen
  2. Speicherplatz für Zeiger
  3. Positionierungszeit und Rotationslatenz
  4. Prüfungen von Dateiberechtigungen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Festplatte hat eine hohe sequenzielle Übertragungsrate, aber ein Dateisystem gibt winzige, über die Festplatte verstreute Leseanfragen aus. Warum kann der Durchsatz niedrig bleiben?
  1. Verstreute Blöcke benötigen größere Dateioffsets
  2. Die Verzeichnistiefe bestimmt jede Positionierung zu Datenblöcken
  3. Kleine Lesezugriffe senken die maximale Bandbreite des Laufwerks
  4. Die Positionierung dominiert die kurzen Übertragungen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Die Gruppe eines Verzeichnisses hat reichlich Platz. Wo platziert FFS normalerweise den Inode und die Daten einer neu erzeugten regulären Datei?
  1. Zusammen in der am wenigsten belegten entfernten Gruppe
  2. Zusammen in der Gruppe des übergeordneten Verzeichnisses
  3. In getrennten Gruppen, um alle Zugriffe zu verteilen
  4. Mit dem Inode ausschließlich in einer globalen Tabelle
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Warum nutzt FFS Teilblöcke für kleine Dateien?
  1. Um alle Metadatenschreibvorgänge zu vermeiden
  2. Um die Datenzeiger des Inodes zu entfernen
  3. Damit jede Datei mehrere Gruppen belegt
  4. Um ungenutzten Platz in großen Blöcken zu verringern
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine Festplatte erreicht maximal 120 MB/s. Ein Teilstück von 3 MB benötigt einschließlich Positionierung und Übertragung 35 ms. Welche Teilstückgröße würde 90 % des Maximums erreichen, wenn die Positionierungszeit gleich bleibt?
  1. 3,78 MB
  2. 10,8 MB
  3. 12 MB
  4. 37,8 MB
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein Allokator nach Art von FFS muss nahe einem Projektverzeichnis Platz für kleine benachbarte Dateien lassen und zugleich eine große Streamingdatei speichern. Andere Gruppen haben reichlich Platz. Die Festplatte erreicht maximal 160 MB/s und die Positionierung dauert 5 ms. Wie sollten spätere Teilstücke der großen Datei platziert und bemessen werden, um 90 % des Maximums zu erreichen?
  1. Teilstücke von 7,2 MB nur in der Ausgangsgruppe verwenden
  2. Teilstücke von 0,8 MB nur in der Ausgangsgruppe verwenden
  3. Teilstücke von 7,2 MB in anderen Gruppen verwenden
  4. Teilstücke von 0,8 MB in anderen Gruppen verwenden
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Nach einem Anhängevorgang erreichen die neuen Daten und der Inode die Festplatte, die Belegungsbitmap aber nicht. Was ist das wichtigste strukturelle Risiko?
  1. Derselbe Block kann erneut zugewiesen werden
  2. Der Block ist ohne zugehörige Datei reserviert
  3. Der Inode hat alle Verzeichnisnamen verloren
  4. Die neuen Daten sind von der Datei aus nicht erreichbar
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Nur der neue Datenblock eines Anhängevorgangs erreicht die Festplatte. Weder die Aktualisierung des Inodes noch die der Bitmap bleibt erhalten. Wie wird der entstehende Zustand eingeordnet?
  1. Inkonsistent, mit zwei Dateien für einen Block
  2. Abgeschlossen, mit veralteter Dateilänge
  3. Mit Speicherplatzleck durch einen belegten verwaisten Block
  4. Konsistent, ohne den angehängten Inhalt
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Absturz hinterlässt einen als belegt markierten Block, auf den kein Zeiger verweist. Der Inode einer zweiten Datei zeigt auf einen anderen Block, der weiterhin als frei markiert ist. Welche Änderungen der Belegungsbits bringen diese beiden Fälle nach der Reparatur in Einklang?
  1. Das erste Bit zurücksetzen und das zweite setzen
  2. Beide Bits setzen und alle Zeiger behalten
  3. Beide Bits zurücksetzen und alle Zeiger behalten
  4. Das erste Bit setzen und das zweite zurücksetzen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Die Inode- und Bitmap-Aktualisierungen eines Anhängevorgangs bleiben erhalten, seine Daten aber nicht. Warum kann die Datei eine Strukturprüfung bestehen und dabei falsche Bytes enthalten?
  1. Bitmaps rekonstruieren die fehlenden Bytes
  2. Der Inode beschreibt seine Daten nicht mehr
  3. Die Zuordnung stimmt überein, obwohl Inhalte veraltet sind
  4. Die Prüfung vergleicht nur Dateinamen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Sicher prüfen, abschließen und erneut einspielen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein gültiger Inode beansprucht Block 85, aber die Bitmap markiert Block 85 als frei. Welche Bitmap-Reparatur entspricht der Zuordnung?
  1. Die Abweichung vorerst behalten
  2. Den Zeiger des Inodes zurücksetzen
  3. Block 85 als belegt markieren
  4. Block 85 beim Checkpoint freigeben
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein zugewiesener Inode enthält gültige Zeiger und Daten, hat aber keinen von der Wurzel aus erreichbaren Namen. Wie kann fsck den Zugriff darauf erhalten?
  1. Einen erreichbaren Eintrag in lost+found erzeugen
  2. Ihn ohne Link lassen und seinen Linkzähler ändern
  3. Ihn nur durch Wiederherstellen einer Sicherungskopie erhalten
  4. Seine zugewiesenen Blöcke ohne neuen Namen freigeben
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Die Nutzdaten einer grundlegenden Daten-Journaling-Transaktion sind vollständig dauerhaft gespeichert, aber ihr TxE-Commit-Datensatz hat das Speichergerät nie erreicht. Was macht die Wiederherstellung nach einem Absturz mit der Transaktion?
  1. Nur ihre Inode- und Bitmap-Abbilder einsetzen
  2. Sie erneut einspielen, weil ihre Nutzdaten vollständig aussehen
  3. Sie ignorieren, weil der Abschluss fehlt
  4. Ihre Nutzdaten als bereits per Checkpoint übertragen behandeln
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine Transaktion ist abgeschlossen und die Hälfte ihrer Abbilder hat vor einem Absturz die endgültigen Positionen erreicht. Warum kann die Wiederherstellung jedes Abbild erneut einspielen?
  1. Sie verwirft zuerst alle bereits geschriebenen Daten
  2. Das Ersetzen durch identische Blöcke ist wiederholbar
  3. Der Abschluss macht endgültige Schreibvorgänge unnötig
  4. Checkpointing ändert nur Verzeichnisnamen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine Datei hat anfangs zwei Datenblöcke. Die Daten-Journaling-Transaktion T1 hängt die Blöcke 80 und 81 an und wird abgeschlossen. T2 hängt Block 82 in ihren Journalnutzdaten an, hat aber keinen Commit-Datensatz. Ein Absturz tritt ein, nachdem nur das Inode-Abbild von T1 per Checkpoint übertragen wurde. Wie lauten nach der Wiederherstellung die Dateilänge und die Belegungszustände der Blöcke 80 bis 82?
  1. Fünf Blöcke lang; 80, 81 und 82 belegt
  2. Vier Blöcke lang; 80, 81 und 82 belegt
  3. Zwei Blöcke lang; 80, 81 und 82 frei
  4. Vier Blöcke lang; 80 und 81 belegt, 82 frei
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein Journal läuft zum Anfang zurück, während eine abgeschlossene Transaktion erst teilweise per Checkpoint übertragen wurde. Die vorgeschlagene Implementierung verwendet den Platz dieser Transaktion sofort wieder, weil TxE dauerhaft gespeichert ist. Welchen Fehler kann das verursachen?
  1. Die Transaktion verliert trotz TxE ihren Abschluss
  2. Die Wiederherstellung fügt jede protokollierte Änderung ein zweites Mal hinzu
  3. Die Wiederherstellung muss das gesamte Dateisystem per Checkpoint übertragen
  4. Ein Absturz kann die einzigen zum Abschluss benötigten Kopien löschen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Beim geordneten Metadaten-Journaling laufen Datenschreibvorgänge und das Schreiben der Journalmetadaten parallel. Was muss abgeschlossen sein, bevor TxE dauerhaft gespeichert wird?
  1. Sowohl Daten- als auch Journalmetadatenschreibvorgänge
  2. Nur das Schreiben der Daten an ihre endgültige Position
  3. Der Metadaten-Checkpoint an den endgültigen Positionen
  4. Nur die Metadatennutzdaten im Journal
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Die abgeschlossene Transaktion T10 protokolliert Block 70 als Verzeichnismetadaten. Die abgeschlossene T11 widerruft Block 70 nach dem Löschen. Die abgeschlossene T12 protokolliert später ein neues Metadatenabbild für Block 70. Was geschieht bei der Wiederherstellung mit diesen Blockabbildern?
  1. T10 einspielen und T12 überspringen
  2. T10 und T12 beide überspringen
  3. T10 überspringen und T12 einspielen
  4. T10 und T12 beide einspielen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine ext4-Datei wird mit konsistenten Metadaten, aber veralteten Inhalten wiederhergestellt, weil ihre Metadaten abgeschlossen wurden, bevor die zugehörigen Daten ihre endgültige Position erreichten. Welcher Datenmodus erlaubt diese Reihenfolge?
  1. data=writeback
  2. data=ordered
  3. Alle drei Modi gleichermaßen
  4. data=journal
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Soft-Updates-Entwurf schreibt zuerst initialisierte Daten und stürzt dann ab, bevor er deren Zeiger veröffentlicht. Eine spätere Reparatur gewinnt ungenutzten zugewiesenen Speicherplatz zurück. Welchen Kompromiss veranschaulicht das?
  1. Veröffentlichte Zeiger können sicher ungeschriebene Daten bezeichnen
  2. Sichere Referenzen können neben einem Speicherplatzleck bestehen
  3. Jeder Anwendungsschreibvorgang war bereits dauerhaft
  4. Alle Metadatenprüfungen werden überflüssig
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 5: Wandernde Protokolle und Netzwerkcaches10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein LFS-Inode wechselt nach einer Aktualisierung zu einer neuen Festplattenadresse. Welche Struktur bildet seine stabile Nummer auf diese neueste Adresse ab?
  1. Die Inode-Zuordnungstabelle
  2. Das Verzeichnis
  3. Die Inode-Tabelle
  4. Die Datenbitmap
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Warum vermeidet das Speichern stabiler Inode-Nummern in LFS-Verzeichnissen rekursive Aktualisierungen übergeordneter Verzeichnisse, wenn der Inode einer Datei seinen Ort wechselt?
  1. Nur die imap benötigt die geänderte Adresse
  2. Verzeichniseinträge enthalten vollständige Inode-Abbilder
  3. Alte und neue Inode-Adressen bleiben aktuell
  4. Alle Verzeichnisse bleiben im Speicher fixiert
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Das Schreiben eines Segments von 6 MB dauert auf einer Festplatte mit maximal 200 MB/s 40 ms. Wie groß muss ein Segment bei derselben Positionierungsverzögerung sein, um 95 % des Maximums zu erreichen?
  1. 114 MB
  2. 38 MB
  3. 19 MB
  4. 8 MB
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine Segmentzusammenfassung ordnet Adresse 450 dem Inode 9 und dem logischen Block 3 zu. Der neueste Inode 9 laut imap verweist für Block 3 auf Adresse 880. Ist der alte Block bei 450 gültig?
  1. Ja, weil Inode 9 weiterhin existiert
  2. Ja, weil die Zusammenfassung seine Zuordnung nennt
  3. Nein, weil der aktuelle Zeiger abweicht
  4. Nein, weil alle per Checkpoint übertragenen Blöcke ungültig sind
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Ein Cleaner liest sechs gleich große Segmente mit jeweils 50 % gültigen Daten und fasst ihre gültigen Daten in neuen Segmenten zusammen. Wie viele Segmente freier Kapazität werden gewonnen und wie viele Segmentäquivalente gültiger Daten werden geschrieben, wenn der Metadatenaufwand unberücksichtigt bleibt?
  1. 3 gewonnen; 6 geschrieben
  2. 6 gewonnen; 6 geschrieben
  3. 6 gewonnen; 3 geschrieben
  4. 3 gewonnen; 3 geschrieben
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Checkpoint A hat den übereinstimmenden Zeitstempel 52. Checkpoint B hat den Kopfzeitstempel 53 und den Endzeitstempel 51. Auf das in A gespeicherte Protokollende folgen gültige Segmente. Welcher Wiederherstellungsplan erhält die neuesten wiederherstellbaren Änderungen?
  1. A nutzen und dann gültige spätere Segmente vorwärts wiederherstellen
  2. A nutzen und dann jedes Segment außerhalb seiner Zuordnungstabelle verwerfen
  3. B nutzen und dann ältere Segmente als seinen Kopf ignorieren
  4. B nutzen und dann Verzeichnisse aus Inode-Tabellenplätzen wiederherstellen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein Client behält ein NFS-Handle für eine gelöschte Datei. Ihre Inode-Nummer wird für eine andere Datei auf demselben Volume wiederverwendet. Welches Feld des Handles verhindert den Zugriff auf den Ersatz?
  1. Der Deskriptoroffset des Clients
  2. Die Generationsnummer des Inodes
  3. Der Linkzähler des Verzeichnisses
  4. Die Position der offenen Datei auf dem Server
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Ein Client sendet ein NFSv2-WRITE an einem ausdrücklich angegebenen Offset. Der Server führt es dauerhaft aus, stürzt vor der Antwort ab und startet dann neu. Was macht das erneute Senden dieser Anfrage im grundlegenden Wiederherstellungsmodell ausreichend?
  1. Der Server stellt den alten Offset des Clients wieder her
  2. Die Wiederholung hängt Bytes hinter dem gespeicherten Ergebnis an
  3. Der Client schließt, dass die erste Anfrage nie ausgeführt wurde
  4. Das dauerhafte Ergebnis bleibt erhalten und die Wiederholung ist sicher
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Client A schließt eine geänderte NFS-Datei, bevor Client B sie bei Close-to-Open-Konsistenz öffnet. Was sollte B beim erneuten Öffnen sehen?
  1. Nur Änderungen von vor dem ursprünglichen Öffnen durch A
  2. Seine alte Kopie, bis alle Attributfristen ablaufen
  3. Die Änderungen von A nach einer Aktualitätsprüfung
  4. Seine alte Kopie, bis der Server neu startet
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Die AFS-Clients A und B öffnen dieselbe Version. A ändert Bereich X und schließt die Datei. B ändert Bereich Y in seiner noch offenen Kopie und schließt zuletzt. Dann öffnet C die Datei. Welche Version erhält C?
  1. Die ursprüngliche Datei, bis beide Clients erneut öffnen
  2. Die Datei von A, bis der Callback von B abläuft
  3. Die gesamte Version von B, wobei die Änderung von A verloren gehen kann
  4. Eine zusammengeführte Datei mit den Änderungen beider Clients
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 6: Untersuche Dateisystementwürfe10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein Hilfsprogramm kopiert eine Datei erfolgreich auf ein anderes Dateisystem und löscht dann die Quelldatei. Bietet das dieselbe Garantie einer atomaren Ersetzung wie das Umbenennen innerhalb eines Dateisystems?
  1. Nein, weil Kopieren und Löschen getrennte Vorgänge sind
  2. Ja, weil das Löschen die Kopie dauerhaft macht
  3. Ja, weil beide Dateien dieselben Bytes enthalten
  4. Nein, weil alle Verschiebungen harte Links benötigen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

one und two sind harte Links auf eine Datei und shortcut ist ein symbolischer Link mit dem Pfad one. Ein Prozess öffnet two, danach werden alle drei Namen entfernt. Was bleibt, bevor dieser Prozess seinen Deskriptor schließt?
  1. Keine Daten, weil alle Linkobjekte verschwunden sind
  2. Eine namenlose offene Datei mit Linkzähler null
  3. Die Datei mit einem harten Link vom Deskriptor
  4. Ein gültiger symbolischer Link, der das Ziel erreichbar hält
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Ein Inode hat 8 direkte Zeiger, einen einfach indirekten und einen doppelt indirekten Zeiger. Blöcke sind 2 KiB und Adressen 8 Byte groß. Eine nicht dünn besetzte Datei ist 550 KiB lang. Wie viele Blöcke enthalten insgesamt ihre Daten und externen Zeigerstrukturen?
  1. 277 Blöcke
  2. 279 Blöcke
  3. 275 Blöcke
  4. 278 Blöcke
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein Teilstück von 4 MB erreicht 80 MB/s auf einer Festplatte mit einer maximalen Rate von 100 MB/s. Welche Teilstückgröße erreicht bei unverändertem Positionierungsaufwand 95 % des Maximums?
  1. 7,6 MB
  2. 19 MB
  3. 9,5 MB
  4. 76 MB
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Welcher Datensatz markiert beim grundlegenden Daten-Journaling eine Transaktion als abgeschlossen, nachdem ihre Nutzdaten dauerhaft gespeichert sind?
  1. Die Belegungsbitmap allein
  2. Der nächste Verzeichniseintrag
  3. Die neue Inode-Nummer
  4. Der passende TxE-Datensatz
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

T20 protokolliert Block 44 als Verzeichnismetadaten. T21 löscht dieses Verzeichnis, verwendet Block 44 für Benutzerdaten wieder und schließt einen Widerruf für 44 ab. T22 protokolliert ein anderes Metadatenabbild für 44, wird aber nie abgeschlossen. Ein Absturz hinterlässt alle drei Journalnutzdaten lesbar. Was darf die Wiederherstellung auf Block 44 erneut einspielen?
  1. Das Abbild von T22 als neuestes
  2. Das Abbild von T20 als zuletzt abgeschlossenes
  3. Das Abbild von T20, dann das Abbild von T22
  4. Weder das Abbild von T20 noch das von T22
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein Kandidat für die LFS-Bereinigung umfasst drei Segmente und enthält ein Segmentäquivalent gültiger Daten. Ein anderer enthält zwei gültige Äquivalente über drei Segmente. Welcher ergibt bei gleichen Segmentgrößen und ohne Berücksichtigung des Metadatenaufwands mehr freie Kapazität pro geschriebenem Segment gültiger Daten?
  1. Beide: 1 gewonnen pro 1 geschriebenes
  2. Der zweite: 2 gewonnen pro 1 geschriebenes
  3. Der erste: 2 gewonnen pro 1 geschriebenes
  4. Der erste: 3 gewonnen pro 1 geschriebenes
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Ein neuer NFSv2-Entwurf bestätigt einen Schreibvorgang für einen mittleren Block aus flüchtigem Speicher und stürzt dann ab. Der Client hat für diesen Schreibvorgang bereits eine Erfolgsmeldung erhalten und wiederholt daher nur einen späteren, nicht bestätigten Schreibvorgang mit ausdrücklich angegebenem Offset. Welche Schwäche bleibt?
  1. Die bestätigte mittlere Aktualisierung kann weiterhin fehlen
  2. Die Inode-Generation muss dem letzten Offset entsprechen
  3. Die spätere Wiederholung muss den mittleren Block duplizieren
  4. Client-Offsets müssen auf dem Server rekonstruiert werden
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Client liest wiederholt eine Datei, die größer als der Arbeitsspeicher ist. Eine gültige, auf der Festplatte zwischengespeicherte AFS-Kopie bleibt verfügbar. Was vermeidet wiederholte Downloads über das Netzwerk?
  1. Die sofortige globale Sichtbarkeit jedes Schreibvorgangs
  2. Die Umwandlung jedes Lesevorgangs in ein Server-OPEN
  3. Die Wiederverwendung der lokalen Ganzdateikopie auf der Festplatte
  4. Das Abschalten des Callback-Mechanismus des Servers
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein AFS-Server veröffentlicht die von A geänderte Datei und invalidiert den Callback von B. B hat weiterhin eine ältere Lesesitzung geöffnet. Dann startet der Server neu und verliert seine Callback-Listen. Was sollte mit der bestehenden Sitzung von B und bei der späteren Wiederverwendung des Caches geschehen?
  1. Offene Kopie behalten; Neustart erkennen und vor Wiederverwendung erneut prüfen
  2. Offene Kopie behalten; Callbacks nach Serverneustart vertrauen
  3. Offene Sitzung sofort ersetzen; allen alten Callbacks vertrauen
  4. Offene Sitzung ersetzen; erst nach Clientneustart neue Daten holen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

96 Schlüsselbegriffe, jeweils mit Definition

A

Absoluter Pfad
Ein absoluter Pfad bezeichnet ein Objekt ausgehend vom Wurzelverzeichnis, was bei Unix-Pfaden durch einen führenden Schrägstrich angezeigt wird.
Der Pfad /srv/reports/today beginnt an der Wurzel, selbst wenn das aktuelle Verzeichnis des Prozesses /home/lee ist.
Absturzkonsistenz
Absturzkonsistenz ist die Anforderung, dass gespeicherte Dateisystemstrukturen nach unterbrochenen Aktualisierungen in einem einheitlichen gültigen Zustand wiederhergestellt werden können.
Ein Anhängevorgang darf keinen Inode hinterlassen, dem ein Block zugeordnet ist, den der Allokator weiterhin als für eine andere Datei verfügbar betrachtet.
Amortisierung
Amortisierung verteilt einen festen Aufwand auf genügend nutzbare Arbeit, sodass der Aufwand einen kleineren Anteil der Gesamtzeit ausmacht.
Bei einer Übertragung von 9 MB mit 100 MB/s entfällt ein viel kleinerer Teil der Gesamtzeit auf eine Positionierung von 10 ms als bei einer Übertragung von 1 MB.
Andrew File System
Das Andrew File System, kurz AFS, ist ein verteilter Entwurf, der Ganzdatei-Caching auf Clients und Server-Callbacks nutzt, um wiederholte Arbeit zu verringern.
Eine gültige AFS-Kopie im Festplattencache kann ohne neuen Download erneut geöffnet werden, während eine invalidierte Kopie aktualisiert werden muss.
Anhängemodus
Der Anhängemodus ist ein mit O_APPEND gewählter Modus für eine offene Datei, der jeden Schreibvorgang am aktuellen Dateiende platziert.
Ein Protokollierungsprozess nutzt O_APPEND, damit jede neue Nachricht hinter den vorhandenen Dateiinhalt gesetzt wird.
atime
atime ist der Zeitstempel des letzten Zugriffs auf eine Datei und erfasst Inhaltszugriffe gemäß der Zeitstempelstrategie des Dateisystems.
Ein Lesevorgang kann atime aktualisieren, obwohl die übliche Linux-Strategie relatime vermeidet, den Zeitstempel nach jedem Zugriff zu schreiben.
Atomare Ersetzung
Eine atomare Ersetzung stellt einen Zielnamen von einer alten auf eine neue Datei um, ohne zwischenzeitlich einen fehlenden Namen sichtbar zu machen.
Ein rename innerhalb desselben Dateisystems ersetzt config, während lesende Prozesse entweder die alte oder die neue vollständige Datei erreichen.
Atomare Schreibeinheit
Eine atomare Schreibeinheit ist die Datenmenge, die eine Speicherschnittstelle bei einer Unterbrechung garantiert vollständig schreibt oder unverändert lässt.
Ein Journal-Commit-Datensatz muss für das grundlegende Protokoll mit einer Alles-oder-nichts-Markierung in die vom Gerät unterstützte atomare Einheit passen.
Attributcache
Ein Attributcache hält Dateimetadaten vorübergehend vor, damit ein Client nicht bei jedem Zugriff den Server um ihre Prüfung bitten muss.
Die standardmäßigen Linux-Attributzeiten für reguläre Dateien liegen zwischen 3 und 60 Sekunden und erlauben zwischen den Prüfungen veraltete Lesezugriffe.
Ausnahmeregel für große Dateien
Die Ausnahmeregel für große Dateien verteilt spätere Teile einer großen FFS-Datei auf Gruppen, damit sie nicht die ganze Gruppe ihres Verzeichnisses verbrauchen kann.
Die ersten über direkte Zeiger erreichten Blöcke bleiben lokal, während spätere indirekte Teilstücke in andere schwach belegte Gruppen wandern.

B

Belegungsbitmap
Eine Belegungsbitmap verwendet ein Bit pro erfasstem Objekt, um festzuhalten, ob dieser Inode oder Datenblock belegt oder frei ist.
Die Zuweisung eines neuen Datenblocks setzt sein Bit in der Datenbitmap, während eine neue Datei auch ein Bit in der Inode-Bitmap benötigt.
Berechtigungsbits
Berechtigungsbits kodieren Lese-, Schreib- und Ausführungsrechte getrennt für den Eigentümer einer Datei, ihre Gruppe und andere Benutzer.
Der Modus 750 gibt dem Eigentümer alle drei Rechte, der Gruppe Lese- und Ausführungsrechte und anderen keine Rechte.
Blockgruppe
Eine Blockgruppe ist ein aufeinanderfolgender Bereich logischer Festplattenblöcke mit lokalen Belegungsstrukturen, Inodes und Datenplatz.
Ext4 nutzt Blockgruppen, um Lokalität zu erreichen, obwohl das Laufwerk seine tatsächliche Geometrie nicht offenlegt.

C

Cache-Treffer
Ein Cache-Treffer liegt vor, wenn angeforderte Informationen bereits im Cache vorhanden sind und genutzt werden können, ohne sie vom Speichergerät zu holen.
Das Öffnen einer benachbarten Datei kann Verzeichnisblöcke wiederverwenden, die von der vorherigen Pfadauflösung im Cache geblieben sind.
Callback
Ein AFS-Callback ist die Zusage eines Servers, einen Client zu benachrichtigen, wenn sich ein zwischengespeichertes Objekt ändert, sodass es ohne wiederholte Prüfungen erneut genutzt werden kann.
Das Veröffentlichen einer geänderten Datei führt dazu, dass der Server die Callbacks anderer Clients aufhebt, sodass spätere Öffnungen deren Kopien aktualisieren.
Checkpoint-Bereich
Der Checkpoint-Bereich ist eine feste LFS-Position, die Adressen der neuesten imap-Stücke speichert, sodass das wandernde Protokoll auffindbar ist.
Beim Einhängen liest das System den Checkpoint-Bereich, bevor es die Inode-Zuordnungstabelle lädt und Datei-Inodes findet.
Checkpointing
Checkpointing kopiert beim Journaling die protokollierten Blöcke einer abgeschlossenen Transaktion an ihre gewöhnlichen endgültigen Positionen im Dateisystem.
Journalplatz wird weiterhin benötigt, bis das Checkpointing jedes erforderliche Abbild sicher an seiner Zielposition abgelegt hat.
Cleaner
Der Cleaner ist die LFS-Komponente, die gültige Blöcke aus teilweise belegten Segmenten kopiert und die alten Segmente zur Wiederverwendung freigibt.
Das Verdichten von vier Segmenten mit je einem Viertel gültiger Daten in ein Segment gewinnt drei Segmente Kapazität und verursacht Kopierzugriffe.
Close-to-Open-Konsistenz
Close-to-Open-Konsistenz macht die gesendeten Änderungen eines schreibenden Clients für einen später öffnenden Prozess sichtbar und erlaubt zugleich eine schwächere Sichtbarkeit während offener Sitzungen.
Nachdem Client A eine geänderte NFS-Datei schließt, öffnet Client B sie und prüft seinen Cache, bevor er die Änderungen liest.
Commit-Datensatz
Ein Commit-Datensatz markiert eine Transaktion als abgeschlossen und wiederherstellbar, nachdem ihre erforderlichen Journalinhalte dauerhaften Speicher erreicht haben.
Nutzdatenblöcke ohne gültigen passenden Commit-Datensatz werden vom grundlegenden Protokoll zur Wiederherstellung durch erneutes Ausführen ignoriert.
Copy-on-Write
Copy-on-Write legt geänderte Blöcke an neuen Adressen ab und veröffentlicht eine neue Wurzel, wobei die alte Version bis zur Umstellung intakt bleibt.
Ein Absturz vor der Veröffentlichung lässt den alten Baum erreichbar, statt eine Mischung von Aktualisierungen an Ort und Stelle sichtbar zu machen.
ctime
ctime ist der Zeitstempel für Statusänderungen des Inodes. Er wird bei Schreibvorgängen und Änderungen etwa an Berechtigungen, Eigentumsverhältnissen oder Links aktualisiert.
Ein Aufruf von chmod ändert ctime, obwohl die Bytes und damit die Zeit der Inhaltsänderung unverändert bleiben.

D

Dateideskriptor
Ein Dateideskriptor ist eine prozesslokale nicht negative Ganzzahl, die auf einen Kernel-Eintrag für eine offene Datei verweist.
Nachdem open den Wert 4 zurückgegeben hat, übergibt das Programm für diese offene Referenz 4 an read, write und close.
Dateihandle
Ein Dateihandle identifiziert ein entferntes Objekt anhand von Informationen wie Server-Volume, Inode-Nummer und Generation.
Ein Client nimmt das Handle in READ auf, damit der Server das Objekt kennt, ohne auf eine vorherige OPEN-Anfrage angewiesen zu sein.
Dateioffset
Ein Dateioffset ist die Byteposition in einem Eintrag für eine offene Datei, an der der nächste gewöhnliche Lese- oder Schreibvorgang beginnt.
Das Lesen von 32 Byte ab Offset 80 hinterlässt den Offset bei 112, wenn die vollständige Anzahl zurückgegeben wird.
Dateizuordnungstabelle
Die Dateizuordnungstabelle, kurz FAT, speichert Verweise auf den jeweils nächsten Block von Dateien in einer separaten Tabelle und bildet so von jedem ersten Block aus eine Kette.
Um den zwanzigsten Block einer Datei zu finden, muss man ihrer Kette folgen, selbst wenn die Tabelle im Cache liegt.
Datenblock
Ein Datenblock ist eine Zuweisungseinheit, die Dateiinhalte oder Verzeichniseinträge enthält und über die gespeicherte Zuordnung des Objekts erreicht wird.
Der Datenblock eines Verzeichnisses enthält Namen und Inode-Nummern, während der Block einer regulären Datei deren Bytes enthält.
Datenmüll
Datenmüll sind unbeabsichtigte alte oder ungültige Inhalte, die über eine Datei sichtbar werden, selbst wenn ihre Zeiger und Belegungsinformationen übereinstimmen.
Wird ein neuer Blockzeiger festgeschrieben, bevor die neuen Bytes des Blocks eintreffen, kann eine gültig aussehende Datei die vorherigen Inhalte des Blocks sichtbar machen.
Dauerhaftigkeit
Dauerhaftigkeit ist die Eigenschaft, dass eine bestätigte gespeicherte Aktualisierung nach einem Absturz oder Stromausfall verfügbar bleibt.
Ein Editor wartet auf ein erfolgreiches fsync, bevor er meldet, dass der neue Inhalt eines Dokuments dauerhaft gespeichert ist.
Direkter Zeiger
Ein direkter Zeiger ist eine in einem Inode gespeicherte Adresse, die ohne separaten Zeigerblock unmittelbar auf einen Datenblock zeigt.
Der dritte direkte Zeiger findet den logischen Dateiblock 2, weil die Blocknummerierung bei null beginnt.
Doppelt indirekter Zeiger
Ein doppelt indirekter Zeiger erreicht einen Block mit Zeigern auf indirekte Blöcke und fügt damit vor den Daten eine zweite Adressebene hinzu.
Eine Datei, die die direkte und einfach indirekte Kapazität überschreitet, erhält einen doppelt indirekten Wurzelblock und genügend indirekte Kindblöcke.
Doppelter Blockzeiger
Ein doppelter Blockzeiger ist ein Blockverweis, der eine widersprüchliche Zuordnung ergibt, wenn zwei Inodes denselben Datenblock beanspruchen.
Eine Reparatur kann jeder Datei eine eigene Kopie geben, damit eine Änderung an einer Datei nicht unbemerkt die Daten der anderen ändert.
Dünn besetzte Datei
Eine dünn besetzte Datei enthält logische, mit Nullen gefüllte Bereiche, die das Dateisystem ohne Zuweisung von Datenblöcken darstellen kann.
Das Schreiben eines Bytes weit hinter dem Ende kann eine große logische Datei mit wenig zugewiesenem Speicherplatz erzeugen.

E

Einhängepunkt
Ein Einhängepunkt ist ein vorhandener Verzeichnispfad, an dem die Wurzel eines anderen Dateisystems in den sichtbaren Verzeichnisbaum eingefügt wird.
Das Einhängen eines Laufwerks unter /media/usb verbirgt den bisherigen Inhalt dieses Verzeichnisses, solange das Dateisystem dort eingehängt bleibt.
Eintrag in der Tabelle geöffneter Dateien
Ein Eintrag in der Tabelle geöffneter Dateien ist ein Kernel-Datensatz, der Offset, Zugriffsmodus, Inode-Referenz und Referenzzähler einer offenen Datei enthält.
Mit dup erzeugte Deskriptoren zeigen auf einen gemeinsamen Eintrag, sodass ein Positionierungsvorgang über einen der beiden ihre gemeinsame Position ändert.
Extent
Ein Extent besteht aus einer Anfangsadresse auf der Festplatte und einer Folgenlänge, die zusammen eine zusammenhängende Folge von Blöcken einer Datei beschreiben.
Eine zusammenhängende Datei mit 1.000 Blöcken kann einen Extent nutzen, statt 1.000 einzelne Blockadressen zu speichern.

F

Fragmentierung
Fragmentierung ist die Verstreuung freien Speicherplatzes oder der Blöcke einer Datei auf getrennte Bereiche, wodurch der Zugriffsaufwand steigt.
Eine Datei kann aufeinanderfolgende Byteoffsets haben und dennoch wiederholte Positionierungen erfordern, weil ihre zugewiesenen Blöcke verstreut liegen.
fsck
fsck ist ein Dateisystemprüfprogramm, das Metadaten durchsucht und nach einer Beschädigung Beziehungen zwischen Belegung, Zeigern, Inodes und Verzeichnissen repariert.
Das Prüfprogramm kann ein Bitmap-Bit setzen, wenn ein gültiger Inode den Block beansprucht, die Bitmap ihn aber fälschlich als frei ausweist.

G

Ganzdatei-Caching
Ganzdatei-Caching hält eine vollständige Datei auf dem Client vor und bedient lokale Lese- und Schreibzugriffe, solange diese zwischengespeicherte Version nutzbar bleibt.
AFS kann eine gültige, auf der Festplatte zwischengespeicherte Datei ohne erneuten Download öffnen, selbst nachdem sie nicht mehr in den Arbeitsspeicher passt.
Generationsnummer
Eine Generationsnummer unterscheidet aufeinanderfolgende Objekte, denen dieselbe Inode-Nummer zugewiesen wird, und schützt Clients vor veralteten Identitäten.
Die Wiederverwendung von Inode 31 mit einer neueren Generation verhindert, dass ein altes Handle für den gelöschten Inode 31 seinen Ersatz bezeichnet.
Geordnetes Journaling
Geordnetes Journaling ist Metadaten-Journaling, das referenzierte Daten an ihrer endgültigen Position dauerhaft speichert, bevor die Metadaten festgeschrieben werden.
Ein neuer Datenblock und Journalmetadaten können parallel geschrieben werden, aber beide Vorgänge müssen vor dem Commit-Datensatz abgeschlossen sein.
Gültiger Block
Ein gültiger Block ist ein gespeicherter Block, auf den die neueste gültige Zuordnung für seine zugehörige Datei und logische Position weiterhin verweist.
Eine Zusammenfassung nennt Inode 14 und Block 2, aber die alte Adresse ist ungültig, wenn der neueste Inode anderswohin zeigt.

H

Harter Link
Ein harter Link ist ein Verzeichnisname, der direkt auf einen vorhandenen Inode verweist und seinen anderen Namen gleichgestellt ist.
Nach ln draft copy zeigt copy nach dem Entfernen von draft weiterhin auf dieselbe Datei und ihre vorhandenen Bytes.
Heißes Segment
Ein heißes Segment enthält Blöcke, die häufig ersetzt werden, sodass durch Warten vor der Bereinigung weitere Blöcke ungültig werden können.
Das Zurückstellen eines heißen Segments kann das Kopieren von Daten sparen, die ein weiterer Anwendungsschreibvorgang bald ungültig machen wird.

I

Idempotenz
Idempotenz bedeutet, dass die Wiederholung einer Operation dieselbe Wirkung wie ihre einmalige Ausführung hat, sodass geeignete Anfragen sicher wiederholt werden können.
Die Wiederholung eines WRITE mit ausdrücklich angegebenem Offset speichert identische Bytes an derselben Stelle, statt sie erneut hinzuzufügen.
Indirekter Block
Ein indirekter Block speichert ein Feld von Blockadressen und erweitert so die Datenmenge, die über einen einzelnen Zeiger im Inode erreicht werden kann.
Ein 4 KiB großer indirekter Block mit Adressen zu je 4 Byte kann 1.024 getrennte Datenblöcke bezeichnen.
Inode
Ein Inode ist ein Unix-artiger Dateisystemdatensatz, der die Metadaten und Datenpositionen eines Objekts speichert, aber nicht dessen Dateinamen.
Zwei Verzeichnisnamen können Inode 28 gemeinsam nutzen, sodass eine Änderung der Datei über einen der beiden Namen dasselbe Objekt aktualisiert.
Inode-Tabelle
Eine Inode-Tabelle ist ein Bereich mit Inode-Datensätzen fester Größe, deren Positionen aus ihren Inode-Nummern berechnet werden können.
Eine Tabelle, die bei Byte 16.384 beginnt, platziert Inode 20 mit einer Größe von 256 Byte bei der absoluten Byteadresse 21.504.
Inode-Zuordnungstabelle
Die Inode-Zuordnungstabelle, kurz imap, übersetzt jede stabile Inode-Nummer in die Festplattenadresse ihrer neuesten Version in einem LFS-Protokoll.
Ein Verzeichnis kann die Inode-Nummer 14 behalten, selbst wenn der neueste Inode von Adresse 300 zu Adresse 900 wandert.

J

Journal
Ein Journal ist ein reserviertes Protokoll auf der Festplatte, das Aktualisierungsdatensätze enthält, damit abgeschlossene Änderungen nach unterbrochenen Schreibvorgängen wiederhergestellt werden können.
Ein Absturz während des Checkpointings kann mithilfe des Journals behoben werden, ohne jeden Inode des Dateisystems zu durchsuchen.

L

Last-Closer-Wins-Konsistenz
Last-Closer-Wins-Konsistenz löst gleichzeitige AFS-Schreibvorgänge auf, indem der zuletzt schließende Client die gesamte Dateiversion auf dem Server ersetzt.
Zwei Clients, die unterschiedliche Bereiche bearbeiten, können dennoch eine Änderung verlieren, weil das Schließen eine vollständige lokale Kopie veröffentlicht.
Lease
Ein Lease ist ein zeitlich begrenzter serverseitig verwalteter Zustand oder eine entsprechende Zusage. Ein Client muss den Lease erneuern, um ihn zu erhalten; nach einem Ausfall kann er ablaufen.
Ein NFSv4-Server kann den Zustand eines abgestürzten Clients freigeben, wenn dessen Lease ohne Erneuerung abläuft.
Linkzähler
Ein Linkzähler erfasst, wie viele Verzeichnisnamen auf einen Inode verweisen; für klassische Unix-Verzeichnisse gelten besondere Zählregeln für die Punkteinträge.
Zwei harte Links auf eine reguläre Datei ergeben den Linkzähler 2, unabhängig davon, wie viele Deskriptoren geöffnet sind.
Logische Protokollierung
Logische Protokollierung zeichnet eine Beschreibung einer Aktualisierungsoperation auf, statt vollständige Ersatzabbilder jedes geänderten Blocks zu speichern.
Ein kompakter Operationsdatensatz beschreibt eine Änderung, während ein physisches Journal die neuen Blockbytes selbst enthält.
Logischer Dateiblock
Ein logischer Dateiblock ist ein blockgroßer Teil einer Datei, der unabhängig von seiner Festplattenposition durch seine Position innerhalb dieser Datei bezeichnet wird.
Die logischen Blöcke 0 und 1 können weit voneinander entfernt gespeichert sein, obwohl ihre Bytebereiche aufeinanderfolgen.
Logstrukturiertes Dateisystem
Ein logstrukturiertes Dateisystem schreibt gepufferte Daten und Metadaten sequenziell an ungenutzte Stellen und ersetzt alte Versionen durch neue Zuordnungen.
Die Aktualisierung eines Dateiblocks schreibt einen neuen Block und Inode, statt ihre bisherigen Festplattenpositionen zu überschreiben.

M

Metadaten
Metadaten sind Informationen, die eine Datei beschreiben, etwa Typ, Größe, Eigentumsverhältnisse, Berechtigungen, Zeitstempel und Datenpositionen.
fstat liest Metadaten über einen Deskriptor, ohne den Dateiinhalt als Metadatensatz zu behandeln.
Metadaten-Journaling
Metadaten-Journaling protokolliert Änderungen an Dateisystemstrukturen, während gewöhnliche Dateidaten direkt an ihre endgültigen Positionen geschrieben werden.
Sowohl der Ordered- als auch der Writeback-Modus protokolliert Metadaten, aber nur der Ordered-Modus schreibt Daten zwingend vor dem Commit.
mtime
mtime ist der Zeitstempel der letzten Inhaltsänderung einer Datei und unterscheidet Änderungen an gespeicherten Bytes von anderen Statusänderungen des Inodes.
Das Ändern von Berechtigungen aktualisiert ctime, während das Schreiben des Dateiinhalts sowohl mtime als auch ctime aktualisiert.

N

Namensraumlokalität
Namensraumlokalität ist die Tendenz, auf Dateien, die im Verzeichnisbaum nahe beieinanderliegen, insbesondere innerhalb eines Verzeichnisses, gemeinsam zuzugreifen.
Ein Compiler, der mehrere Quelldateien eines Projekts öffnet, profitiert davon, wenn ihre Inodes und Inhalte nahe beieinanderliegen.
Network File System
Das Network File System, kurz NFS, ist eine Familie von Protokollen für den Zugriff auf Serverdateien mit einem zustandslosen v2- und einem zustandsbehafteten v4-Entwurf.
Ein Linux-Client versucht normalerweise zuerst NFS-Version 4.2, sodass das ältere zustandslose Modell nicht jede Einhängung beschreibt.
Nicht erreichbarer Inode
Ein nicht erreichbarer Inode ist ein zugewiesener Inode, der von der Wurzel des Dateisystems aus nicht über den Verzeichnisbaum erreicht werden kann.
Nach einer Verzeichnisbeschädigung kann fsck einen ansonsten gültigen nicht erreichbaren Inode zur Prüfung in lost+found ablegen.

P

Partieller Schreibvorgang
Ein partieller Schreibvorgang ist ein erfolgreicher Schreibaufruf, der weniger geschriebene Bytes meldet, als das Programm angefordert hat.
Gibt write bei einer Anforderung von 500 Byte den Wert 200 zurück, muss das Programm die verbleibenden 300 Byte noch behandeln.
Pfadauflösung
Die Pfadauflösung löst einen Pfad Komponente für Komponente auf und nutzt Verzeichnisinhalte, um jeweils den nächsten Inode zu finden, bis das Ziel erreicht ist.
Beim Öffnen von /team/result wird zuerst team im Wurzelverzeichnis und dann result im Verzeichnis team gefunden.
Physische Protokollierung
Physische Protokollierung zeichnet vollständige Ersatzblockabbilder auf, sodass die Wiederherstellung eine Aktualisierung durch Schreiben dieser Abbilder an feste Adressen erneut ausführen kann.
Das erneute Einspielen eines Inode-Abbilds schreibt dieselben gespeicherten Bytes erneut, selbst wenn das Abbild vor dem Absturz per Checkpoint übertragen wurde.
Positionierungsaufwand
Positionierungsaufwand umfasst Positionierungszeit und Rotationslatenz, die bei einer Festplatte anfallen, bevor sie mit der Übertragung angeforderter Daten beginnen kann.
Zwei weit voneinander entfernte Lesezugriffe von je 4 KiB können wesentlich mehr Zeit für die Positionierung als für die Übertragung ihrer kleinen Inhalte benötigen.

R

Rekursives Aktualisierungsproblem
Das rekursive Aktualisierungsproblem entsteht, wenn das Verschieben eines Objekts das Neuschreiben übergeordneter Zeiger erzwingt, die sich dadurch verschieben und weitere Schreibvorgänge erzwingen.
Stabile Inode-Nummern und die imap verhindern, dass ein verschobener Datei-Inode Aktualisierungen bis hinauf zur Wurzel erzwingt.
Relativer Pfad
Ein relativer Pfad bezeichnet ein Objekt ausgehend vom aktuellen Arbeitsverzeichnis des Prozesses statt von der Wurzel.
Von /srv/reports aus erreicht der Pfad ../logs das Verzeichnis /srv/logs, indem er zuerst dem Eintrag für das übergeordnete Verzeichnis folgt.
Ringprotokoll
Ein Ringprotokoll verwendet einen begrenzten Speicherbereich erneut, indem es zum Anfang zurückkehrt und Datensätze freigibt, deren Wiederherstellungsarbeit abgeschlossen ist.
Wurde eine Transaktion per Checkpoint übertragen, kann ihr Journalplatz für eine spätere Transaktion verfügbar werden.

S

Schreibpufferung
Schreibpufferung hält geänderte Blöcke vorübergehend im Speicher, damit das System Schreibvorgänge bündeln, planen oder manchmal vermeiden kann.
Das kurz aufeinanderfolgende Erzeugen zweier Dateien kann eine Bitmap im Speicher aktualisieren und diese später nur einmal schreiben.
Segment
Ein Segment ist eine große sequenzielle Ausgabeeinheit von LFS, die gepufferte Daten und Metadaten enthält, die gemeinsam an eine ungenutzte Stelle geschrieben werden.
Das Zusammenfassen vieler kleiner Änderungen in einem Segment verteilt den Positionierungsaufwand einer Festplatte auf eine längere Übertragung.
Segmentzusammenfassung
Eine Segmentzusammenfassung speichert Zuordnungsinformationen wie Inode-Nummer und logischen Offset für Blöcke, die in einem LFS-Segment gespeichert sind.
Der Cleaner nutzt die Zusammenfassung, um herauszufinden, welchen aktuellen Inode-Zeiger er mit der Adresse eines Blocks vergleichen muss.
Seitencache
Der Seitencache ist Speicher, in dem Dateidaten und zugehörige Blöcke vorgehalten werden, damit spätere Zugriffe Operationen auf dem Speichergerät vermeiden können.
Ein zweiter Lesezugriff auf einen unveränderten zwischengespeicherten Block kann Bytes zum Programm kopieren, ohne einen weiteren Festplattenlesezugriff auszulösen.
Snapshot
Ein Snapshot bewahrt eine Sicht auf einen früheren Dateisystemzustand, indem die älteren Blöcke und Zuordnungen erhalten bleiben, die diese Version bestimmen.
Copy-on-Write kann den alten Baum verfügbar halten, während geänderte Blöcke für die aktuelle Version geschrieben werden.
Soft Updates
Soft Updates ordnen abhängige Metadaten- und Datenschreibvorgänge so, dass unsichere Referenzen verhindert werden, ohne Aktualisierungen in einem Journal aufzuzeichnen.
Das Schreiben initialisierter Daten vor dem Zeiger kann nach einem Absturz ein Speicherplatzleck hinterlassen und zugleich einen erreichbaren ungültigen Block vermeiden.
Speicherplatzleck
Ein Speicherplatzleck ist zugewiesener Speicherplatz, den kein erreichbares zugehöriges Objekt nutzt, sodass Kapazität nicht verfügbar ist, ohne nützliche Inhalte zu erhalten.
Eine Bitmap-Aktualisierung ohne den zugehörigen neuen Inode-Zeiger kann einen Block reservieren, den nach der Wiederherstellung keine Datei erreicht.
Spurpuffer
Ein Spurpuffer ist Laufwerksspeicher, der von einer Spur gelesene Daten vorhält und so den Bedarf an softwaregesteuerten Rotationsabständen verringert.
Das Laufwerk kann den nächsten angeforderten Block aus seinem Spurpuffer zurückgeben, selbst nachdem er unter dem Kopf vorbeigelaufen ist.
Superblock
Ein Superblock speichert die Anzahlen, Aufteilungsinformationen und Kennwerte, die benötigt werden, um ein Dateisystem zu interpretieren und einzuhängen.
Das Betriebssystem liest den Superblock, um die Inode-Tabelle zu finden, bevor es einzelne Dateien sucht.
Symbolischer Link
Ein symbolischer Link ist eine eigenständige Datei, deren Inhalt einen Zielpfad angibt, dem das System bei der Pfadauflösung folgt.
Ein Link auf /media/archive kann ein anderes Dateisystem erreichen, schlägt aber fehl, wenn sein Zielpfad verschwindet.

T

Teilblock
Ein Teilblock ist ein kleineres Zuweisungsstück, das FFS nutzt, um kurze Dateien zu speichern, ohne einen ganzen großen Dateisystemblock zu verschwenden.
Eine kurze Datei kann ein Stück von 512 Byte belegen, bevor ihr Wachstum das Kopieren ihres Inhalts in einen vollständigen Block erfordert.
Transaktion
Eine Transaktion fasst zusammengehörige Aktualisierungen unter einer gemeinsamen Commit-Entscheidung zusammen, sodass die Wiederherstellung eine vollständige Änderung akzeptiert oder ignoriert.
Eine Anhängetransaktion kann ein neues Inode-Abbild, ein Abbild der Belegungsbitmap und den neuen Datenblock enthalten.
Transaktionsprüfsumme
Eine Transaktionsprüfsumme fasst protokollierte Inhalte zusammen, sodass die Wiederherstellung unvollständige oder beschädigte Transaktionsnutzdaten erkennen kann.
Eine passend aussehende Commit-Markierung reicht nicht aus, wenn die Prüfung zeigt, dass ein Teil ihrer Nutzdaten fehlt.
Trunkierung
Trunkierung ändert die logische Länge einer Datei; eine Verkürzung verwirft die letzten Bytes, während eine Verlängerung Bytes erzeugt, die als Nullen gelesen werden.
Das Öffnen einer vorhandenen Datei mit O_TRUNC leert sie, bevor das Programm Ersatzinhalte schreibt.

U

umask
Eine umask ist eine Prozesseinstellung, die ausgewählte Berechtigungsbits aus den für eine neue Datei angeforderten Berechtigungen entfernt.
Ohne Standard-ACL ändert die umask 0022 eine Anforderung von 0666 zu den Berechtigungen 0644.
Ungültiger Blockzeiger
Ein ungültiger Blockzeiger ist eine gespeicherte Blockadresse außerhalb des gültigen Adressbereichs des Dateisystems, die daher keine gültigen zugeordneten Daten bezeichnen kann.
Zeigt ein Inode über das Ende der Partition hinaus, setzt fsck diesen ungültigen Zeiger bei der Reparatur zurück.

V

Veralteter Cache
Ein veralteter Cache enthält eine ältere Kopie eines Objekts, die nicht mehr der aktuell von seinem Server veröffentlichten Version entspricht.
Ein Client mit einer bereits offenen Datei kann alte zwischengespeicherte Bytes lesen, nachdem ein anderer Client eine geänderte Version geschlossen hat.
Veränderter Puffer
Ein veränderter Puffer ist eine Kopie von Daten oder Metadaten im Arbeitsspeicher, die geändert wurde und noch auf das Speichergerät geschrieben werden muss.
Mehrere Bearbeitungen können einen veränderten Block aktualisieren, bevor das Dateisystem seinen endgültigen Inhalt an das Gerät sendet.
Verteiltes Dateisystem
Ein verteiltes Dateisystem ermöglicht Client-Rechnern, auf Servern gespeicherte Dateien über ein Netzwerk mit vertrauten Dateioperationen zu nutzen.
Der Client übersetzt ein read eines Programms in eine Anfrage, die eine Serverdatei und den gewünschten Bytebereich bezeichnet.
Verzeichniseintrag
Ein Verzeichniseintrag ordnet einem Namen eine Inode-Nummer zu, sodass eine Verzeichnissuche das benannte Objekt identifizieren kann.
Das Hinzufügen eines harten Links erzeugt einen weiteren Verzeichniseintrag für einen vorhandenen Inode, ohne Dateiinhalte zu kopieren.
Virtuelles Dateisystem
Das virtuelle Dateisystem ist eine Kernel-Schicht, die gemeinsame Dateioperationen für unterschiedliche zugrunde liegende Dateisystemtypen bereitstellt.
Ein Programm kann read für eine ext4-Datei und eine NFS-Datei nutzen, während deren Implementierungen unterschiedliche Speicher behandeln.
Vorwärtswiederherstellung
Die Vorwärtswiederherstellung durchsucht gültige Protokollaktualisierungen nach einem Checkpoint und wendet sie an, um einen neueren Zustand als den dieses Checkpoints zu rekonstruieren.
Ein nach dem letzten Checkpoint geschriebenes Segment kann weiterhin wiederhergestellt werden, wenn seine Aktualisierung gültig und vollständig ist.

W

Widerrufsdatensatz
Ein Widerrufsdatensatz weist die Wiederherstellung an, veraltete protokollierte Abbilder eines Blocks aus Transaktionen bis einschließlich der widerrufenden Transaktion nicht erneut einzuspielen.
Ein Widerruf verhindert, dass ein altes Verzeichnisabbild Benutzerdaten überschreibt, nachdem derselbe Festplattenblock wiederverwendet wurde.
Writeback-Journalingmodus
Der Writeback-Journalingmodus protokolliert Metadaten, ohne zu verlangen, dass zugehörige Datenblöcke vor dem Commit den endgültigen Speicher erreichen.
Nach der Wiederherstellung in data=writeback können Metadaten konsistent sein, selbst wenn eine kürzlich geschriebene Datei veraltete Bytes enthält.

Z

Zugriffskontrollliste
Eine Zugriffskontrollliste ergänzt Berechtigungsregeln für benannte Benutzer oder Gruppen über die Berechtigungsklassen Eigentümer, Gruppe und andere hinaus.
Eine ACL kann einem bestimmten Projektmitglied Zugriff gewähren, ohne jedem anderen Benutzer dieselben Rechte zu geben.
Zustandsloser Server
Ein zustandsloser Server führt in sich vollständige Anfragen aus, ohne pro Client Zustand offener Dateien wie Deskriptoren und Offsets vorzuhalten.
Ein NFSv2-Server kann nach einem Neustart wieder Anfragen bedienen, ohne die Tabelle offener Dateien jedes Clients neu aufzubauen.
Zylindergruppe
Eine Zylindergruppe ist ein FFS-Bereich benachbarter Festplattenzylinder, der seine Inodes, Bitmaps und Daten physisch nahe beieinander hält.
Die Platzierung einer kleinen Datei in der Zylindergruppe ihres Verzeichnisses verkürzt Positionierungen zwischen den aktualisierten Strukturen.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten