私が見る理由:
btrfs replace "ERROR: target device smaller than source device"
ソースデバイスファイルシステムを次の方法でターゲットデバイスより小さく縮小した場合:
btrfs filesystem resize <devid>:<small-size> /mountpoint
答え1
ディスクを交換しようとしたときにこの問題が発生しました。少し小さいです。ソースドライブのファイルシステムのサイズを変更した後も、このエラーが発生します。ディスク全体を使用しているため、パーティションのサイズを変更できません。デバイスパスの代わりにソースドライブのデバイスを渡すのがトリックです。これにより、btrfs filesystem replace
デバイス自体のサイズではなく、ソースデバイスの実際のファイルシステムサイズを確認できるようになります。
私の初期状態:
# btrfs fi show /mnt/storage
Label: 'Storage' uuid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Total devices 5 FS bytes used 15.25TiB
devid 1 size 7.28TiB used 3.84TiB path /dev/sdb
devid 2 size 7.28TiB used 3.84TiB path /dev/sdc
devid 3 size 7.28TiB used 3.84TiB path /dev/sdd
devid 4 size 7.28TiB used 3.84TiB path /dev/sde
devid 5 size 7.28TiB used 3.84TiB path /dev/sdf
/dev/sdfを/dev/sdgに置き換えたいです。
試み#1:
# btrfs replace start /dev/sdf /dev/sdg /mnt/storage
ERROR: target device smaller than source device (required 8001561124864 bytes)
/dev/sdf(devid 5) でファイルシステムのサイズを変更します。
# blockdev --getsize64 /dev/sdg
8001546444800
# btrfs fi res 5:8001546444800 /mnt/storage
Resize '/mnt/storage' of '5:8001546444800'
試み#2:
# btrfs replace start /dev/sdf /dev/sdg /mnt/storage
ERROR: target device smaller than source device (required 8001561124864 bytes)
お金を守ってください。ソースがブロックデバイスとして指定されており、ターゲットreplace
に十分なスペースがあることを確認したときにのみブロックデバイスのサイズを表示した場合に発生します。しかし、ソースコードを詳しく見てみると、replace
ソースデバイスが異なる方法で処理され、実際にファイルシステムから正しいサイズが取得されることがわかりました。
これは試み#3を引き起こします。
# btrfs replace start 5 /dev/sdg /mnt/storage
以前のサイジングと組み合わせたこの式を使用すると、交換操作を正常に開始できます。
答え2
エラーメッセージはファイルシステムサイズではなくLinuxブロックデバイスサイズを示すため、ソースファイルシステムを含むパーティションはターゲットファイルシステム以下である必要があります。
ターゲットデバイスが200Gであると仮定し、ソースデバイスのサイズを199Gに調整します。
btrfs filesystem resize <devid>:199g /mountpoint
その後、パーティションサイズも199GiBに調整します。gdisk
既存のソースパーティションを削除してから、同じ起動セクタで新しいパーティションを作成しましたが、入力終了セクタサイズは+199G
。
partprobe /dev/hdd-device
新しいパーティションを再ロードした後、正常に動作replace
します。
答え3
どちらの方法も機能しているように見えますが、@rkjnsnの解決策はアクティブディスクのパーティションテーブルを上書きする必要がないため、それほど危険ではありません。そこでは状況が非常に間違っている可能性があります。