Brian Wardが書いた「How Linux Works」という本を見てください。私は一般的にこれについて疑いの余地はありません。しかし、これは。 「6.7.0 シャットダウン」には、順序付けられたタスクのリストがあります。
読み取り専用モード(6)でルートファイルシステムを再マウントした後、バッファリングされたデータは同期プログラム(7)を介して書き込まれます。
読み取り専用モードでマウントした後にファイルシステムにデータを書き込む方法は?バグかもしれません。正しい順序は、まずバッファに書き込んでから(7)アンマウントして(5)再マウントすることです(6)。
1. init asks every process to shut down cleanly.
2. If a process doesn’t respond after a while, init kills it, first
trying a TERM signal.
3. If the TERM signal doesn’t work, init uses the KILL signal on any
stragglers.
4. The system locks system files into place and makes other preparations
for shutdown.
5. The system unmounts all filesystems other than the root.
6. The system remounts the root filesystem read-only.
7. The system writes all buffered data out to the filesystem with the
sync program.
8. The final step is to tell the kernel to reboot or stop with the
reboot(2) system call. This can be done by init or an auxiliary program
such as reboot, halt, or poweroff.
PS:この本は素晴らしいです。これが複数の章で扱う唯一の問題です。
答え1
ファイルシステムドライバ(一部のブロックストレージメディアのブロックをディレクトリとファイルに変換)があり、その下にはキャッシュ階層があります(カーネルが実際に必要な間はストレージメディアにすばやくデータを書き込んで他の操作を続行できます)。通常、比較的遅いため、バックグラウンドでストレージデバイスにデータを書き込むことに気を付ける必要があります。
sync
そのキャッシュ階層のすべてのエントリがストレージに書き込まれていることを確認してください。
したがって、これはファイルシステム「下」のデータに関するものです。
答え2
読み取り専用モードでマウントした後にファイルシステムにデータを書き込む方法は?
読み取り専用はマウントポイントの属性です。つまり、ファイルシステムをマウント(ドット)して変更することはできません。これは、下位層(ブロック層やキャッシュ層など)がファイルシステムを変更できないという意味ではありません。 (実際にはキャッシュレイヤーということはないかもしれません。ブロックレイヤーがキャッシュを担当するのに近いです。私の考えでは.)
ファイルシステムの潜在的な変更を防ぐために、パーティションまたはドライブ自体を何らかの方法で読み取り専用に設定する必要があります。 (デバイスにフラッシュされるバッファリングされたデータを「ブロック」する効果がない可能性があります。blockdev --setro
デバイス自体が論理ブロックへの書き込みアクセスを無効にする必要があるかもしれません。)
ファイルとディレクトリの観点からは、変更は実際のリポジトリに書き込まれたかどうかに依存しません。つまり、ファイルシステムドライバが一部の「同期モード」(存在する場合)で実行されていない限り、ファイルから読み取られた内容は、ファイルシステムドライバの更新から読み込まれるまで書き込みバッファ/キャッシュに残ることができます。以下に。sync -f path/to/mountpoint
ファイルシステムドライバを要求します(例:)。 (ただし、他の理由により、リフレッシュがバックグラウンドで発生する可能性があります。)
Linuxで読み取り専用モードでマウントを再マウントした後、明示的な同期/フラッシュが本当に必要かどうか疑問に思います。除去のような隠された問題を引き起こさないという事実に少し驚きました。