Disk-Usage
如何檢查包含 XFS 上重新連結文件的文件夾的磁碟使用情況?
du
XFS 支持寫時複製 (CoW),因此如果某些字節在文件之間共享,會說什麼並不完全清楚。我想找到一種方法來檢查文件夾使用了多少磁碟空間,而不是多次計算共享字節,即磁碟上的實際使用情況。既不
xfs_estimate
也不du
似乎做我需要的:$ mkdir testfolder $ cd testfolder $ dd if=/dev/zero of=testfile bs=1M count=500 status=progress 500+0 records in 500+0 records out 524288000 bytes (524 MB, 500 MiB) copied, 0,158889 s, 3,3 GB/s $ cp --reflink=always testfile testfile2 $ xfs_estimate . . will take about 1004,4 megabytes $ du -hs . 1000M .
我期望的是某個工具說這個文件夾只使用了 500MB。
df
顯示使用 plain 時可用磁碟空間減少了 500MBcp
,但使用cp --reflink=always
. 所以重新連結似乎有效,但df
在實踐中沒有幫助,因為磁碟很大,我想檢查一個非常小的文件夾的實際大小。我認為這對於 BTRFS 來說也可能是一個有效的問題。但就我而言,我需要一個適用於 XFS 的解決方案。
感覺應該有一個預設情況下執行此操作的工具,但我不記得是否有一個。
filefrag
您可以使用(通用、FIEMAP ioctl)或使用xfs_bmap
(XFS 特定)查詢文件範圍。這樣,您可以選擇只計算一次(或根本不計算)共享範圍(重複)。# filefrag -e -k testfile Filesystem type is: 58465342 File size of testfile is 5242880 (5120 blocks of 1024 bytes) ext: logical_offset: physical_offset: length: expected: flags: 0: 0.. 5119: 96.. 5215: 5120: last,shared,eof testfile: 1 extent found
在此範例中,
filefrag
知道並顯示範圍是共享的(文件系統中的任何位置,不一定在該目錄中),xfs_bmap
但不會:# xfs_bmap -l testfile testfile: 0: [0..10239]: 192..10431 10240 blocks
但基本上這是您可以自己編寫腳本的關鍵要素。
顯示所有可能的共享範圍:
# find . -xdev -type f -exec filefrag -e -k {} + | grep shared 0: 0.. 5119: 96.. 5215: 5120: last,shared,eof 0: 0.. 5119: 5216.. 10335: 5120: last,shared,eof 0: 0.. 5119: 96.. 5215: 5120: last,shared,eof
共享(在目錄中重複)範圍使用
xfs_bmap
:# find . -xdev -type f -exec xfs_bmap -l {} + | grep 'blocks$' | grep -v ': hole' | sort | uniq -d 0: [0..10239]: 192..10431 10240 blocks
請注意,
xfs_bmap
每個塊使用 512 字節,而filefrag
使用 1024 字節(帶-k
選項)或任何文件系統塊大小(如 4096 字節)。使用共享重複範圍
filefrag
:# find . -xdev -type f -exec filefrag -ek {} + | grep shared | sort | uniq -d 0: 0.. 5119: 96.. 5215: 5120: last,shared,eof
因此,在這種情況下,您必須從
du -cks .
結果中減去 5120。