ブロックデバイスのコンテンツをネットワーク経由で直接qcow2
イメージに転送したい。私は小さなシミュレーションから始めました:
[root@okvmh1 default]# dd if=/dev/zero bs=1M count=100 | qemu-img convert -p -f raw -O qcow2 /dev/stdin aaa.qcow2
qemu-img: Could not open '/dev/stdin': Could not refresh total sector count: Operation not permitted
qemu-img: Could not open '/dev/stdin'
qemu-img
が希望の画像サイズを知らないようです。 VirtualBox
で私はします:
<net-command> | VBoxManage convertfromraw stdin aaa.vdi $size --format VDI
ただし、qemu-img convert
はサイズパラメータを受け入れません。
標準入力はseekableではありません。これはqemu-imgconvertがここで実行しようとしていることです。
この問題を回避するには、ファイルシステム上のファイルまたはブロックデバイスである入力イメージを使用します。どちらもシーク可能です。
これは古い質問ですが、興味深い代替案を示す価値があると思います。私も同じ問題を抱えていましたが、 Michael Hampton から提供された回答は、転送する必要のあるデータの量が多すぎて、操作を行う必要がある時間が十分ではなかったため、私には合いませんでした。以下は私が作ったものです:
宛先で、空のQCOW2イメージを作成します。次に例を示します。
$ qemu-img create -f qcow2 myimage.qcow2 500g
QCOW2イメージの上にデバイスをエミュレートできるツールがあります。これは主にQCOW2コンテンツにアクセスするために使用されますが、デバイスは読み取り/書き込み可能であるため、標準のブロックデバイスとして扱うことができます。
$ modprobe nbd
$ qemu-nbd --connect /dev/nbd0 myimage.qcow2
これで、他のブロックデバイスと同じようにブロックデバイスである/dev/nbd0
デバイスができましたが、それに対して実行される操作はすべてQCOW2イメージで実行されます。
ssh
やdd
などの任意のネットワークコマンドを使用して、魔法を機能させることができます。
$ dd if=myoriginalimg bs=100M | pv -tebrap --size 500g | ssh myhost dd of=/dev/nbd0 bs=100M
進行状況を監視できるように、pv
を使用してプラスを追加しました。さらに、このコマンドをscreen
またはtmux
セッション内で実行することをお勧めします。時間がかかりすぎて、仕事を失うことがない場合です。
転送が完了すると、myimage.qcow2
に変換されたQCOW2イメージの準備が整いますが、カーネルが怒らないように、必ずエミュレータを切断してください。
$ qemu-nbd --disconnect /dev/nbd0
完了です!これで、生のフォーマットからネットワークOriginから中間体なしで直接QCOW2ファイルに送信された変換済み画像ができました。