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を減算する必要があります。
答え2
私のファイルが実際にどのくらいのスペースを使用しているのか、他のファイルとどのくらいのスペースを共有しているのかを調べたいと思います。以下と比較して、一部のバイトで「合計」が異なる理由が何なのかよくわかりませんdu
。
file="/mnt/cache/domains/Windows 10/vdisk1-backup.img"
du -h "$file"
mapfile -t fragments < <( filefrag -ek "$file" | tail -n +4 | cut -d ":" -f 4 | grep -oP "[0-9]+" )
sum=$(IFS=+; echo "$((${fragments[*]}))")
sum=$((sum * 1024))
sum=$(echo "$sum" | numfmt --to=iec)
echo "$sum total"
mapfile -t fragments < <( filefrag -ek "$file" | tail -n +4 | grep "shared" | cut -d ":" -f 4 | grep -oP "[0-9]+" )
sum=$(IFS=+; echo "$((${fragments[*]}))")
sum=$((sum * 1024))
sum=$(echo "$sum" | numfmt --to=iec)
echo "$sum shared"
mapfile -t fragments < <( filefrag -ek "$file" | tail -n +4 | grep -v "shared" | cut -d ":" -f 4 | grep -oP "[0-9]+" )
sum=$(IFS=+; echo "$((${fragments[*]}))")
sum=$((sum * 1024))
sum=$(echo "$sum" | numfmt --to=iec)
echo "$sum unique"
出力:
15G /mnt/cache/domains/Windows 10/vdisk1-backup.img
15G total
8.3G shared
6.8G unique
答え3
私はVeeamコミュニティページでこれに対する解決策を提案しました。
ユニークな:
(Veeam)CloudConnectを使用している顧客の実際のディスク使用量に基づいて課金するため、既存のレポートは報告および請求に使用できません(事前重複排除/再接続データの報告)。それを見つけるのに少し時間がかかりましたが、不変ストレージの各ディレクトリが使用する物理ディスク領域を計算する方法があります。
解決策:
不変リポジトリから各フォルダ(IE:クライアント)のディスク使用量を提供するスクリプトを推論しました。これは「使用済みデータ」ではなく、Veeamの報告です。これは「使用済みディスク」です。参照接続後のディスクの実際のサイズ(冗長データは一度だけ計算されます)
このスクリプトに関する注意事項は、元のブログエントリのチャンクサイズが間違っているようです。彼らはこれを4096と見なします...これはディスクでは正しいですが...使用されているユーティリティは明示的にブロックサイズを512として提供します。 https://linux.die.net/man/8/xfs_bmap 「512バイトブロック単位」
このスクリプトを使用するには、cronジョブを使用し、出力をリポジトリ自体のメールクライアントにパイプします(例:script.bash 2>&1 | mail -s "$ HOSTNAMEのImmutable Storage Report"[Eメール保護])
#!/bin/bash
for clientDir in `find /backups/disk-01/backups/ -mindepth 1 -maxdepth 1 -type d`
do
echo $clientDir
clientSpaceUsed=$(find $clientDir/*/* -xdev -type f -exec xfs_bmap -l {} + | awk '{ print $3 " " $4 }' | sort -k 1 | uniq | awk '{ print $2 }' | grep -Eo '[0-9]{1,7}' | paste -sd+ | bc | awk '{print $1*512/1024/1024/1024}')
#block sizes of 512 bytes. Divided by 1024 for KB. Divided by 1024 for MB. Divided by 1024 for GB.
echo "$clientSpaceUsed GB"
done
動作方法を分析すると、次のようになります。
「/backups/disk-01/backups/」の各クライアントディレクトリについて
報告されるディレクトリを出力します。
xfs_bmap -l実行(問題のブロックに関するすべてを通知します)列3と4のインポート(現在列1と2になり、残りは削除されます)列1でソートデータの重複行を削除する(高速複製のための参照リンク。維持計算の目的でデータの単一コピー)列2のみを選択(現在列1)
数字を除くすべてを削除
これらの数字を一緒に足してください
ブロックサイズを掛けます(512)。
1024で割ります(現在のKB)。
1024で割ります(現在のMB単位)。
1024で割ります(現在のGB単位)。
出力テキスト
答え4
に似た実際の空き容量を知りたい場合は、をdf
使用してくださいxfs_spaceman
。
たとえば、
xfs_spaceman -c 'freesp -s -m4096' /path/to/xfs/mount
計算は遅いかもしれませんが、報告された「合計空きブロック数」は参照リンク/重複排除データに対して正確であり、ブロックサイズを掛けて実際の空きスペース(バイト数)を得ることができます。