Warum hat das Ausschalten meines Rechners nach einem schlechten Start meine Dateien gespeichert?

31

Klassische Situation: Ich lief schlecht rmund merkte sofort danach, dass ich die falschen Dateien entfernt hatte. (Nichts kritisches und ich hatte erträglich neue Backups, aber immer noch ärgerlich.)

Da ich wusste, dass weitere Festplattenaktivität mein Feind war, wenn ich die Dateien mit extundeleteoder ohne solche Tools wiederherstellen wollte, schaltete ich die Maschine sofort physisch aus (dh mit dem Ein- / Ausschalter, nicht mit haltoder ohne einen solchen Befehl). Dies war ein Laptop, auf dem keine wichtigen Aufgaben ausgeführt wurden oder etwas offen war. Es war also eine akzeptable Operation. (Übrigens habe ich seitdem erfahren, dass das erste, was in einer solchen Situation zu tun ist, zu schätzen ist, ob die fehlenden Dateien noch von einem Prozess geöffnet werden können. Https://unix.stackexchange.com/a/101247 - Wenn dies der Fall ist, sollten Sie sie auf diese Weise wiederherstellen, anstatt die Maschine auszuschalten.)

Nachdem die Maschine heruntergefahren war, dachte ich eine Weile nach und entschied, dass sich die Zeit für das Booten eines Live-Systems für eine ordnungsgemäße Forensik nicht lohnt. Also habe ich die Maschine wieder hochgefahren. Und dann stellte ich fest, dass sich meine Dateien noch auf der Festplatte befanden: Die wurden rmnicht auf die Festplatte übertragen, bevor ich sie heruntergefahren hatte. Ich machte einen kleinen Tanz und dankte dem Gott der Sysadmins für seine unerwartete Vergebung.

Meine Frage ist nun zu verstehen, wie dies möglich war und wie lange es normalerweise dauert, bis eine rmDatei tatsächlich auf die Festplatte übertragen wird. Ich weiß, dass Festplatten-E / A nicht sofort gelöscht wird, sondern einige Zeit im Speicher verbleibt, aber ich dachte, dass das Festplattenjournal schnell sicherstellen würde, dass ausstehende Vorgänge nicht vollständig verloren gehen. https://unix.stackexchange.com/a/78766 deutet anscheinend auf einen separaten Mechanismus zum Leeren verschmutzter Seiten und zum Leeren von Journalvorgängen hin, gibt jedoch keine ausreichenden Informationen darüber, wie das Journal für eine rmund die erwartete Verzögerung davor beteiligt sein würde Operationen werden gespült.

Einige weitere Details: Die Daten befanden sich in einer ext4-Partition innerhalb eines LUKS-Volumes, und beim Booten des Computers sah ich Folgendes in syslog:

Sep 24 10:24:58 gamma kernel: [   11.457007] EXT4-fs (dm-0): 1 orphan inode deleted
Sep 24 10:24:58 gamma kernel: [   11.458393] EXT4-fs (dm-0): recovery complete
Sep 24 10:24:58 gamma kernel: [   11.482475] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)

aber ich bin nicht sicher, ob es mit dem verwandt ist rm.

Eine andere Frage wäre, ob es eine Möglichkeit gibt, den Kernel anzuweisen, keine der ausstehenden Festplattenoperationen auszuführen (sondern sie beispielsweise irgendwo abzulegen), anstatt die Maschine auszuschalten. (Natürlich klingt es gefährlich, die ausstehenden Vorgänge nicht auszuführen, aber dies würde passieren, wenn die Maschine ohnehin heruntergefahren wird, und in einigen Fällen könnte es Ihnen helfen.) Dies wäre natürlich "sauberer" und auch interessant Zum Beispiel für Remote-Server, bei denen ein physisches Herunterfahren nicht einfach ist.

a3nm
quelle

Antworten:

22

Es hört sich so an, als hättest du einen guten Überblick darüber, was passiert ist.

Ja, da Sie das System vor dem Festschreiben der Änderungen auf der Festplatte ausgeschaltet haben, waren diese beim Hochfahren vorhanden.

Das System speichert alle Schreibvorgänge zwischen, bevor sie auf die Festplatte geschrieben werden. Es gibt verschiedene Optionen, die dieses Verhalten steuern. Alle befinden sich unter /proc/sys/vm/dirty_* [ kernel doc ] . Sofern von einer Anwendung nicht explizit eine Leerung über fsync() [ man 2 fsync ] durchgeführt wird , werden die Daten festgeschrieben, wenn sie entweder alt genug sind oder der Schreibcache voll ist.
Die oben verwendete Definition von "Daten" umfasst die Änderung des Verzeichniseintrags zum Löschen der Datei.

Nun, was das Tagebuch betrifft, so ist dies eines der häufigsten Missverständnisse darüber, wofür das Tagebuch gedacht ist. Mit einem Journal soll nicht sichergestellt werden, dass Änderungen wiedergegeben werden oder dass keine Daten verloren gehen. Der Zweck eines Journals besteht darin, eine Beschädigung des Dateisystems selbst und nicht der darin enthaltenen Dateien zu verhindern. Das Journal enthält lediglich Informationen zu den vorgenommenen Änderungen und nicht (normalerweise) die vollständigen Daten der Änderung. Die genauen Details hängen vom Dateisystem und vom Journalmodus ab. Für ext3 / 4 siehe die datamount Option in man 8 mount.


