Aumentando o tamanho do disco de uma VM no KVM (e possivelmente no VirtualBox)

É comum em nossos trabalhos com VMs (Virtal Machines) encararmos o problema de falta de espaço no disco. Isto já me ocorreu várias vezes, tanto na iniciação científica quanto no trabalho de conclusão de curso. Geralmente, este problema aparece com a máquina padrão do Mininet, que possui apenas 7 GB de espaço.

mininet-few-space

Este post vem para auxiliar a resolver esse problema. Aqui nós usaremos a biblioteca libvirt e um utilitário chamado libguestfs que estende comandos da libvirt com o intuito de manipular o sistema de arquivos da imagem de modo mais fácil. Todos os passos são executados em uma máquina com o sistema operacional Ubuntu 14.04 e com suporte à virtualização. A VM a ser aumentada é a própria Mininet.

No KVM

Libguestfs

Nós instalaremos o libguestfs na máquina host (a que hospeda as VMs e onde o KVM está instalado). Para instalar o libguestfs é simples. Basta atualizar o repositório e instalá-lo via apt-get:

sudo apt-get update
sudo apt-get install libguestfs-tools -y

Escolha a opcão Yes para criar uma supermin appliance, o que baixa arquivos necessários para o funcionamento do libguestfs, e seguimos em frente.

Após instalar o utilitário, percebemos que novos comandos apareceram ao passo que digitamos virt e damos dois tabs. O que vamos usar chama-se virt-resize, e o nome nos dá uma boa indicacão sobre a utilidade dele.

Aumentando a capacidade do disco

Para aumentar a capacidade de disco, precisamos criar uma nova imagem de nossa instância. Deste modo, vamos ao diretório onde a imagem está armazenada. Vale ressaltar que a imagem do KVM é um arquivo com extensão .qcow2, .raw ou .img. É recomendado desligar a VM nesse processo, através de um virsh destroy <nome_VM>.

Em nosso caso, iremos aumentar o tamanho de uma imagem com extensão .img, mas este processo pode ser realizado para as demais extensões. O motivo por usar o img é que o processo de resize, que será detalhado mais adiante, tem como retorno uma imagem “raw” com extensão img. Deste modo, nós iremos digitar o seguinte comando, trocando o nome mininet1 pelo de sua VM:


truncate -r mininet1.img mininet1-resized.img

Caso dê algum problema de permissão, ou ponha o sudo no início do comando, ou mude a permissão da imagem para o seu usuário através do chown. O truncate cria uma imagem nova e manipulável, com o mesmo tamanho da imagem base. A imagem nova terá o seu tamanho aumentado.

O próximo passo é aumentar o tamanho desejado. Aqui, nós iremos aumentar a capacidade em 10 GB, como inserido aqui:


truncate -s +10G mininet1-resized.img 

Aqui valem as mesmas recomendacões anteriores: troque o nome da imagem pela de sua e ponha o sudo se necessário. Após aumentar a capacidade da VM pelo tamanho desejado, é hora de fazer o sistema de arquivos desta imagem reconhecer o novo tamanho:

sudo virt-resize --expand /dev/sda1 mininet1.img mininet1-resized.img

Este comando faz a mágica. Ele copia o sistema de arquivos da imagem base para a imagem nova, só que a imagem nova tem 10GB de espaco a mais! O virt-resize faz com que o sistema de arquivos localizado em /dev/sda1 possua a mesma estrutura da imagem base, porém expandindo-o para que o sistema reconheça os 10 GB adicionais a serem utilizados. Alguns comandos até chegam a aumentar o tamanho da imagem ou criar uma nova partição, mas estes não são reconhecidos pelo sistema. O virt-resize resolve este problema para nós.Screenshot from 2017-07-28 13:13:01

Caso tenha recebido a mensagem “Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly“, ótimo! Podemos prosseguir sem problemas.

O próximo passo é redefinir a VM com a imagem aumentada. Neste caso, iremos digitar:

virsh undefine mininet1

Após indefinir o domínio, editamos o XML para inserirmos a imagem nova

vi mininet1.xml
...
source file='/path/to/source/mininet1-resized.img'
...

