df -h 給出假數據?

伯納納

當我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真的給假數據?

Amogh Saxena - REXTER

這個問題經常出現。文件系統在文件系統中分配磁盤塊來記錄其數據。此數據稱為元數據,對大多數用戶級程序(例如 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章