
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 ...
( -c
sinalizador 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-sparsity
com a --compress
bandeira 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).
- Faça login no convidado do Windows
- Abra o utilitário “Gerenciamento do Computador”, usando a função de pesquisa do menu Iniciar para localizá-lo.
- No lado esquerdo, clique em “Armazenamento->Gerenciamento de Disco”Captura de tela do gerenciamento de disco de armazenamento
- 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.
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.
Uma vez feito isso, desligue a VM abrindo um prompt de comando e digitando:
shutdown /s /t 0
- 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.
- Faça login no host Linux
- mude para superusuário:
sudo su
- vá para onde as imagens virtuais estão armazenadas:
cd /var/lib/libvirt/images
- liste os arquivos:
ls -l
- 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”
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)
instale os pacotes guestfs que você pode estar faltando:
apt-get install libguestfs-tools
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/sda1
qual é a nossa partição de boot do Windows de 350 MB,/dev/sda2
que é 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.
vamos criar o novo disco QCOW2 virtual que estamos chamando
newdisk.qcow2
com 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`
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
sda2
partição como é feito no PASSO 3.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.Troque as imagens de disco:
mv windows.qcow2 backup/ mv newdisk.qcow2 windows.qcow2
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.
Faça login no convidado do Windows
Abra o utilitário “Gerenciamento do Computador”, usando a função de pesquisa do menu Iniciar para localizá-lo.
No lado esquerdo, clique em “Armazenamento->Gerenciamento de Disco”
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
Exclua a partição Linux clicando com o botão direito->excluir volume. (clique em sim para qualquer solicitação)
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.
É 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:
- Limpe a unidade virtual (remova arquivos temporários, etc.)
- Desfragmente com o software UltraDefrag de código aberto com "otimização total"
- Correr
sdelete -c c:
- Correr
sdelete -z c:
- Correr
qemu-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-sparsify
do pacoteferramentas libguestfsDeveria trabalhar. Observe que:
- Você NÃO precisa executar uma ferramenta como
sdelete
dentro do convidado antes (mas não vai doer) - Você pode usar o
--in-place
sinalizador 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