走るとき
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