Linux
df 命令顯示 100% 已滿,即使在刪除文件後也顯示相同的使用情況 (100%)
Nand Flash 儲存分區使用 df 命令顯示為 100% 已滿。當手動計算使用量時,它僅約為 7-80%(最大值)。刪除了幾個文件(大約 50~60MB),df 命令輸出仍然沒有改變。我無法創建新文件,錯誤:“儲存設備上沒有剩餘空間”。試過
sync
命令,沒有區別。Filesystem 1K-blocks Used Available Use% Mounted on tmpfs 262144 20780 241364 8% /tmp tmpfs 512 0 512 0% /dev /dev/ubi0_0 1275540 1275540 0 100% /storage
當實際儲存空間未滿時(根據手動計算),為什麼 df 命令顯示為 100% 滿?
重新啟動並重新安裝將解決我相信的問題。
**原因:**這背後的原因是
df
利用statfs(2)系統呼叫來獲取文件系統統計資訊。這意味著它檢查打開的核心文件描述符以計算其命名的可用空間(df = 可用磁碟)。如果你使用 . 你會得到不同的結果du
。df
顯示 100% 已使用,因為已刪除的文件尚未從核心文件描述符中釋放。可能下面的場景會幫助你理解:
- 一個名為的正在執行的程序
xyz.service
正在使用一個名為的文件,該文件something.dump
位於/storage
分區中。- 的
file discriptor
列something.dump
在 的process file descriptor table
中xyz.service
。- 然後你刪除了
something.dump
但xyz.service
仍在執行。xyz.service
不知道文件的更新狀態something.dump
。所以文件描述符something.dump
仍然存在。- 然後您執行
df
命令,核心檢查所有程序表以查看使用的文件描述符來計算可用空間。- 核心看到該
inodes
文件的something.dump
文件仍然列在xyz.service
程序的文件描述符表中。所以它something.dump
仍然在文件系統中,因此它不認為 something.dump 的 inode 是免費的。這就是您看到更多使用的原因。- 因此,當您
SIGKILL
xyz.service
釋放這些 inode 時,您可能會看到可用空間。- 重新啟動系統將執行與步驟 7 相同的操作。