准备磁盘映像以上传到 Azure 时出现问题

准备磁盘映像以上传到 Azure 时出现问题

我正在尝试上传磁盘映像以在 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 的磁盘映像。

相关内容