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

lar*_*sks 2 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
}
Run Code Online (Sandbox Code Playgroud)

我将此图像转换为原始磁盘:

$ qemu-img convert -f qcow2 -O raw myimage.qcow2 myimage.img
Run Code Online (Sandbox Code Playgroud)

然后,按照说明,我将 的大小四舍五入到偶数兆字节:

$ 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
Run Code Online (Sandbox Code Playgroud)

并调整图像大小:

$ qemu-img resize -f raw myimage.img $rounded_size
Run Code Online (Sandbox Code Playgroud)

这让我:

$ qemu-img info -f raw --output=json myimage.img 
{
    "virtual-size": 8590983168,
    "filename": "myimage.img",
    "format": "raw",
    "actual-size": 1458573312,
    "dirty-flag": false
}
Run Code Online (Sandbox Code Playgroud)

(正好是 8193 MB)。

当我将其转换为 VHD 格式时:

$ qemu-img convert -f raw -o subformat=fixed -O vpc myimage.img myimage.vhd
Run Code Online (Sandbox Code Playgroud)

我最终得到一个不再正确大小的文件:

$ ls -l myimage.vhd 
-rw-r--r--. 1 lars lars 8591450624 Apr 14 12:04 myimage.vhd
Run Code Online (Sandbox Code Playgroud)

当我尝试上传此内容时,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
Run Code Online (Sandbox Code Playgroud)

我如何安抚 Azure 怪物并让它停止对我大喊大叫?

(供参考:我使用的:qemu-img version 2.5.0 (qemu-2.5.0-10.fc23)

lar*_*sks 7

看起来这是由于qemu-img与 Microsoft Azure之间的不兼容(我犹豫将其称为“错误”,因为似乎有多个涵盖 vpc 格式图像的“标准”)。

问题是,qemu-img默认情况下,它会创建一个与最近的 CHS 几何对齐的图像,而 Azure 希望图像与最近的整个 MB 对齐。

QEMU 存储库中已经有一个修复程序;修复它的提交是fb9245c,其提交消息是:

块/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
Run Code Online (Sandbox Code Playgroud)

使用“force_size”选项时,QEMU 使用的创建者应用程序字段将是“qem2”而不是“qemu”,以表示差异。鉴于此,我们还在 vpc_open 期间添加了“qem2”字段的解析。

我可以确认通过本地应用此更改,我可以运行...

qemu-img convert -f raw -O vpc -o subformat=fixed,force_size myimage.raw myimage.vhd
Run Code Online (Sandbox Code Playgroud)

...并生成将成功上传到 Azure 的磁盘映像。