間違った「rm」を入力してコンピュータをシャットダウンすると、ファイルが保存されるのはなぜですか?

間違った「rm」を入力してコンピュータをシャットダウンすると、ファイルが保存されるのはなぜですか?

典型的なシナリオ:実行が間違っていてrm間違ったファイルを削除したことがすぐにわかります。 (重要なことはなく、最近のバックアップがありますが、まだ迷惑です。)

そのようなツールを使用してファイルを回復したい場合は、追加のディスクアクティビティが私の敵であることを知り、すぐに物理的にシステムの電源を切った(つまり、そのようなコマンドを使用extundeleteする代わりに電源ボタンを使用する)。halt重要なタスクを実行しない、または何も開かないノートブックなので、許可されるタスクです。 (ところで、私はこの状況で最初にすべきことは、まずプロセスで欠落しているファイルを開くことができるかどうかを推定することです)。https://unix.stackexchange.com/a/101247- その場合は、マシンをシャットダウンするのではなく、この方法で復元する必要があります。 )

それでも、マシンの電源が切れたら、しばらく考えてみると、適切な法医学のためにライブシステムを起動するのに時間を費やす価値がないと判断しました。だからマシンを再起動しました。それから私のファイルがまだディスクにあることがわかりました。rm電源を切る前に、ファイルはディスクに伝播されませんでした。私は少し踊り、予期せぬ許しについてシステム管理者の神々に感謝しました。

今私の質問は、これがどのように達成され、rm実際にディスクに伝播される前に一般的な遅延が何であるかを理解することです。私はすぐにディスクIOがフラッシュされず、しばらくの間メモリに保持されることを知っていますが、保留中のタスクが完全に失われないようにディスクログをすばやく確認できると思いました。https://unix.stackexchange.com/a/78766ダーティページのフラッシュとログ操作のフラッシュのための別々のメカニズムを示唆しているように見えますが、ログがフラッシュ操作に参加する方法やフラッシュ操作の前に予想される遅延rmに関する詳細を十分に提供していません。

詳細:データはLUKSボリューム内のext4パーティションにあり、マシンのバックアップを開始すると次の項目が表示されます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)

しかし、これがrm

もう1つの質問は、マシンの電源を切らずに保留中のディスク操作を実行せずに、代わりにどこかにダンプするようにカーネルに指示する方法があるかどうかです。 (もちろん、静止した作業を行わないことは危険ですが、これは機械をシャットダウンしたときに発生するものであり、場合によっては節約できます。)もちろん「よりきれい」であり、多くの喜びを与えます。たとえば、リモートサーバーの電源を物理的にオフにするのは簡単なオプションではありません。

答え1

何が起こっているのか、かなりよく知っているようです。

はい、変更をディスクにコミットする前にシステムを強制終了するため、再起動してもその内容はそのまま残ります。

システムは、すべての書き込みをディスクにフラッシュする前にキャッシュします。この動作を制御するためのいくつかのオプションがあり、すべて/proc/sys/vm/dirty_* [カーネル文書]。アプリケーションが[を介して明示的に更新を行わない限りfsync() 人2 fsync]、データが十分に古いか、書き込みキャッシュがいっぱいになると、データはコミットされます。
上記で使用した「データ」の定義には、ファイルを削除するためのディレクトリエントリの変更が含まれます。

ジャーナルに関する限り、これはジャーナルの目的に関する一般的な誤解の1つです。ログの目的は、変更が再生されたりデータが失われないようにすることではありません。ジャーナルの目的は、ファイルシステム内のファイルではなく、ファイルシステム自体の破損を防ぐことです。ログには変更に関する情報のみが含まれ、通常は変更自体に関する完全なデータは含まれません。正確な詳細は、ファイルシステムとジャーナリングモードによって異なります。 ext3/4の場合は、dataマウントオプションを参照してくださいman 8 mount


追加の質問に答えるには、再起動せずに保留中の書き込みを防ぐ方法はありますか?

カーネルのソースコードを素早く読むと、魔法のsysrquコマンド([ウィキペディア]、[カーネル文書])緊急再インストール読み取り専用操作を実行します。すべてのボリュームを読み取り専用ですぐに再マウントするようです。いいえ同期作業。

使用するにはAlt++SysRqを押しますu

答え2

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

commit = nrsec(*)Ext4は、「nrsec」秒ごとにすべてのデータとメタデータを同期させるように指示できます。デフォルトは5秒です。つまり、電源が切れると、最後の5秒間の操作が失われます(ただし、ジャーナリング機能によってファイルシステムが破損することはありません)。このデフォルト値(または低い値)はパフォーマンスを低下させますが、データセキュリティには優れています。 0に設定すると、デフォルト値(5秒)をそのままにするのと同じ効果があります。この値を非常に大きな値に設定すると、パフォーマンスが向上します。

フラッシュ方法の詳細については、こちらをご覧ください。Linuxシステムでバッファとキャッシュを消去する方法は?

上記のリンクから引用しました。

注:メモリから不要な項目をクリーンアップします(Kernerl 2.6.16以降)。便利なコンテンツをディスクにフラッシュするには、常に同期を最初に実行してください。

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

関連情報