Qemu

qemu-img:無法打開“/dev/stdin”:無法刷新總扇區數:不允許操作

  • July 24, 2020

我想通過網路將塊設備內容直接傳輸到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不接受size參數。

Standard input is not seekable,這是 qemu-img convert 在這裡嘗試做的。

要解決此問題,請使用輸入圖像,它是文件系統或塊設備上的文件,兩者都是可查找的。

通過 QCOW2 圖像模擬設備

雖然這是一個老問題,但我認為值得展示一個有趣的替代方案。我遇到了同樣的問題,但Michael Hampton提供的答案不適合我,因為我必須傳輸的數據量太大,而且我必須進行操作的時間不夠。所以下面是我做的:

創建一個空的 QCOW2 圖像

在destination中,創建一個空的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 映像上執行

通過仿真設備執行傳輸

ssh例如,您可以使用任何網路命令dd來使魔術發揮作用:

$ dd if=myoriginalimg bs=100M | pv -tebrap --size 500g | ssh myhost dd of=/dev/nbd0 bs=100M

我添加了一個加號 usingpv以便您可以監控進度。我進一步建議你在一個screentmux會話中執行這個命令,如果它可能需要很長時間,這樣你就不會失去你的工作!

關閉模擬器

傳輸完成後,您就有了一個準備好並已轉換的 QCOW2 映像myimage.qcow2,但請確保斷開仿真器,以免核心對您生氣!

$ qemu-nbd --disconnect /dev/nbd0

你完成了!現在你有一個準備好的轉換圖像,從原始格式從網路源直接傳輸到 QCOW2 文件,沒有中間體

引用自:https://serverfault.com/questions/765603