Parece que isso ocorre devido a uma incompatibilidade entre o qemu-img
e o Microsoft Azure (hesitei em chamá-lo de "bug" porque parece que há vários "padrões" cobrindo imagens no formato vpc).
O problema é que qemu-img
irá, por padrão, criar uma imagem alinhada à geometria CHS mais próxima, enquanto o Azure deseja imagens alinhadas com o MB inteiro mais próximo.
Já existe uma correção para isso no repositório do QEMU; o commit que corrige é fb9245c , a mensagem de commit é:
block/vpc: give option to force the current_size field in .bdrv_create
When QEMU creates a VHD image, it goes by the original spec, calculating the current_size based on the nearest CHS geometry (with an exception for disks > 127GB).
Apparently, Azure will only allow images that are sized to the nearest MB, and the current_size as calculated from CHS cannot guarantee that.
Allow QEMU to create images similar to how Hyper-V creates images, by setting current_size to the specified virtual disk size. This introduces an option, force_size, to be passed to the vpc format during image creation, e.g.:
qemu-img convert -f raw -o force_size -O vpc test.img test.vhd
When using the "force_size" option, the creator app field used by QEMU will be "qem2" instead of "qemu", to indicate the difference. In light of this, we also add parsing of the "qem2" field during vpc_open.
Posso confirmar que, com essa alteração aplicada localmente, posso executar ...
qemu-img convert -f raw -O vpc -o subformat=fixed,force_size myimage.raw myimage.vhd
... e gere uma imagem de disco que será carregada com êxito no Azure.