当你跑步时
sudo rm -rf --no-preserve-root /
您的系统将逐个删除每个文件。但是,这还包括正在运行的进程和操作系统本身,最终删除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)
即使删除第二个硬链接,数据仍然保留(顺便说一句,如果你拔掉插头并且此时系统断电,你将得到 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.
这就是答案。如果程序具有被 ed 处理的文件的句柄rm
,则该文件仍将作为未命名的 blob 存在于文件系统中。它不再有路径,但它仍然存在并且仍然占据空间。程序可以继续读取和写入它。只有当该文件的所有句柄都消失时(因为程序关闭文件句柄或程序本身退出),文件才会真正从文件系统中删除。