Apenas troque em source o arquivo para a imagem aumentada. Feito isso, basta redefinir o domínio:

virsh define mininet1.xml

Bingo! Agora, para testar, vamos iniciar o domínio e verificar se o sistema de arquivos foi aumentado:

virsh start mininet1

A verificação do aumento do sistema de arquivos pode ser feita de várias formas. Aqui acesso a máquina via virt-viewer:

virt-viewer mininet1

Como visto na imagem abaixo, o sistema de arquivos agora tem 10 GB a mais do que na imagem inicial deste post! Caso precise liberar espaço em disco, é recomendado deletar a imagem antiga.

mininet-greater-space

No… VirtualBox?

Você deve estar se perguntando como isso se relaciona ao fato de que podemos também aumentar uma VM do VirtualBox. Isso é realmente possível, porém precisa de uma sequência maior de passos:

  1. Converta a imagem do VirtualBox em uma imagem do KVM;
  2. Execute os passos apresentados para aumentar o tamanho da imagem do KVM;
  3. Converta a imagem aumentada do KVM em uma imagem do VirtualBox.

Aqui há um tutorial de como esse processo é realizado. Vale lembrar que estes passos são realizados em um sistema Linux com o QEMU instalado e testado no Ubuntu 14.04. Portanto, se o uso do VirtualBox é feito exclusivamente no Windows, deve-se procurar outra alternativa. Caso seja feito no Linux, deve ser instalado o QEMU. Além disso, o libguestfs também precisa estar instalado (veja no início do post a instalação dele caso tenha dúvidas).

Aqui há uma imagem do VirtualBox com os quase 7 GB padrões do mininet:

Screenshot from 2017-07-28 14:13:04

O primeiro passo é converter esta imagem em uma do KVM. Para isso, vamos ao diretório da imagem e executar o comando:

qemu-img convert -f vmdk -O raw mininet-vm-x86_64.vmdk mininet-vm-pre-resized.img

Este comando converte uma imagem com a extensão .vmdk em uma em img. Este comando permite diferentes configurações, como por exemplo converter uma imagem em .vdi para .qcow2, trocando a extensão de vmdk para vdi e a raw para qcow2, além de claro, do nome das imagens. A conversão pode demorar um pouco. Vale lembrar que estamos usando img pois o retorno do comando virt-resize nos dá uma imagem com este formato.

Após converter a imagem do VirtualBox em uma do KVM, vamos executar os mesmos passos apresentados anteriormente para aumentar o tamanho da imagem em 10GB (lembre que é necessário o pacote libguestfs-tools):

truncate -r mininet-vm-pre-resized.img mininet-vm-resized.img
truncate -s +10G mininet-vm-resized.img
sudo virt-resize --expand /dev/sda1 mininet-vm-pre-resized.img mininet-vm-resized.img

Após realizar estes passos (e ver aquela mensagem maravilhosa de “Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly“), é a hora de converter de volta a imagem do KVM para a do VirtualBox:

qemu-img convert -f raw -O vmdk mininet-vm-resized.img mininet-vm-resized.vmdk

Após a conversão, basta remover a imagem antiga e pôr a nova. No VirtualBox, clique na VM e vá em Settings. Em Storage, remova a imagem (clicando no disco correspondente à imagem e no ícone com um – vermelho) e insira a nova, clicando no segundo ícone à direita de Controller: SCSI. Escolha um disco existente, no caso, o que criamos.

Screenshot from 2017-07-28 15:33:32

Após esta sequência de passos, basta executar a VM e, quando acessarmos, veremos que o seu tamanho foi aumentado. Para diminuir o espaço ocupado em disco, é válido apagar as imagens do KVM geradas durante o processo.

Screenshot from 2017-07-28 15:41:24

Portanto, é possível mudar o tamanho de uma imagem de VirtualBox usando o libguestfs e o QEMU. É claro que esta abordagem não é das mais eficientes, mas pode ser usada caso seja necessário aumentar o tamanho da imagem sem comprometer os arquivos e continuar operando no VirtualBox.

Espero que este tutorial tenha lhe ajudado de alguma forma. Dúvidas ou erros nos passos aqui destacados são muito bem vindos!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s