115GB
我的硬碟上有一個分區(輸出cgdisk /dev/sda
如下):
Part. # Size Partition Type Partition Name
----------------------------------------------------------------
1007.0 KiB free space
1 499.0 MiB Windows RE Basi
2 100.0 MiB EFI System EFI
3 16.0 MiB Microsoft reserved Micr
5 43.9 GiB Linux filesystem ubuntu-root
6 43.9 GiB Linux filesystem ubuntu-home
4 114.9 GiB Linux filesystem data <--- this partition
7 29.5 GiB Linux filesystem
我已將該分割區安裝在/data
我的/etc/fstab
:
UUID=<drive-uuid> /data ext4 defaults 0 0
當我這樣做時df -h /data
,我有以下輸出:
Filesystem Size Used Avail Use% Mounted on
/dev/sda4 113G 96G 11G 90% /data
當我du
這樣使用時:du /data -h --max-depth=1 | sort -hr
,我看到這個:
51G /data
40G /data/virtual-box
4.4G /data/temp
4.1G /data/manjaro-minikube
1.9G /data/.nuget
764M /data/OneDrive
62M /data/manjaro-lxd
40K /data/.minikube
16K /data/lost+found
如果我沒記錯的話,它顯示正在/data
佔用51G
,然後我有virtual-box
、temp
、manjaro-minikube
和.nuget
目錄佔用空間(其他目錄不佔用大量空間)
如果我列出我的目錄的長列表 ( ls -alh /data
):
total 68K
drwxr-xr-x 10 farzad farzad 4.0K Aug 13 21:47 .
drwxr-xr-x 19 root root 4.0K Jul 13 10:32 ..
drwx------ 2 farzad farzad 16K Mar 22 18:22 lost+found
drwx--x--x 15 root root 4.0K Aug 20 17:47 manjaro-lxd
drwxr-xr-x 3 farzad farzad 4.0K Jul 3 18:16 manjaro-minikube
drwxrwxr-x 9 farzad farzad 4.0K Jul 30 17:38 .minikube
drwxr-xr-x 202 farzad farzad 16K Aug 17 10:00 .nuget
drwxr-xr-x 3 farzad farzad 4.0K Aug 13 21:47 OneDrive
drwxrwxr-x 16 farzad farzad 4.0K Jun 3 21:45 temp
drwxr-xr-x 6 farzad farzad 4.0K Aug 20 20:21 virtual-box
我沒有看到任何文件或對51G
報告有貢獻的東西/data
,所以我希望我的驅動器幾乎65G
有空空間,但由於某種原因,/data
父目錄正在51G
自行佔用!
我嘗試在互聯網上進行研究,但我找不到任何東西。有人可以讓我知道發生了什麼事嗎?
更新
正如答案中所建議的,我lsof /data | grep deleted
(以 root 身份)運行,但沒有任何結果,儘管我看到一條警告,但我不確定該警告是否相關:
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
答案1
你/data
正在服用51G
。這包括其中的所有子目錄和檔案。如果您新增du
子目錄報告的大小(並考慮舍入問題),您將獲得大約51G
.如果 中直接存在常規文件/data
,它們也會對報告的值有所貢獻/data
。
因此du
不會報告高使用率。這是df
報告高使用率的內容:96G
正在檔案系統中使用。
由於/data
是一個安裝點,您可能期望這兩個值相同。但這兩個工具的工作方式不同:du
遍歷目錄並添加遇到的物件的大小,df
查詢檔案系統有關其自身狀態的知識。
如此大的差異可能是因為:
du
無法存取(或取得有關)所有物件的資訊。有什麼permission denied
錯誤嗎?- 文件系統存在不一致;
fsck.ext4
又名e2fsck
可能有幫助。 (最有可能的)至少有一個檔案被刪除(指向相應索引節點的所有目錄條目都被刪除,該檔案沒有出現在任何目錄列表中,因此
du
無法知道它),但它仍然被某個進程使用(因此檔案系統保留數據並在向報告時將其考慮在內df
)。看這個答案,這個問題。以下命令應該找到此類文件和使用它們的進程:
lsof /data | grep deleted
輸出範例:
some_daemon … … … … … … … /data/temp/huge_file (deleted)
這意味著檔案系統只有在停止使用
huge_file
後才會真正刪除它。some_daemon
請注意,通常該進程仍然可以追加到文件或截斷文件,因此文件可能會增大或縮小。這會影響所說df
的內容,但不會du
。
答案2
所以,事實證明這裡存在一些問題(感謝@Kamil 幫助找到它們):
du
儘管這是我最初的直覺,即for報告的數量/data
是其所有子目錄的總和(進行了一些四捨五入),但我想我是在試圖證明 和 之間的差異df
,du
並認為我應該總結和 所有的du
輸出/data
它的子目錄以獲得與相同的結果df
。
另一個問題是導致差異的主要原因,是因為我如何配置我的/etc/fstab
:
UUID=<uuid> /data ext4 defaults 0 0
^
ISSUE
當我創建我的 時/etc/fstab
,我認為我不需要通過fsck
在掛載上啟用文件系統檢查()來延長啟動時間,因此0
對於第六個字段,但事實證明,這導致索引節點不被清理,因此造成df
和之間的巨大差異du
。
因此,查看man 5 fstab
,我們可以看到,為了啟用檢查,根檔案系統應該具有 value 1
,其他檔案系統應該具有 value 2
,所以我將該行更改為:
UUID=<uuid> /data ext4 defaults 0 2
重啟後,報告了很多問題fsck
,我選擇修復它們,現在輸出du /data -h --max-depth=1 | sort -hr
:
28G /data
16G /data/virtual-box
4.5G /data/temp
4.1G /data/manjaro-minikube
1.9G /data/.nuget
824M /data/OneDrive
64M /data/manjaro-lxd
40K /data/.minikube
16K /data/lost+found
和輸出df /data -h
:
Filesystem Size Used Avail Use% Mounted on
/dev/sda4 113G 28G 80G 26% /data
值得注意的是,與我原來的問題相比,我刪除了一些文件(因此28G
使用而不是51G
),但好處是du
和df
報告相同的值:)
答案3
您的命令正在將結果從最高到最低排序。最高值為全部的所使用的空間/data
,而不是它自己使用的空間。