当你跑
sudo rm -rf --no-preserve-root /
Run Code Online (Sandbox Code Playgroud)
您的系统将一个一个地删除每个文件。但是,这也包括正在运行的进程和操作系统本身,最终删除rm.
如果程序文件被删除,操作系统缺少关键文件,Linux 如何继续运行?
另外,rm如果删除了如何继续运行?
尽管它的名字,rm不删除文件。它实际上是取消链接——删除引用文件的目录条目。如果该文件仍然存在硬链接,则数据将保持完整。
当程序执行时,内核会在内部保留一种硬链接(它们都被视为同一个inode对象),因此数据将保留到最后一个进程关闭未链接的文件。
注意 unlink 系统调用是如何描述的:
如果该名称是指向文件的最后一个链接,并且没有进程打开该文件,则该文件将被删除,并且它所使用的空间可供重用。
如果名称是文件的最后一个链接,但任何进程仍然打开该文件,则该文件将一直存在,直到最后一个引用它的文件描述符关闭。
例如:
# cp /bin/sleep ./sleep
# ln ./sleep ./sleep2
# ./sleep 1000 &
[1] 24399
# rm ./sleep
Run Code Online (Sandbox Code Playgroud)
此时,数据仍然可以通过硬链接访问,并且 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)
Run Code Online (Sandbox Code Playgroud)
即使删除了第二个硬链接,数据仍然保留(顺便说一句,如果此时拔掉插头并且系统断电,则会导致FS空间泄漏):
# rm ./sleep2
# ls -l /proc/24399/exe
/proc/24399/exe -> /tmp/test/sleep (deleted)
Run Code Online (Sandbox Code Playgroud)
现在我终止进程,只有此时磁盘(或 tmpfs)空间才会被释放:
# kill 24399
Run Code Online (Sandbox Code Playgroud)