web-dev-qa-db-ja.com

qemu-img: '/ dev / stdin'を開くことができませんでした:合計セクター数を更新できませんでした:操作は許可されていません

ブロックデバイスのコンテンツをネットワーク経由で直接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はサイズパラメータを受け入れません。

1
basin

標準入力はseekableではありません。これはqemu-imgconvertがここで実行しようとしていることです。

この問題を回避するには、ファイルシステム上のファイルまたはブロックデバイスである入力イメージを使用します。どちらもシーク可能です。

1
Michael Hampton

QCOW2イメージ上でデバイスをエミュレートする

これは古い質問ですが、興味深い代替案を示す価値があると思います。私も同じ問題を抱えていましたが、 Michael Hampton から提供された回答は、転送する必要のあるデータの量が多すぎて、操作を行う必要がある時間が十分ではなかったため、私には合いませんでした。以下は私が作ったものです:

空のQCOW2イメージを作成します

宛先で、空のQCOW2イメージを作成します。次に例を示します。

$ qemu-img create -f qcow2 myimage.qcow2 500g

NBDを使用してQCOW2イメージをデバイスに接続します

QCOW2イメージの上にデバイスをエミュレートできるツールがあります。これは主にQCOW2コンテンツにアクセスするために使用されますが、デバイスは読み取り/書き込み可能であるため、標準のブロックデバイスとして扱うことができます。

$ modprobe nbd
$ qemu-nbd --connect /dev/nbd0 myimage.qcow2

これで、他のブロックデバイスと同じようにブロックデバイスである/dev/nbd0デバイスができましたが、それに対して実行される操作はすべてQCOW2イメージで実行されます。

エミュレートされたデバイスを介して転送を実行します

sshddなどの任意のネットワークコマンドを使用して、魔法を機能させることができます。

$ 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ファイルに送信された変換済み画像ができました。

0
RDP