當我df -h
在我的實例中寫作時,我得到了這些數據:
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.7G 0 7.7G 0% /dev
tmpfs 7.7G 0 7.7G 0% /dev/shm
tmpfs 7.7G 408K 7.7G 1% /run
tmpfs 7.7G 0 7.7G 0% /sys/fs/cgroup
/dev/nvme0n1p1 32G 24G 8.5G 74% /
tmpfs 1.6G 0 1.6G 0% /run/user/1000
但是當我點擊sudo du -sh /
我得到:
11G /
所以在 中df -h
,/
大小是 24G,但在du -sh
同一目錄中,大小是 11G。我試圖在我的實例上獲得一些可用空間,但找不到導致該空間的文件。我缺少什麼?也df -h
真的給假數據?
這個問題經常出現。文件系統在文件系統中分配磁盤塊來記錄其數據。此數據稱為元數據,對大多數用戶級程序(例如 du)不可見。元數據的示例包括 inode、磁盤映射、間接塊和超級塊。
du 命令是一個不知道文件系統元數據的用戶級程序,而 df 查看文件系統磁盤分配映射並知道文件系統元數據。df 獲取真實的文件系統統計信息,而 du 只看到部分圖片。
運行 du 或 df 命令時使用或可用的磁盤空間不同的原因有很多。
也許最常見的是刪除文件。已被刪除的文件可能仍被至少一個進程打開。此類文件的條目將從關聯目錄中刪除,從而使文件無法訪問。因此,僅對文件進行計數的命令 du 不會考慮這些文件並得出較小的值。然而,只要進程仍然有被刪除的文件在使用,相關的塊還沒有在文件系統中釋放,因此在內核級別工作的 df 正確地將這些顯示為已佔用。您可以通過運行以下命令來確定是否是這種情況:
lsof | grep '(deleted)'
此問題的解決方法是重新啟動仍然打開這些已刪除文件的服務。
第二個最常見的原因是,如果您有一個分區或驅動器安裝在同名目錄的頂部。例如,如果您在 / 下有一個名為 backup 的目錄,其中包含數據,然後您在該目錄頂部安裝一個新驅動器並將其標記為 /backup 但它不包含任何數據,則使用的空間將顯示為 df 命令,即使du 命令不顯示任何文件。
要確定活動掛載點下是否隱藏了任何文件或目錄,您可以嘗試使用綁定掛載來掛載您的 / 文件系統,這將使我能夠在其他掛載點下進行檢查。請注意,這僅建議有經驗的系統管理員使用。
mkdir /tmp/tmpmnt
mount -o bind //tmp/tmpmnt
du /tmp/tmpmnt
確認這是問題後,可以通過運行以下命令刪除綁定安裝:
umount /tmp/tmpmnt/
rmdir /tmp/tmpmnt
另一個可能的原因可能是文件系統損壞。如果懷疑,請確保您有良好的備份,並在您方便時卸載文件系統並運行 fsck。
同樣,這應該由有經驗的系統管理員來完成。
您還可以通過運行來檢查計算:
strace -e statfs df /
這將為您提供類似於以下內容的輸出:
statfs("/", {f_type=XFS_SB_MAGIC, f_bsize=4096, f_blocks=20968699, f_bfree=17420469,
f_bavail=17420469, f_files=41942464, f_ffree=41509188, f_fsid={val=[64769, 0]},
f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_RELATIME}) = 0
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda1 83874796 14192920 69681876 17% /
+++ exited with 0 +++
注意到 f_bfree 和 f_bavail 之間的區別了嗎?這些是文件系統中的空閒塊與非特權用戶可用的空閒塊。使用的列只是兩者之間的計算。
希望這會讓你的想法清晰。如果您還有任何疑問,請告訴我。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句