btrfsファイルシステムエンドオフセット(イメージサイズ)

btrfsファイルシステムエンドオフセット(イメージサイズ)

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

このサイズより大きいブロックは使用しないでください。

関連情報