“du”和“df”之間的差異

“du”和“df”之間的差異

我有一個奇怪的差異。使用“df”我看到我的根磁碟使用了幾乎 229G。

# df -h
Filesystem                  Size  Used Avail Use% Mounted on
/dev/dm-2                   241G  229G   13G  96% /

但「du」告訴我,我只使用了大約 12GB(向上捨入)。

# du -sh /* | grep G
3.2G    /run
2.1G    /usr
6.0G    /var

這兩個指令均以 root 身分執行。我可以想像的是,現在掛載 NFS 共享的目錄中存在「隱藏」資料。如果是這樣的話。我怎麼能找出「隱藏」的文件。或者您對為什麼這些數字如此完全不同有其他想法嗎?

答案1

您可能有一個打開該文件的應用程式/進程。當您刪除由應用程式保持開啟的檔案時,作業系統仍會在 df 中看到檔案大小,因為該檔案仍在記憶體中開啟。

這是我為同事編寫的一些文檔,應該可以滿足您的需求。

截斷大的開啟文件

您已刪除檔案以釋放空間,但之後空間未釋放。現在 df -lah 和 du -lah 顯示不同的大小

使用 LSOF 取得已刪除但保留的文件

lsof |grep deleted

這將顯示所有已刪除但由應用程式保持開啟的檔案。

java       2943  gateway  410w      REG              253,3  50482102     139274 /opt/span/app/node/default/var/attachments/att180368_0.part (deleted)
java       2943  gateway  411w      REG              253,3  46217973     139284 /opt/span/app/node/default/var/attachments/att182230_0.part (deleted)
java       2943  gateway  412w      REG              253,3  50483894     139280 /opt/span/app/node/default/var/attachments/att181920_0.part (deleted)

您可以重新啟動應用程式以解鎖檔案或截斷檔案。

要截斷文件,您必須查看上面的輸出以取得 PID 和 fd(文件描述符編號)。

截斷文件

echo > /proc/PID/fd/fd_number

範例:要將上面列出的三個檔案大小歸零,您將發出以下命令

echo > /proc/2943/fd/410 
echo > /proc/2943/fd/411
echo > /proc/2943/fd/412

如果你有很多可以截斷 bash 來救援。

for n in {410..412}; do 'echo  > /proc/2943/fd/$n'; done;

df -lah 現在應該顯示可用空間,但檔案將在 lsof |grep 下顯示已刪除,但大小為 1

java       2943  gateway  410w      REG              253,3         1     139274 /opt/span/app/node/default/var/attachments/att180368_0.part (deleted)
java       2943  gateway  411w      REG              253,3         1     139284 /opt/span/app/node/default/var/attachments/att182230_0.part (deleted)
java       2943  gateway  412w      REG              253,3         1     139280 /opt/span/app/node/default/var/attachments/att181920_0.part (deleted)

檔案描述符將在下次重新啟動或重新啟動/重新載入開啟檔案的應用程式時釋放。

當然,您必須調整命令以匹配鎖定檔案的輸出。

答案2

就我而言(你在私訊中也告訴我同樣的事情幫助了我)這是一個過度安裝的問題。我在分區上的目錄中有一些數據,但du看不到,因為掛載隱藏了它們。

所以嘗試卸載所有掛載並在其餘目錄中尋找數據。

祝您玩得愉快,謝謝!

相關內容