Rm

Linux 在執行時如何自行格式化?

  • June 17, 2015

當你跑

sudo rm -rf --no-preserve-root /

您的系統將一個一個地刪除每個文件。但是,這也包括正在執行的程序和作業系統本身,最終會刪除rm.

如果程序文件被刪除,作業系統缺少關鍵文件,Linux 如何繼續執行?

另外,刪除後如何rm繼續執行?

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

引用自:https://unix.stackexchange.com/questions/210378