我正在尝试上传磁盘映像以在 Azure 云平台上使用。我一直在关注这些说明,但调整图像大小却让我很为难。
我从一个 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
我该如何安抚这只蔚蓝的怪物并让它停止对我大喊大叫?
(仅供参考:我正在使用qemu-img version 2.5.0 (qemu-2.5.0-10.fc23)
:)
答案1
这似乎是由于qemu-img
与 Microsoft Azure 之间不兼容造成的(我犹豫是否称之为“错误”,因为似乎有多个涵盖 vpc 格式图像的“标准”)。
问题是qemu-img
,默认情况下,将创建与最近的 CHS 几何对齐的图像,而 Azure 希望将图像与最近的整个 MB 对齐。
QEMU 存储库中已经有一个针对此问题的修复程序;修复该问题的提交是fb9245c,其提交信息为:
block/vpc:提供选项以强制 .bdrv_create 中的 current_size 字段
当 QEMU 创建 VHD 映像时,它会遵循原始规范,根据最近的 CHS 几何形状计算 current_size(磁盘 > 127GB 除外)。
显然,Azure 只允许大小精确到 MB 的图像,而从 CHS 计算出的 current_size 无法保证这一点。
通过将 current_size 设置为指定的虚拟磁盘大小,允许 QEMU 以与 Hyper-V 创建映像类似的方式创建映像。这引入了一个选项 force_size,可在映像创建期间传递给 vpc 格式,例如:
qemu-img convert -f raw -o force_size -O vpc test.img test.vhd
使用“force_size”选项时,QEMU 使用的创建者应用程序字段将为“qem2”而不是“qemu”,以表明差异。鉴于此,我们还在 vpc_open 期间添加了对“qem2”字段的解析。
我可以确认,在本地应用此更改后,我可以运行......
qemu-img convert -f raw -O vpc -o subformat=fixed,force_size myimage.raw myimage.vhd
...并生成可成功上传到 Azure 的磁盘映像。