Sytuacja klasyczna: źle się sprawdziłem rm
i zaraz potem zorientowałem się, że usunąłem niewłaściwe pliki. (Nic krytycznego, a ostatnio miałem kopie zapasowe, ale wciąż denerwujące).
Wiedząc, że dalszą aktywnością dysku był mój wróg, gdybym chciał odzyskać pliki za pomocą extundelete
takich narzędzi, natychmiast natychmiast wyłączyłem maszynę fizycznie (tj. Za pomocą przycisku zasilania, a nie halt
żadnego polecenia). Był to laptop bez uruchomionych ważnych zadań lub otwartych, więc operacja była do przyjęcia. (Nawiasem mówiąc, od tamtej pory dowiedziałem się, że pierwszą rzeczą do zrobienia w takiej sytuacji byłoby oszacowanie, czy brakujące pliki mogą być nadal otwierane przez proces https://unix.stackexchange.com/a/101247 - jeśli są, powinieneś je odzyskać w ten sposób, zamiast wyłączać maszynę.)
Mimo to, kiedy maszyna została wyłączona, pomyślałem przez chwilę i zdecydowałem, że pliki nie są warte zainwestowania czasu w uruchomienie systemu na żywo w celu przeprowadzenia właściwej analizy sądowej. Więc ponownie uruchomiłem maszynę. A potem odkryłem, że moje pliki nadal znajdowały się na dysku: rm
nie zostały propagowane na dysk przed wyłączeniem. Zatańczyłem trochę i podziękowałem bogowi sysadminów za Jego nieoczekiwane przebaczenie.
Moje pytanie polega teraz na zrozumieniu, w jaki sposób było to możliwe i jakie jest typowe opóźnienie, zanim plik rm
zostanie faktycznie propagowany na dysk. Wiem, że IO dysku nie jest natychmiast opróżniane, ale przez pewien czas pozostaje w pamięci, ale pomyślałem, że dziennik dysku szybko upewni się, że oczekujące operacje nie zostaną całkowicie utracone. https://unix.stackexchange.com/a/78766 wydaje się wskazywać na osobny mechanizm opróżniania brudnych stron i opróżniania operacji dziennika, ale nie podaje wystarczających szczegółów na temat tego, w jaki sposób dziennik byłby zaangażowany w to rm
, oraz spodziewanego opóźnienia przed operacje są opróżniane.
Kilka dodatkowych szczegółów: dane znajdowały się na partycji ext4 w woluminie LUKS, a po ponownym uruchomieniu komputera zobaczyłem 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)
ale nie jestem pewien, czy jest to związane z rm
.
Innym pytaniem byłoby, czy istnieje sposób, aby powiedzieć jądrze, aby nie wykonywało żadnej z oczekujących operacji dyskowych (ale powiedzmy, że gdzieś je zrzuciło), zamiast wyłączać maszynę. (Oczywiście nie wydaje się niebezpieczne, aby nie wykonywać oczekujących operacji, ale tak by się stało po wyłączeniu urządzenia, a to może w niektórych przypadkach cię uratować.) To byłoby oczywiście „czystsze”, a także interesujące na przykład na zdalne serwery, na których fizyczne wyłączenie nie jest łatwą opcją.
rm
napisaniem? Innymi słowy, rzeczy są zapisywane w czasopiśmie tylko wtedy, gdy zapis ma się właśnie odbyć? A może obraz jest bardziej złożony? Jeśli chodzi o alt-sysrq-u, jest to całkiem fajny pomysł. Czy masz odniesienie do roszczenia „wydaje się”? (Wydaje się, że nie wynika to z podanych przez ciebie linków.) Dzięki! :)echo u > /proc/sysrq-trigger
(być może trzeba go najpierw aktywować).Od: https://www.kernel.org/doc/Documentation/filesystems/ext4.txt
Zobacz także, jak je opróżnić: Jak opróżnić bufory i pamięć podręczną w systemie Linux?
Cytat z powyższego linku:
źródło
commit=nrsec
jest to coś, co miałoby miejsce po tym, jak jądro zdecyduje się opróżnić zmiany z pamięci na dysk? Czy też ustawieniecommit=1
gwarantuje, że wszystkie zmiany zostaną usunięte po 1 sekundzie niezależnie od ustawieńdirty_expire_centisecs
idirty_writeback_centisecs
?commit=1
. O ile rozumiem,sync
zmusza wszystko do działania niezależnie od ustawień pamięci wirtualnej, chociaż może się to zdarzyć wcześniej.