Como "realmente" reduzir o tamanho das imagens das VMs KVM?

Como "realmente" reduzir o tamanho das imagens das VMs KVM?

Passei muitas horas pesquisando na web sobre como reduzir imagens de disco virtual KVM, especialmente para convidados do Windows, sem sorte.

Tudo o que descobri foi zerar o espaço livre da VM, desfragmentar o disco virtual (do Windows) e executar qemu-img convert -c ...( -csinalizador para compactar).

Eu tenho uma VM do Windows 7, com tamanho de unidade virtual de 100 GB. Inicialmente, esse VDD gastou 40 GB no armazenamento do host. Depois de zerado, o VDD consome 100 GB reais no host. E qemu-img -c ...cria 91 GB, o que não é nada do que eu esperava.

No site da modernie, podemos baixar VMs W7 com menos de 10 GB, como isso é possível? Existe uma maneira de compactar "realmente" as imagens da VM?


Graças ao @dyasny, fiz um pequeno teste com virt-sparsity. Limpei o disco da VM W7, desativei a hibernação, então o VDD consome apenas 20 GB. Degradei o disco novamente e executei novamente sdelete -z. Executar virt-sparsitycom a --compressbandeira fornece um drive virtual de 80 GB. Longe do que eu esperava.


EDIT-2016-02-16: "Atualizando" esta questão porque o método para reduzir uma VM discutido aqui é muito eficiente, mas tem uma grande desvantagem: ele exclui todos os instantâneos da VM. Se alguém souber como reduzir uma VM enquanto preserva os instantâneos, sinta-se à vontade para compartilhar!

Responder1

Para reduzir um sistema operacional Windows Guest, você deve reduzir a partição dentro do convidado, desligar a VM, criar um novo disco menor do tamanho desejado, copiar os dados do disco antigo para o novo disco menor, trocar os nomes dos discos e reinicializar a VM.

É simples, mas se feito de maneira inadequada pode levar à perda de dados – e de cabelo.

Aqui estão as etapas para KVM com um convidado do Windows Server 2012 de 100 GB que queremos reduzir para 35 GB, usando o formato QCOW2.

IMPORTANTE: Este método envolvenenhuma modificação da máquina virtualdefinição. Em vez disso, requer apenasmanipulações de imagem de disco.

Suposições para o hóspede:

  • Convidado é um Windows Server 2012
  • Imagem de disco de 100 GB no formato QCOW2
  • Duas partições:
    • 350 MB de inicialização
    • 99,6 GB de C: unidade com 20 GB de espaço utilizado
  • Queremos reduzir C: de 99,6 GB para 34 GB

Suposições para o anfitrião:

  • Servidor Ubuntu 16 LTS
  • KVM (libvirt)
  • Unidade de 250 GB
  • Imagens virtuais localizadas em /var/lib/libvirt/images

PASSO 1: Preparação do Windows Guest, redução da partição C: principal

Nesta etapa, iremos apenas reduzir nossas partições do Windows diretamente do Windows. A imagem de disco resultante no final desta etapa será a soma da partição de inicialização, a unidade C: (reduzida) e um espaço não utilizado restante que iremos excluir (não copiando-o para um novo disco).

  1. Faça login no convidado do Windows
  2. Abra o utilitário “Gerenciamento do Computador”, usando a função de pesquisa do menu Iniciar para localizá-lo.
  3. No lado esquerdo, clique em “Armazenamento->Gerenciamento de Disco”Captura de tela do gerenciamento de disco de armazenamento
  4. Na nova tela, clique com o botão direito na partição C:, clique em “Diminuir volume…”, o que deve demorar um pouco antes que uma caixa de diálogo apareça. Ser paciente.
  5. Assim que a janela de diálogo “Reduzir C:” aparecer, insira a quantidade de espaço em “Quantidade de espaço para reduzir” que faz com que o valor “Tamanho total após redução em MB” se aproxime dos 35 GB desejados. Em seguida, clique em “Reduzir”.

    OBSERVAÇÃO: Você pode receber uma mensagem de erro se o novo espaço for muito pequeno; nesse caso, você deve reduzir a “Quantidade de espaço a reduzir” em 1 GB gradativamente até que o erro desapareça e a redução ocorra. Na prática, gostamos de manter 10 GB de espaço livre.

    Vamos supor que você conseguiu reduzir a partição C: para 34 GB.

  6. Uma vez feito isso, desligue a VM abrindo um prompt de comando e digitando:shutdown /s /t 0

  7. Seu convidado do Windows está pronto.

