我正在尝试上传磁盘映像以在Azure云平台上使用。 我一直在通过这些指示 ,但图像resize给了我一个难的时间。
我从一张qcow2图片开始:
$ qemu-img info --output=json myimage.qcow2 { "virtual-size": 8589934592, "filename": "myimage.qcow2", "cluster-size": 65536, "format": "qcow2", "actual-size": 1468272640, "format-specific": { "type": "qcow2", "data": { "compat": "0.10", "refcount-bits": 16 } }, "dirty-flag": false }
我把这个图像转换成一个原始的磁盘:
$ qemu-img convert -f qcow2 -O raw myimage.qcow2 myimage.img
然后,按照指示,我将其大小修改为偶数个兆字节:
$ MB=$((1024 * 1024)) $ size=$(qemu-img info -f raw --output json "$1" | gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}') $ rounded_size=$((($size/$MB + 1) * $MB)) $ echo $rounded_size 8590983168
并调整图像大小:
$ qemu-img resize -f raw myimage.img $rounded_size
哪个让我:
$ qemu-img info -f raw --output=json myimage.img { "virtual-size": 8590983168, "filename": "myimage.img", "format": "raw", "actual-size": 1458573312, "dirty-flag": false }
(这正是8193 MB)。
当我将其转换为VHD格式时:
$ qemu-img convert -f raw -o subformat=fixed -O vpc myimage.img myimage.vhd
我结束了一个不再是正确大小的文件:
$ ls -l myimage.vhd -rw-r--r--. 1 lars lars 8591450624 Apr 14 12:04 myimage.vhd
当我尝试上传时,Azure对我说:
$ azure vm image create myimage myimage.vhd --os Linux --location 'East US' info: Executing command vm image create + Retrieving storage accounts info: VHD size : 8193 MB info: Uploading 8390088.5 KB ... info: https://....blob.core.windows.net/vm-images/myimage.vhd was uploaded successfully error: The VHD https://....blob.core.windows.net/vm-images/myimage.vhd has an unsupported virtual size of 8591450112 bytes. The size must be a whole number (in MBs). info: Error information has been recorded to /home/lars/.azure/azure.err error: vm image create command failed
我该如何安抚Azure怪物,让它停止向我大喊大叫?
(仅供参考:我正在使用: qemu-img version 2.5.0 (qemu-2.5.0-10.fc23) )
看起来这是由于qemu-img和Microsoft Azure之间的不兼容(我毫不犹豫地称之为“bug”,因为看起来有多个涵盖vpc格式图像的“标准”)。
问题是,默认情况下, qemu-img将创build一个图像alignment到最近的CHS几何,而Azure想要图像alignment到最近的整个MB。
在QEMU仓库中已经有了一个解决scheme。 修复它的提交是fb9245c ,提交消息是:
block / vpc:给选项强制.bdrv_create中的current_size字段
当QEMU创build一个VHD图像时,它将按照原始规格进行计算,根据最近的CHS几何计算current_size(对于大于127GB的磁盘除外)。
显然,Azure只允许大小最接近MB的图像,并且从CHS计算的current_size不能保证。
通过将current_size设置为指定的虚拟磁盘大小,允许QEMU创build类似于Hyper-V创build映像的映像。 这引入了一个选项force_size,在图像创build过程中传递给vpc格式,例如:
qemu-img convert -f raw -o force_size -O vpc test.img test.vhd当使用“force_size”选项时,QEMU使用的创build者应用程序字段将是“qem2”而不是“qemu”,以表示不同之处。 鉴于此,我们还在vpc_open期间添加了对“qem2”字段的parsing。
我可以证实,这个变化适用于本地,我可以运行…
qemu-img convert -f raw -O vpc -o subformat=fixed,force_size myimage.raw myimage.vhd
…并生成成功上传到Azure的磁盘映像。