我正在尝试上传磁盘映像以在 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)
)
看起来这是由于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 格式,例如:
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
...并生成将成功上传到 Azure 的磁盘映像。
归档时间: |
|
查看次数: |
3033 次 |
最近记录: |