ETAPA 2: Redução do disco no host da VM

O procedimento não é realmente uma redução, mas em vez disso vamos criar um novo disco (do tamanho final) no qual copiaremos as duas partições do disco original e evitaremos o transporte do espaço não utilizado.

O objetivo é criar um disco cujo tamanho total = partição de inicialização + partição C:. Também acabaremos com um pequeno espaço restante (a menos que sua matemática seja perfeita) com o qual não nos preocupemos, porque trataremos disso na última etapa.

  1. Faça login no host Linux
  2. mude para superusuário:sudo su
  3. vá para onde as imagens virtuais estão armazenadas:cd /var/lib/libvirt/images
  4. liste os arquivos:ls -l
  5. Encontre a imagem do seu convidado (muitos tutoriais sobre isso em outros lugares). Vamos supor que nossa imagem de convidado do Windows seja chamada “windows.qcow2”
  6. fazemos um backup:

    mkdir backup
    cp windows.qcow2 backup/windows.qcow2.bak
    

    (vá tomar um café porque isso vai demorar um pouco para um disco grande)

  7. instale os pacotes guestfs que você pode estar faltando:

    apt-get install libguestfs-tools
    
  8. Tudo bem, vamos verificar nosso disco do Windows explorando a imagem do Windows com virt-filesystems:

    virt-filesystems --long --parts --blkdevs -h -a windows.qcow2
    

    que gera isso:

    Name       Type       MBR  Size  Parent 
    /dev/sda1  partition  07   350M  /dev/sda
    /dev/sda2  partition  07   34G   /dev/sda
    /dev/sda   device     -    100G  -
    

    Observe que temos /dev/sda1qual é a nossa partição de boot do Windows de 350 MB, /dev/sda2que é a nossa partição C: agora de 34 GB e que a imagem total do disco /dev/sda/é de 100 G nos deixando com muito espaço para cortar.

    Então aqui vai o passo importante: faça suas contas: 34 G + 350M cabe em 35 G, portanto vamos criar uma imagem de 35 GB. Inevitavelmente acabaremos com algum espaço sobrando – a menos que sua matemática seja perfeita – mas não se preocupe com isso, trataremos disso a seguir.

  9. vamos criar o novo disco QCOW2 virtual que estamos chamando newdisk.qcow2com tamanho total de 35 GB:

    qemu-img create -f qcow2 -o preallocation=metadata newdisk.qcow2 35G
    

    quais saídas:

    Formatting 'newdisk.qcow2', fmt=qcow2 size=37580963840 encryption=off cluster_size=65536 preallocation=metadata lazy_refcounts=off refcount_bits=16`
    
  10. Vamos redimensionar o disco copiando o disco antigo para o disco recém-alocado. Esta é a parte absolutamente incrível. A maioria dos outros guias mostra coisas terrivelmente complicadas. Isso é feito simplesmente por este comando, após o qual você deve ir buscar mais café - provavelmente vai demorar um pouco:

    virt-resize windows.qcow2 newdisk.qcow2`
    

    que gera isso:

    [   0.0] Examining windows.qcow2
    100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? --:--
    **********
    Summary of changes:
    /dev/sda1: This partition will be left alone.
    /dev/sda2: This partition will be left alone.
    There is a surplus of 439.8M.  An extra partition will be created for the surplus.
    **********
    [   8.8] Setting up initial partition table on newdisk.qcow2
    [   9.9] Copying /dev/sda1
    100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00
    [  15.1] Copying /dev/sda2
    100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00
    Resize operation completed with no errors.  Before deleting the old disk, carefully check that the resized disk boots and works correctly.
    

    Observe que a ferramenta encontrou espaço excedente... lembre-se dos comentários sobre matemática... Então você pode cancelar isso e recriar o disco ou simplesmente seguir em frente como fizemos aqui e expandir a sda2partição como é feito no PASSO 3.

  11. Uma vez feito. Inspecione a imagem resultante:

    virt-filesystems --long --parts --blkdevs -h -a newdisk.qcow2
    

    que gera isso:

    Name       Type       MBR  Size  Parent
    /dev/sda1  partition  07   350M  /dev/sda
    /dev/sda2  partition  07   34G   /dev/sda
    /dev/sda3  partition  83  439.8M   /dev/sda
    /dev/sda   device     -    35G  -
    

    Observe como o tipo do /dev/sda3é do tipo linux para o espaço restante. O espaço restante está OK, a menos que você tenha feito as contas corretamente. Lidaremos com essa partição extra do convidado do Windows mais abaixo. Neste momento, apenas ignore.

  12. Troque as imagens de disco:

    mv windows.qcow2 backup/
    mv newdisk.qcow2 windows.qcow2
    
  13. Inicie sua VM.

