Disk-Usage

如何檢查包含 XFS 上重新連結文件的文件夾的磁碟使用情況?

  • December 23, 2021

duXFS 支持寫時複製 (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 時可用磁碟空間減少了 500MB cp,但使用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。

引用自:https://unix.stackexchange.com/questions/627470