Klassische Situation: Ich lief schlecht rm
und 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 extundelete
oder ohne solche Tools wiederherstellen wollte, schaltete ich die Maschine sofort physisch aus (dh mit dem Ein- / Ausschalter, nicht mit halt
oder 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 rm
nicht 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 rm
Datei 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 rm
und 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.
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! :)echo u > /proc/sysrq-trigger
(Möglicherweise müssen Sie es zuerst aktivieren).Von: https://www.kernel.org/doc/Documentation/filesystems/ext4.txt
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:
quelle
commit=nrsec
, ist es etwas, das stattfinden würde, nachdem der Kernel beschlossen hat, Änderungen vom Speicher auf die Festplatte zu übertragen? Odercommit=1
garantiert die Einstellung , dass alle Änderungen unabhängig von den Einstellungendirty_expire_centisecs
und nach 1 Sekunde gelöschtdirty_writeback_centisecs
werden?commit=1
. Soweit ich weiß, wirdsync
erzwungen, dass alles passiert, unabhängig von den Einstellungen für den virtuellen Speicher, obwohl dies früher passieren kann.