PASSO 3: Finalização da operação do disco no Window Guest

Nesta etapa, estamos confirmando a inicialização do Windows corretamente e vamos expandir nossa partição C para um espaço extra.

  1. Faça login no convidado do Windows

  2. Abra o utilitário “Gerenciamento do Computador”, usando a função de pesquisa do menu Iniciar para localizá-lo.

  3. No lado esquerdo, clique em “Armazenamento->Gerenciamento de Disco”

  4. Você deverá ver 3 partições: boot, C: e uma pequena partição de 439 MB (na extrema direita).Captura de tela do Gerenciamento do Computador mostrando as 3 partições

  5. Exclua a partição Linux clicando com o botão direito->excluir volume. (clique em sim para qualquer solicitação)

  6. Clique com o botão direito na partição C: e clique em “Estender”, depois em Avançar e OK nas caixas de diálogo. Deve oferecer apenas a extensão pelo valor da última partição. Uma vez feito isso, você redimensionou C: e ficou com apenas duas partições.

  7. É isso. Seu convidado do Windows agora está usando apenas 35 GB ou mais. Lembre-se de que a imagem real do disco pode ser maior (pode estar mais próxima de 38 GB) devido a toda a sobrecarga, etc.

Verifique se tudo funciona bem e exclua seus backups de imagens ou mova-os offline para armazenamento.

Responder2

Finalmente consegui reduzir realmente o espaço da VM. No início, a VM W7 consumia 107 GB no armazenamento do host. O tamanho do HDD virtual é de 100 GB e atualmente a VM consome apenas 18 GB de seu armazenamento virtual.

Aqui está o que eu fiz:

  1. Limpe a unidade virtual (remova arquivos temporários, etc.)
  2. Desfragmente com o software UltraDefrag de código aberto com "otimização total"
  3. Corrersdelete -c c:
  4. Corrersdelete -z c:
  5. Correrqemu-img convert -c -f qcow2 w7-64.qcow2 -O qcow2 w7-64-compressed.qcow2

Dessa forma, o arquivo qcow2 foi reduzido de 107 GB para...7 GB!

Responder3

Ao executar o qemu-img -c, você compacta a imagem, o que, embora possa reduzir algum espaço, pode prejudicar muito o desempenho. Se você deseja desduplicar os zeros no disco, você precisa executar qemu-img convert, basicamente como se estivesse tentando converter a imagem de um formato para outro (mesmo que os formatos src e dst sejam iguais).

Este processo gravará uma nova imagem convertida, sem os zeros, desduplicando efetivamente o espaço zerado na unidade.

Outra opção seria simplesmente usar, virt-sparsifyé claro.

Responder4

No Xenial e Bionic, o utilitário virt-sparsifydo pacoteferramentas libguestfsDeveria trabalhar. Observe que:

  • Você NÃO precisa executar uma ferramenta como sdeletedentro do convidado antes (mas não vai doer)
  • Você pode usar o --in-placesinalizador para liberar espaço sem copiar o arquivo (útil se a imagem do disco já for maior que o espaço livre restante na unidade!)
  • A ferramenta suporta imagens em formato qcow2 e raw

informação relacionada