10Gイメージファイルに約7Gのbtrfsファイルシステムがありますimg.btrfs
(minifyを使用しましたbtrfs fi resize -3G /mnt
)。画像サイズを縮小するために、ファイルシステムの全体サイズ(終了バイトオフセット)をどのように知ることができますか?$SIZE
つまり調べる
truncate -s $SIZE img.btrfs
イメージファイル内の他のファイルシステムに適用できるメカニズムは利点です。
ノート:一つするジョブは次のとおりです。
INITIAL=$(stat -c %s img.btrfs)
mount img.btrfs /mnt
btrfs fi resize -$NBYTES /mnt
umount /mnt
truncate -s $((INITIAL - NBYTES + 1024*1024)) img.btrfs
mount /img.btrfs /mnt
btrfs fi resize max /mnt
つまり、btrfsを縮小して画像を少し縮小してから(1Mオーバーヘッドを残して)、btrfsを縮小画像が提供できる最大値に増やします。
答え1
面倒なことにbtrfs filesystem show
、サイズが1MBの倍数でない場合、おおよその値が返されます。また、ループデバイスが必要ですがbtrfs filesystem show img.btrfs
動作しません(Debian jessieベース)。役に立つ他のサブコマンドが見つかりませんbtrfs
。
ただし、file img.btrfs
必要なサイズを返すのに役立ちます。
$トリミング -s16684k/tmp/img.btrfs $/sbin/mkfs.btrfs /tmp/img.btrfs SMALL VOLUME: 混合メタデータ/データグループ強制 BTRFS v3.17 詳しくはhttp://btrfs.wiki.kernel.orgをご覧ください。 互換性のない機能「mixed-bg」をオン:混合データとメタデータブロックグループ 互換性のない機能「extref」をオンにする:ファイルごとのハードリンク制限を65536に増やします。 1703936サイズのデータ/メタデータブロックが作成されました。 /dev/btrfs-control を開けません。デバイス登録をスキップ中:権限が拒否されました。 fsが/tmp/img.btrfsにタグ(空)を生成しました。 ノードサイズ 4096 リーフサイズ 4096 セクタサイズ 4096 サイズ16.29MiB $トリミング -s 32m /tmp/img.btrfs $ファイル/tmp/img.btrfs /tmp/img.btrfs: BTRFS ファイルシステム セクタサイズ 4096、ノードサイズ 4096、リーフサイズ 4096、UUID=61297945-d399-4fdc-ba9f-750ef9f9dfdb, 28672/17084416使用されるバイト数、1つのデバイス
オフセット0x10070から8バイトのリトルエンディアン値を直接読み込みます。解析された出力が望ましくない場合はfile
抽出できます。次のPOSIXコードスニペットがこれを行います。
size_hex=$(cat /tmp/img.btrfs | dd ibs=8 skip=8206 count=1 2>/dev/null | od -tx8 -An | tr abcdef ABCDEF | tr -dc 0-9ABCDEF)
[ ${#size_hex} -eq 16 ] &&
{ echo "ibase=16; $size_hex"; } | bc
またはPerlでは:
</tmp/btrfs.img perl -e 'seek(STDIN, 0x10070, 0) or sysread(STDIN, $_, 0x10070) == 0x10070 or die "seek"; sysread(STDIN, $_, 8) == 8 or die "read"; print unpack("Q<", $_), "\n"'
file
他の種類のファイルシステムでは動作しますが、出力は正規化されていないため、スクリプトはあまり役に立ちません。すべての共通ファイルシステムで動作する標準インターフェースを備えた汎用ユーティリティ(仮想化やフォレンジックツールなど)は考えられません。
1練習:これはなぜ役に立つのですかcat
?
答え2
両方ともデバイスのサイズを単位としてbtrfs filesystem show
提供します。btrfs filesystem usage
メガバイト、ギガバイト、または他の2の累乗です。サフィックス M や Gtruncate
なども 2 の累乗ですので、サフィックス M や G などに渡すことができます(サフィックス MB GB を使用しないでください!)。たとえば、10M縮小された1G画像の場合:
sudo btrfs fi show /mnt
devid 1 size 1014.00MiB used 12.00MiB path /dev/loop0
sudo btrfs fi usage /mnt
Device size: 1014.00MiB
SIZE=1014M # not MB!
truncate -s $SIZE img.btrfs
このサイズより大きいブロックは使用しないでください。