走るとき
sudo rm -rf --no-preserve-root /
システムは各ファイルを1つずつ削除します。ただし、これには実行中のプロセスとオペレーティングシステム自体も含まれ、最終的には削除されますrm
。
プログラムファイルが削除され、オペレーティングシステムで重要なファイルが失われた場合、Linuxはどのように実行されますか?
rm
そして、削除して実行し続けるにはどうすればよいですか?
答え1
名前にもかかわらず、rm
ファイルは削除されません。実際には解く- ファイルを参照するディレクトリエントリを削除します。ファイルにまだハードリンクがある場合、データはそのまま残ります。
プログラムが実行されると、カーネルはハードリンク内部的に(両方とも同じオブジェクトとして扱われますinode
)、最後のプロセスがリンクされていないファイルを閉じるまでデータは保持されます。
unlink システムコールがどのように説明されるかをご覧ください。
その名前がファイルへの最後のリンクであり、そのファイルが開いているプロセスがない場合、ファイルは削除され、そのファイルが使用するスペースを再利用できるようになります。
その名前がファイルへの最後のリンクであるがプロセスでまだファイルが開いている場合、そのファイルを参照する最後のファイル記述子が閉じられるまでファイルはそのまま残ります。
たとえば、
# cp /bin/sleep ./sleep
# ln ./sleep ./sleep2
# ./sleep 1000 &
[1] 24399
# rm ./sleep
この時点で、データはまだハードリンクを介してアクセスでき、カーネルはまだinodeが次のようになることを知っています(task_struct)->mm->exe_file
。
# ls -lh ./sleep2
-rwxr-xr-x 1 myaut users 31K Jun 17 23:10 ./sleep2
# > ls -l /proc/24399/exe
lrwxrwxrwx 1 myaut users 0 Jun 17 23:11 /proc/24399/exe -> /tmp/test/sleep (deleted)
2番目のハードリンクが削除されても、データはそのまま残ります(ただし、プラグを抜いてこの時点でシステムの電源が切れるとFSスペースリークが発生します)。
# rm ./sleep2
# ls -l /proc/24399/exe
/proc/24399/exe -> /tmp/test/sleep (deleted)
これでプロセスを終了すると、ディスク(またはtmpfs)スペースが解放されます。
# kill 24399
答え2
今日、ほとんどすべてのプログラムはメモリ(RAM)で実行されているため、ロード後にディスクにアクセスする必要はありません。これにより、ディスク上のイメージを問題なく削除できます。
答え3
ファイルを削除しても、rm
ファイルはすぐには削除されません。 rm
内部的には、unlink()
ファイル削除操作を実行し、マニュアルページを引用するためにシステムコールが呼び出されますunlink()
(man 2 unlink
完全な内容を参照)。
unlink() deletes a name from the filesystem. If that name was the
last link to a file and no processes have the file open the file is
deleted and the space it was using is made available for reuse.
If the name was the last link to a file but any processes still have
the file open the file will remain in existence until the last file
descriptor referring to it is closed.
これが答えです。プログラムに処理中のファイルへのハンドルがある場合、rm
そのファイルは名前のないブロブとしてファイルシステムに存在し続けます。もはやパスはありませんが、まだ存在し、まだスペースを占めています。プログラムは引き続き読み書きできます。ファイルは、ファイルへのすべてのハンドルが消えた場合にのみファイルシステムから実際に削除されます(プログラムがファイルハンドルを閉じるか、プログラム自体が終了するため)。