XFSはCoW(記録中のコピー)をサポートしているため、一部のdu
バイトがファイル間で共有されている場合に何が起こるかは完全にはわかりません。共有バイトを何度も計算せずに、フォルダが使用するディスク容量、つまりディスクの実際の使用量を確認する方法を探したいと思います。
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
cp
plainを使用すると、ディスクの空き容量が500MB少なく表示されますが、cp --reflink=always
再接続すると機能しているように見えますが、df
ディスクがかなり大きく、やや小さいフォルダの実際のサイズを確認したかったので、実際には役に立ちません。
私はこれがBTRFSにも有効な質問だと思います。しかし、私の場合は、XFSと互換性のあるソリューションが必要です。
ベストアンサー1
基本的にこれを行うツールがあるはずですが、そのようなツールがあるかどうか覚えていません。
filefrag
(通常、FIEMAP ioctl)または(XFS固有)を使用してxfs_bmap
ファイル範囲を照会できます。これにより、コミュニティ(重複)を一度だけ計算するか、まったく計算しないかを選択できます。
# 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
各ブロックは、1024バイト(オプションを含む)またはファイルシステムのブロックサイズ(4096バイトなど)xfs_bmap
ではなく512バイトを使用します。filefrag
-k
以下を使用して繰り返し範囲を共有します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を減算する必要があります。