So beantworten Sie Ihre Zusatzfrage, ob es eine Möglichkeit gibt, ausstehende Schreibvorgänge ohne Neustart zu verhindern:

Wenn Sie den Kernel-Quellcode schnell durchlesen, können Sie anscheinend mit dem uBefehl magic sysrq ([ wikipedia ], [ kernel doc ]) einen Notfall-Remount-Schreibschutz ausführen. Es sieht so aus, als würden alle Volumes ohne Synchronisierungsvorgang sofort wieder bereitgestellt, wenn sie schreibgeschützt sind .

Drücken Sie dazu einfach Alt+ SysRq+ u.

Patrick
quelle
1
Danke für diese Antwort! Ich bin immer noch ein wenig verwirrt über das Tagebuch: Sollte ich es als etwas betrachten, das nur dann involviert wird, wenn die Änderungen auf die Festplatte geschrieben werden, so dass der Schreibcache der einzige relevante Mechanismus ist, um die Wartezeit vor dem Schreiben zu schätzen rm? Mit anderen Worten, Dinge werden nur dann in das Tagebuch geschrieben, wenn gerade ein Schreibvorgang ausgeführt wird. Oder ist das Bild komplexer? Was alt-sysrq-u betrifft, ist dies eine ziemlich nette Idee. Haben Sie eine Referenz für die Behauptung "Es scheint"? (Es scheint nicht aus den von Ihnen angegebenen Links zu folgen.) Danke! :)
a3nm
Außerdem hat magic sysrq die Einschränkung, dass Sie dies auf einem Remotecomputer immer noch nicht tun können.
a3nm
3
@ a3nm Sie können sysrq auf einem Remotecomputer verwenden. echo u > /proc/sysrq-trigger(Möglicherweise müssen Sie es zuerst aktivieren).
Paulo Almeida
Das Journal behandelt nicht den Dateiinhalt (standardmäßig kann es vollständig aufgezeichnet werden), sondern nur die Metadaten des Dateisystems. In diesem Fall hätte es die Datei möglicherweise löschen können , da es sich um das Entfernen des Verzeichniseintrags handelt. Daher muss das Journal sicherstellen, dass die Datei entweder vorhanden ist (mit dem vorherigen Inhalt, sofern keine anderen Änderungen vorgenommen wurden) oder nicht.
Ángel
@ a3nm Bezüglich deines Tagebuchkommentars. Der Schreibcache befindet sich zwischen dem Journal und der Festplatte. Wenn Sie in das Dateisystem schreiben, wird zuerst das Journal und dann das Dateisystem aktualisiert, jedoch noch keines auf die Festplatte geschrieben.
Patrick
2

Von: https://www.kernel.org/doc/Documentation/filesystems/ext4.txt

commit = nrsec (*) Ext4 kann angewiesen werden, alle 'nrsec' Sekunden alle seine Daten und Metadaten zu synchronisieren. Der Standardwert ist 5 Sekunden. Dies bedeutet, dass Sie, wenn Sie Ihre Energie verlieren, so viel verlieren wie die letzten 5 Sekunden der Arbeit (Ihr Dateisystem wird jedoch dank der Aufzeichnung nicht beschädigt). Dieser Standardwert (oder ein niedriger Wert) beeinträchtigt die Leistung, ist jedoch gut für die Datensicherheit. Das Setzen auf 0 hat den gleichen Effekt wie das Belassen der Standardeinstellung (5 Sekunden). Wenn Sie einen sehr großen Wert festlegen, wird die Leistung verbessert.

Lesen Sie auch hier, wie Sie sie leeren : Wie leeren Sie die Puffer und den Cache auf einem Linux-System?

Zitiert aus dem obigen Link:

HINWEIS: Bereinigen Sie den Speicher von unnötigen Dingen (Kernerl 2.6.16 oder neuer). Stellen Sie immer sicher, dass Sie zuerst die Synchronisierung ausführen, um nützliche Dinge auf die Festplatte zu übertragen !!!

To free pagecache:

$ echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:

$ echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:

$ echo 3 > /proc/sys/vm/drop_caches
David
quelle
Danke für diese Antwort! Ich verstehe das jedoch nicht: Wie bei dieser "Synchronisierung", die in erwähnt wird commit=nrsec, ist es etwas, das stattfinden würde, nachdem der Kernel beschlossen hat, Änderungen vom Speicher auf die Festplatte zu übertragen? Oder commit=1garantiert die Einstellung , dass alle Änderungen unabhängig von den Einstellungen dirty_expire_centisecsund nach 1 Sekunde gelöscht dirty_writeback_centisecswerden?
a3nm
Der Kernel wird alle 1 Sekunde alle Cache / Puffer auf die Disc leeren (synchronisieren) commit=1. Soweit ich weiß, wird syncerzwungen, dass alles passiert, unabhängig von den Einstellungen für den virtuellen Speicher, obwohl dies früher passieren kann.
David
Auch aus Gründen der Leistung (und der Speicherlebensdauer) wird eine Festlegung auf einen niedrigeren Wert als den Standardwert nicht empfohlen.
David