Linux在运行时如何格式化自己?

Jon*_*Jon 5 rm

当你跑

sudo rm -rf --no-preserve-root /
Run Code Online (Sandbox Code Playgroud)

您的系统将一个一个地删除每个文件。但是,这也包括正在运行的进程和操作系统本身,最终删除rm.

如果程序文件被删除,操作系统缺少关键文件,Linux 如何继续运行?

另外,rm如果删除了如何继续运行?

mya*_*aut 6

尽管它的名字,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)

  • 如果您熟悉 Java、C#、JavaScript、PHP、Ruby、Python、Perl 等内存管理编程语言,请这样想:在 Unix 中,您不是删除文件,而是删除对它们的引用。当没有更多引用时,系统将垃圾收集它们。打开一个文件*是*一个引用,因此打开的文件不会被垃圾收集,即删除。 (2认同)