Problemas na preparação de uma imagem de disco para carregar no Azure

2

Estou tentando fazer upload de uma imagem de disco para uso na plataforma de nuvem do Azure. Tenho seguido as estas instruções , mas o redimensionamento de imagens está me atrapalhando.

Eu começo com uma imagem 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
}

Eu converto essa imagem em um disco bruto:

$ qemu-img convert -f qcow2 -O raw myimage.qcow2 myimage.img

Depois, seguindo as instruções, eu arredondo o tamanho de um número par de megabytes:

$ 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

E redimensione a imagem:

$ qemu-img resize -f raw myimage.img $rounded_size

O que me deixa:

$ qemu-img info -f raw --output=json myimage.img 
{
    "virtual-size": 8590983168,
    "filename": "myimage.img",
    "format": "raw",
    "actual-size": 1458573312,
    "dirty-flag": false
}

(exatamente 8193 MB).

Quando eu converto isso para o formato VHD:

$ qemu-img convert -f raw -o subformat=fixed -O vpc myimage.img myimage.vhd

Acabo com um arquivo que não tem mais o tamanho correto:

$ ls -l myimage.vhd 
-rw-r--r--. 1 lars lars 8591450624 Apr 14 12:04 myimage.vhd

E quando tento fazer o upload, o Azure grita comigo:

$ 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

Como faço para apaziguar o monstro do Azure e fazê-lo parar de gritar comigo?

(FYI: estou usando: qemu-img version 2.5.0 (qemu-2.5.0-10.fc23) )

    
por larsks 14.04.2016 / 18:25

1 resposta

5

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.

    
por 14.04.2016 / 22:29

Tags