Add the translation for the details about soft updates (rev 1.33 of
the English version). Submitted by: Matthias Schuendehuette <msch@snafu.de> Reviewed by: Martin Heinen <martin@sumuk.de>
This commit is contained in:
parent
cff9e5728e
commit
9b1303747c
Notes:
svn2git
2020-12-08 03:00:23 +00:00
svn path=/head/; revision=12066
1 changed files with 171 additions and 0 deletions
|
@ -943,6 +943,177 @@ kern.maxfiles: 2088 -> 5000</screen>
|
||||||
z.B. während eines <command>make installworld</command>,
|
z.B. während eines <command>make installworld</command>,
|
||||||
kann das Dateisystem vollaufen lassen. Dadurch würde
|
kann das Dateisystem vollaufen lassen. Dadurch würde
|
||||||
die Aktualisierung fehlschlagen.</para>
|
die Aktualisierung fehlschlagen.</para>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>Details über Soft Updates</title>
|
||||||
|
|
||||||
|
<indexterm><primary>Soft Updates (Details)</primary></indexterm>
|
||||||
|
|
||||||
|
<para>Es gibt zwei klassische Herangehensweisen, wie
|
||||||
|
man die Metadaten des Dateisystems (also Daten
|
||||||
|
über Dateien, wie i-node Bereiche oder Verzeichniseinträge)
|
||||||
|
aktualisiert auf die Platte zurückschreibt:</para>
|
||||||
|
|
||||||
|
<para>Das historisch übliche Verfahren waren synchrone
|
||||||
|
Updates der Metadaten, d. h. wenn eine Änderung an
|
||||||
|
einem Verzeichnis nötig war, wurde anschließend
|
||||||
|
gewartet, bis diese Änderung tatsächlich auf die
|
||||||
|
Platte zurückgeschrieben worden war. Der
|
||||||
|
<emphasis>Inhalt</emphasis> der Dateien wurde im
|
||||||
|
<quote>Buffer Cache</quote> zwischengespeichert und
|
||||||
|
asynchron irgendwann später auf die Platte geschrieben.
|
||||||
|
Der Vorteil dieser Implementierung ist, daß sie sehr
|
||||||
|
sicher funktioniert. Wenn während eines Updates ein
|
||||||
|
Ausfall erfolgt, haben die Metadaten immer einen
|
||||||
|
konsistenten Zustand. Eine Datei ist entweder komplett
|
||||||
|
angelegt oder gar nicht. Wenn die Datenblöcke der
|
||||||
|
Datei den Weg aus dem <quote>Buffer Cache</quote> noch nicht
|
||||||
|
auf die Platte gefunden haben, dann kann &man.fsck.8; dies
|
||||||
|
feststellen und das Dateisystem reparieren (die
|
||||||
|
Dateilänge wird dann auf 0 gesetzt). Außerdem
|
||||||
|
ist die Implementierung einfach und überschaubar. Der
|
||||||
|
Nachteil ist, daß Änderungen der Metadaten sehr
|
||||||
|
langsam vor sich gehen. Ein <command>rm -r</command>
|
||||||
|
beispielsweise faßt alle Dateien eines Verzeichnisses
|
||||||
|
der Reihe nach an, aber jede dieser Änderungen am
|
||||||
|
Verzeichnis (Löschen einer Datei) wird einzeln synchron
|
||||||
|
auf die Platte geschrieben. Gleiches beim Auspacken
|
||||||
|
großer Hierarchien (<command>tar -x</command>).</para>
|
||||||
|
|
||||||
|
<para>Der zweite Fall sind asynchrone Metadaten-Updates. Das
|
||||||
|
ist z. B. der Standard bei Linux/ext2fs oder die Variante
|
||||||
|
<command>mount -o async</command> für *BSD UFS. Man
|
||||||
|
schickt die Updates der Metadaten einfach auch noch
|
||||||
|
über den <quote>Buffer Cache</quote>, sie werden also
|
||||||
|
zwischen die Updates der normalen Daten eingeschoben.
|
||||||
|
Vorteil ist, daß man nun nicht mehr auf jeden Update
|
||||||
|
warten muß, Operationen mit vielen
|
||||||
|
Metadatenänderungen werden also viel schneller. Auch
|
||||||
|
hier ist die Implementierung sehr einfach und wenig
|
||||||
|
anfällig für Fehler. Nachteil ist, daß
|
||||||
|
keinerlei Konsistenz des Dateisystems mehr gesichert ist.
|
||||||
|
Wenn mitten in einer Operation, die viele Metadaten
|
||||||
|
ändert, ein Ausfall erfolgt (Stromausfall, drücken
|
||||||
|
des Reset-Tasters), dann ist das Dateisystem
|
||||||
|
anschließend in einem unbestimmten Zustand. Niemand
|
||||||
|
kann genau sagen, was noch geschrieben worden ist und was
|
||||||
|
nicht mehr; die Datenblöcke einer Datei können
|
||||||
|
schon auf der Platte stehen, während die i-node Tabelle
|
||||||
|
oder das zugehörige Verzeichnis nicht mehr aktualisiert
|
||||||
|
worden ist. Man kann praktisch kein <command>fsck</command>
|
||||||
|
mehr implementieren, das diesen Zustand
|
||||||
|
wieder reparieren kann, da die dazu nötigen
|
||||||
|
Informationen einfach auf der Platte fehlen. Wenn ein
|
||||||
|
Dateisystem derart beschädigt worden ist, kann man es
|
||||||
|
nur neu erzeugen (<command>newfs</command>) und die Daten
|
||||||
|
vom Backup zurückspielen.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>Der historische Ausweg aus diesem Dilemma war ein
|
||||||
|
<emphasis>dirty region logging</emphasis> (auch als
|
||||||
|
<emphasis>Journalling</emphasis> bezeichnet, wenngleich
|
||||||
|
dieser Begriff nicht immer gleich benutzt und manchmal auch
|
||||||
|
für andere Formen von Transaktionsprotokollen gebraucht
|
||||||
|
wird). Man schreibt die Metadaten-Updates zwar synchron,
|
||||||
|
aber nur in einen kleinen Plattenbereich, die
|
||||||
|
<emphasis>logging area</emphasis>. Von da aus werden sie
|
||||||
|
dann asynchron auf ihre eigentlichen Bereiche verteilt. Da
|
||||||
|
die <emphasis>logging area</emphasis> ein kleines
|
||||||
|
zusammenhängendes Stückchen ist, haben die
|
||||||
|
Schreibköpfe der Platte bei massiven Operationen auf
|
||||||
|
Metadaten keine allzu großen Wege zurückzulegen,
|
||||||
|
so daß alles ein ganzes Stück schneller geht als
|
||||||
|
bei klassischen synchronen Updates. Die Komplexität
|
||||||
|
der Implementierung hält sich ebenfalls in Grenzen,
|
||||||
|
somit auch die Anfälligkeit für Fehler. Als
|
||||||
|
Nachteil ergibt sich, daß Metadaten zweimal auf die
|
||||||
|
Platte geschrieben werden müssen (einmal in die
|
||||||
|
<emphasis>logging area</emphasis>, einmal an die richtige
|
||||||
|
Stelle), so daß das im Falle regulärer
|
||||||
|
Arbeit (also keine gehäuften Metadatenoperationen) eine
|
||||||
|
<quote>Pessimisierung</quote> des Falls der synchronen
|
||||||
|
Updates eintritt, es wird alles langsamer. Dafür hat man
|
||||||
|
als Vorteil, daß im Falle eines Crashes der
|
||||||
|
konsistente Zustand dadurch erzielbar ist, daß die
|
||||||
|
angefangenen Operationen aus dem <emphasis>dirty region
|
||||||
|
log</emphasis> entweder zu Ende ausgeführt oder
|
||||||
|
komplett verworfen werden, wodurch das Dateisystem schnell
|
||||||
|
wieder zur Verfügung steht.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>Die Lösung von Kirk McKusick (dem Schöpfer von
|
||||||
|
Berkeley FFS) waren <emphasis>Soft Updates</emphasis>: die
|
||||||
|
notwendigen Updates der Metadaten werden im Speicher
|
||||||
|
gehalten und dann sortiert auf die Platte geschrieben
|
||||||
|
(<quote>ordered metadata updates</quote>). Dadurch hat man
|
||||||
|
den Effekt, daß im Falle massiver
|
||||||
|
Metadaten-Änderungen spätere Operationen die
|
||||||
|
vorhergehenden, noch nicht auf die Platte geschriebenen
|
||||||
|
Updates desselben Elements im Speicher
|
||||||
|
<quote>einholen</quote>. Alle Operationen, auf ein
|
||||||
|
Verzeichnis beispielsweise, werden also in der Regel noch im
|
||||||
|
Speicher abgewickelt, bevor der Update überhaupt auf
|
||||||
|
die Platte geschrieben wird (die dazugehörigen
|
||||||
|
Datenblöcke werden natürlich auch so sortiert,
|
||||||
|
daß sie nicht vor ihren Metadaten auf der Platte
|
||||||
|
sind). Im Crashfall hat man ein implizites <quote>log
|
||||||
|
rewind</quote>: alle Operationen, die noch nicht den Weg auf
|
||||||
|
die Platte gefunden haben, sehen danach so aus, als
|
||||||
|
hätten sie nie stattgefunden. Man hat so also den
|
||||||
|
konsistenten Zustand von ca. 30 -- 60 Sekunden früher
|
||||||
|
sichergestellt. Der verwendete Algorithmus garantiert
|
||||||
|
dabei, daß alle tatsächlich benutzten Ressourcen
|
||||||
|
auch in den entsprechenden Bitmaps (Block- und i-node
|
||||||
|
Tabellen) als belegt markiert sind. Der einzige Fehler, der
|
||||||
|
auftreten kann, ist, daß Ressourcen noch als
|
||||||
|
<quote>belegt</quote> markiert sind, die tatsächlich
|
||||||
|
<quote>frei</quote> sind. &man.fsck.8; erkennt dies und
|
||||||
|
korrigiert diese nicht mehr belegten Resourcen. Die
|
||||||
|
Notwendigkeit eines Dateisystem-Checks darf aus diesem
|
||||||
|
Grunde auch ignoriert und das Dateisystem mittels
|
||||||
|
<command>mount -f</command> zwangsweise eingebunden werden.
|
||||||
|
Um noch allozierte Ressourcen freizugeben muß
|
||||||
|
später ein &man.fsck.8; nachgeholt werden. Das ist
|
||||||
|
dann auch die Idee des <emphasis>background fsck</emphasis>:
|
||||||
|
beim Starten des Systems wird lediglich ein
|
||||||
|
<emphasis>Schnappschuß</emphasis> des Filesystems
|
||||||
|
gemacht, mit dem &man.fsck.8; dann später arbeiten
|
||||||
|
kann. Alle Dateisysteme dürfen <quote>unsauber</quote>
|
||||||
|
eingebunden werden und das System kann sofort in den
|
||||||
|
Multiuser-Modus gehen. Danach wird ein
|
||||||
|
Hintergrund-<command>fsck</command> für die
|
||||||
|
Dateisysteme gestartet, die dies benötigen, um
|
||||||
|
möglicherweise irrtümlich belegte Resourcen
|
||||||
|
freizugeben. (Dateisysteme ohne <emphasis>Soft
|
||||||
|
Updates</emphasis> benötigen natürlich immer noch
|
||||||
|
den üblichen (Vordergrund-)<command>fsck</command>,
|
||||||
|
bevor sie eingebunden werden können.)</para>
|
||||||
|
|
||||||
|
<para>Der Vorteil ist, daß die Metadaten-Operationen
|
||||||
|
beinahe so schnell ablaufen wie im asynchronen Fall (also
|
||||||
|
durchaus auch schneller als beim <quote>logging</quote>, das
|
||||||
|
ja die Metadaten immer zweimal schreiben muß). Als
|
||||||
|
Nachteil stehen dem die Komplexität des Codes (mit
|
||||||
|
einer erhöhten Fehlerwahrscheinlichkeit in einem
|
||||||
|
bezüglich Datenverlust hoch sensiblen Bereich) und ein
|
||||||
|
erhöhter Speicherverbrauch entgegen. Außerdem
|
||||||
|
muß man sich an einige <quote>Eigenheiten</quote>
|
||||||
|
gewöhnen: Nach einem Absturz ist ein etwas älterer
|
||||||
|
Stand auf der Platte - statt einer leeren, aber bereits
|
||||||
|
angelegten Datei (wie nach einem herkömmlichen
|
||||||
|
<command>fsck</command> Lauf) ist auf einem Dateisystem mit
|
||||||
|
<emphasis>Soft Updates</emphasis> keine Spur der
|
||||||
|
entsprechenden Datei mehr zu sehen, da weder die Metadaten
|
||||||
|
noch der Dateiinhalt je auf die Platte geschrieben wurden.
|
||||||
|
Weiterhin kann der Platz nach einem <command>rm -r</command>
|
||||||
|
nicht sofort wieder als verfügbar markiert werden,
|
||||||
|
sondern erst dann, wenn der Update auch auf die Platte
|
||||||
|
vermittelt worden ist. Dies kann besonders dann Probleme
|
||||||
|
bereiten, wenn große Datenmengen in einem Dateisystem
|
||||||
|
ersetzt werden, das nicht genügend Platz hat, um alle
|
||||||
|
Dateien zweimal unterzubringen.</para>
|
||||||
|
|
||||||
|
</sect3>
|
||||||
</sect2>
|
</sect2>
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue