Backup de VMs ligadas do XEN Server

Este documento descreve a criação de Snapshots das máquinas virtuais ligadas do Xen Server e como exportar para um arquivo .xva, que é a extensão "padrão" que o virtualizador Xen usa.

[ Hits: 28.797 ]

Por: Túlio Ramos Barbosa em 24/10/2016


Importação via linha de comando



Nesta seção, vou mostrar como importar uma máquina virtual já importada pela linha de comando do XEN. O processo é bem simpes e usa-se apenas uma linha de comando. No prompt de comando do XEN, digite o comando com a sintaxe a seguir:

# xe -s <IP_do_XEN_que_vai_receber_a_VM> -u <root> -pw "<senha>" vm-import vm="<Nome_para_a_VM>" filename="<Caminho_onde_está_o_arquivo_.xva>"

Vamos entender cada parâmetro desse comando:
  • xe: comando "padrão" do XEN
  • -s <IP_do_XEN_que_vai_receber_a_VM>: IP do seu servidor XEN que vai receber a máquina virtual
  • -u <root>: usuário padrão que é criado quando é feita uma instalação do XEN Server.
  • -pw <senha>: senha que é definida quando é feita uma instalação do XEN Server. Note que ela precisa estar entre aspas.
  • Vm-import: parâmetro que informa ao XEN que será feita uma importação, ou seja, vai receber um arquivo .xva.
  • vm="<Nome_para_a_VM>": nome para a máquina virtual que vai ficar visível no painel do Citrix
  • filename="<Caminho_onde_está_o_arquivo_.xva>": caminho absoluto onde está o arquivo .xva que foi exportado. É importante prestar bastante atenção nas aspas.

O trabalho "automático" de exportação

Até agora o que vimos foi o trabalho de exportação feito via GUI (Graphical User Interface - Interface Gráfica do Usuário), que é bem trabalhoso para fazer em ambientes maiores, onde a quantidade de máquinas virtuais é muito maior do que essas do meu ambiente de testes.

Depois de muito pesquisar, achei algumas combinações de comandos que fazem tudo isso de forma mais direta e sem precisar de interface gráfica. Óbvio, para pessoas que não têm uma certa intimidade com o terminal do Linux, vai parecer um pouco complicado, mas vamos lá.

Neste primeiro passo, vamos fazer o procedimento com apenas uma VM, no caso, a que tem o nome "Debian", e depois vou disponibilizar o script em Shell que desenvolvi baseado nos comandos do Xen para automatizar o trabalho.

OBSERVAÇÃO 1: TODOS os comandos a seguir precisam ser digitados no terminal do XEN, e não no console da máquina virtual.

OBSERVAÇÃO 2: TODOS os comandos são executados em apenas uma linha, mesmo quando tenha quebra de linha no mesmo.

OBSERVAÇÃO 3: para que os comandos funcionem "adequadamente", a VM precisa ter um nome único, sem espaços em branco, como "Debian", "Máquina-Teste", "CentOS-Producao", entre outros.

Vamos executar alguns comandos para poder obter o nome da VM e seu respectivo UUID, que é um dado crucial para o processo de criação do Snapshot e exportação.

Para isso, executamos o comando abaixo:

# xe vm-list name-label="Debian"

Este comando vai listar toda e qualquer VM que tenha o nome exatamente igual a "Debian".

Será gerado um resultado parecido com o abaixo:

# xe vm-list name-label=Debian
uuid ( RO)           : 46e041d0-e550-7e7e-18e6-d632856ccab4
     name-label ( RW): Debian
    power-state ( RO): running

Onde mostra o UUID da VM, seu nome e seu estado atual (executando, desligada, pausada etc).

Com posse desses dados, executamos o comando a seguir:

# xe vm-snapshot uuid=<UUID_para_backup> new-name-label=<Nome_do_Snapshot>

Que em nosso caso vai ficar assim:

# xe vm-snapshot uuid=46e041d0-e550-7e7e-18e6-d632856ccab4 new-name-label=Snapshot_do_Debian

Essa linha quer dizer para fazer um snapshot da VM com o UUID fornecido e que tenha o nome "Snapshot_do_Debian".

Será gerado o UUID do Snapshot, que também vamos precisar para exportar o mesmo para o arquivo .xva.

Com posse deste UUID, execute o comando abaixo, colocando o UUID do Snapshot que foi gerado para a sua máquina virtual:

# xe template-param-set is-a-template=false ha-always-run=false uuid=<UUID_do_Snap>

Que em nosso caso vai ficar assim:

# xe template-param-set is-a-template=false ha-always-run=false uuid=e5d72354-d6bc-2727-8dbd-244d7f64aadd

Agora é hora de criar o arquivo .xva, esse processo pode ser demorado, dependendo do tamanho em disco da máquina virtual e o destino do arquivo, que pode ser a máquina local, um servidor na rede ou um storage, como é no meu caso. Para fazer a exportação, execute o comando abaixo:

# xe vm-export vm=<UUID_do_Snapshot> filename=<Caminho_de_destino_do_arquivo.xva>

E no meu caso ficaria assim:

# xe vm-export vm=e5d72354-d6bc-2727-8dbd-244d7f64aadd filename=/mnt/suporte/backupvms/Debian.xva

Onde "vm" vai conter o UUID do Snapshot da máquina virtual e "filename" vai ter o caminho de destino do arquivo .xva.

Em seguida, opcional, vamos excluir o snapshot que criamos anteriormente. Para isso, execute o comando:

# xe vm-uninstall uuid=<UUID_do_Snapshot> force=true

Que iremos, usar com o UUID do nosso Snapshot:

# xe vm-uninstall uuid=e5d72354-d6bc-2727-8dbd-244d7f64aadd force=true

Como devem ter percebido, esse processo é para apenas uma VM, mas tem como fazer de várias máquinas virtuais e de forma automática. Com todos esses comando criei um script em Shell, que é a linguagem de programação nativa do Linux, para automatizar todo o processo. O script está todo comentado para melhor entendimento.

Link para o script: http://pastebin.com/hipVF40p

OBSERVAÇÃO: quando desenvolvi esse script, fiz de acordo com minhas necessidades, e, para melhor funcionamento no meu ambiente, precisava-se que TODAS as máquinas virtuais tivessem um nome único, sem espaço em branco, como por exemplo "Debian", "Centos-Teste", entre outros.

Espero que essa documentação tenha lhe ajudado, pois eu estava quase desistindo de ter uma solução free para resolver esse problema que enfrentei e que, provavelmente, muita gente também enfrentou.

Críticas, dúvidas e sugestões são muito bem-vindas.

Muito obrigado.

Página anterior    

Páginas do artigo
   1. Exportação de Snapshot online das Máquinas Virtuais do Xen Server
   2. Termos essenciais
   3. Importação via linha de comando
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Backups com Amazon S3

Backup completo com sincronismo da /home em nuvem - Grátis

Virtualização com ESXi 5.5.0 - pfSense virtualizado + backup de VMs no FreeNAS via iSCSI

Implantando um Servidor de Backup com Bacula - Debian Squeeze

Aumentando Resize (Tamanho) do HD Virtual VMDK - Debian 8 Jessie

  
Comentários
[1] Comentário enviado por JJSantos em 25/10/2016 - 00:16h

Vou testar

[2] Comentário enviado por paulomenor em 31/10/2016 - 15:32h


Testei seu código, a única parte que não funcionou foi a parte em que faz a exclusão do snapshot.
Tenho um pool com 4 servidores, xenserver versão 6,5 e todas vms estão em um storage.
Sabe me dizer se tem mais algum parâmetro?

[3] Comentário enviado por trbarbosa em 01/11/2016 - 09:18h

paulomenor, aqui funciona normalmente, mas acho que pra você conseguir excluir um snapshot precisa executar os dois comandos abaixo em ordem:

xe template-param-set is-a-template=false ha-always-run=false uuid=<UUID_do_Snapshot>

e depois:

xe vm-uninstall uuid=<UUID_do_Snapshot> force=true

Tente isso aí e dê uma resposta, qualquer coisa estamos à disposição.

Abraço.

[4] Comentário enviado por pbonfanti em 08/11/2016 - 08:35h

Muito boa a matéria , eu tenho um script de backup que uso aqui mas o seu é mais limpo, e eu estava no processo de parar a vm para backup, como você citou.
Aproveito a deixa para comentar um problema que eu tenho, em que uma das vms é um sistema legado que roda em ubuntu muito antigo, em que o xenserver-tools não instala. Nesse caso especifico ao tentar rodar comandos xen para esta vm o hipervisor inteiro congela (hang_task_timeout), de modo que se torna necessário resetar o equipamento, que é servidor de produção aqui, hospedando oito servidores diferentes para a rede interna, como dhcp,squid, apache, mysql, etc...
Até o momento o meu script precisa logar na vm problemática via ssh e rodar dentro dela o 'shutdown -h now' e só em seguida executar os comandos para as vms compatíveis.
Pelo fato de eu usar a linha de comando com uma certa frequencia os meus name-label não possuem espaço, o que facilita o seu método, como meus serviços não atendem a internet e são criticos apenas em horario comercial, o vm-shutdown durante a noite não é tão critico, então ficam algumas duvidas...
- O processo de snapshot tem alguma vantagem no meu caso? (mais ra&#7765;ido ou mais seguro por exemplo) ou a vantagem se refere apenas a disponibilidade do serviço mais próxima de 24/7 ?
- Você conhece algum método intuitivo e seguro de identicar no xenserver, quais recursos como discos e interfaces virtuais de rede , estão ativos e ligados a vms de produção (não snapshots ou orfãos ), devo ter cometido alguns erros na implementação e a identificação de uuid não é muito intuitiva para detectar essas coisas. Desde já agradeço.

[5] Comentário enviado por trbarbosa em 08/11/2016 - 09:46h

pbonfanti, não é que o processo de snapshot tenha alguma vantagem, fazer o snapshot é um dos passos pra realizar o backup das suas máquinas. Quando você fala em método intuitivo e seguro para identificar no XEN Server o uso de discos e interfaces de rede, você fala em modo texto ou pela GUI?? Se for por linha de comando, ainda não parei para estudar isso.

Qualquer dúvida, estamos à disposição.

Abraço.

[6] Comentário enviado por murilocsilva em 24/05/2017 - 09:14h

Bom dia, tenho dois servidores Xenserver 6.5 e um script de backup automático que consegui na internet e adaptei para minha rede, funciona bem faz o snapshot de todas as maquinas ligadas depois converte em .xva. Tudo agendado no crontab..
segue o script...

#!/bin/bash
# Script para backup a quente das vm's do XenServer
# E-tab Tecnologia - marcelo.leaes@e-tab.com.br
# O funcionamento do script é simples. Ele cria um snapshot, converte para template e remove o snapshot
# O envio de emails depende do SendEmail baixe de http://caspian.dotconf.net/menu/Software/SendEmail/
# Jamais rode este script antes de testar seu funcionamento em um host de homologação antes ;)
# Modificado em 01/07/2014 por Murilo Cesar da Silva

PATH=/opt/xensource/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
export PATH

BACKDATE=`date +%d-%m-%Y`

# Configurações para o envio de emails
# REMETENTE="backups@seudominio.com.br"
# ADMIN="suporte@seudominio.com.br"
# ASSUNTO="XENSERVER - Backup concluido no host $HOSTNAME"
# SMTP="smtp.seudominio.com.br"
# USUARIO="usuario.smtp@seudominio.com.br"
# SENHA="senhadomail"

# Defina aqui o diretório onde serão salvos os backups
BACKDIR=/defina-aqui-seu-diretorio-de-backup/$BACKDATE/$HOSTNAME

echo -e "Resumo das ações realizadas em $HOSTNAME \n" > /home/xen_back.mail

if [ -d $BACKDIR ]
then
echo "Diretório de backup já existe"
echo "$BACKDIR Exists" >> /home/xen_back.mail
else
echo "Diretório de backup não existe, criando agora."
echo "$BACKDIR não existe, criando agora" >> /home/xen_back.mail
mkdir -p $BACKDIR
fi

echo "Gerando lista das VMs rodando no Host"
xe vm-list power-state=running|grep name-label| grep -v "Control domain on host:" | sed 's/ name-label ( RW): //g' > /home/xen_back1
echo -e "\n Gerando lista das VMs rodando no Host" >> /home/xen_back.mail
cat /home/xen_back1 >> /home/xen_back.mail

if [ $? -eq 0 ]
then
echo -e "Listagem das VMs concluida com sucesso \n"
echo -e "Listagem das VMs concluida com sucesso \n" >> /home/xen_back.mail
else
echo -e "Ocorreu um erro ao obter listagem do Host \n"
echo -e "Ocorreu um erro ao obter listagem do Host \n" >> /home/xen_back.mail
fi

VMLIST=`cat /home/xen_back1 | wc -l`
COUNT=0
until [ $VMLIST = $COUNT ]
do
COUNT=`expr $COUNT + 1`
VM=`gawk FNR==$COUNT /home/xen_back1`

echo "Criando snapshot de $VM"
echo "Criando snapshot de $VM" >> /home/xen_back.mail
SNAPSHOT=`xe vm-snapshot vm="$VM" new-name-label="$VM"-$BACKDATE new-name-description="Snapshot Temporário" `

if [ $? -eq 0 ]
then
echo -e "Snapshot da vm $VM criado com sucesso \n"
echo -e "Snapshot da vm $VM criado com sucesso \n" >> /home/xen_back.mail
else
echo -e "Ocorreu um erro ao tentar fazer snapshot da vm $VM \n"
echo -e "Ocorreu um erro ao tentar fazer snapshot da vm $VM \n" >> /home/xen_back.mail
fi

echo "Convertendo o snapshot $SNAPSHOT da vm $VM para Template"
echo "Convertendo o snapshot $SNAPSHOT da vm $VM para Template" >> /home/xen_back.mail
xe template-param-set is-a-template=false uuid=$SNAPSHOT

if [ $? -eq 0 ]
then
echo -e "Conversão do snapshot $SNAPSHOT da vm $VM realizado com sucesso \n"
echo -e "Conversão do snapshot $SNAPSHOT da vm $VM realizado com sucesso \n" >> /home/xen_back.mail
else
echo -e "Ocorreu um erro ao tentar converter o snapshot $SNAPSHOT da vm $VM em um Template \n"
echo -e "Ocorreu um erro ao tentar converter o snapshot $SNAPSHOT da vm $VM em um Template \n" >> /home/xen_back.mail
fi

echo "Exportando $SNAPSHOT da vm $VM"
echo "Exportando UUID=$SNAPSHOT" >> /home/xen_back.mail
xe vm-export vm=$SNAPSHOT filename=$BACKDIR/"$VM".xva compress=true

if [ $? -eq 0 ]
then
echo -e "Processo de conversão do snapshot $SNAPSHOT e backup da vm $VM finalizado com sucesso \n"
echo -e "Processo de conversão do snapshot $SNAPSHOT e backup da vm $VM finalizado com sucesso \n" >> /home/xen_back.mail
else
echo -e "Processo de conversão do snapshot $SNAPSHOT para backup da vm $VM não pode ser realizado \n"
echo -e "Processo de conversão do snapshot $SNAPSHOT para backup da vm $VM não pode ser realizado \n" >> /home/xen_back.mail
fi

echo "Removendo $SNAPSHOT da vm $VM"
echo "Removendo UUID=$SNAPSHOT">> /home/xen_back.mail
xe vm-uninstall uuid=$SNAPSHOT force=true

if [ $? -eq 0 ]
then
echo -e "Remoção do snapshot $SNAPSHOT da vm $VM ocorreu com sucesso \n"
echo -e "Remoção do snapshot $SNAPSHOT da vm $VM ocorreu com sucesso \n" >> /home/xen_back.mail
else
echo -e "Ocorreu um erro ao tentar remover $SNAPSHOT vinculado a vm $VM \n"
echo -e "Ocorreu um erro ao tentar remover $SNAPSHOT vinculado a vm $VM \n" >> /home/xen_back.mail
fi
echo -e "\n" >> /home/xen_back.mail
done

/usr/local/bin/sendEmail -f $REMETENTE -t $ADMIN -u "$ASSUNTO" -o message-file="/tmp/xen_back.mail" -s $SMTP -xu $USUARIO -xp $SENHA

rm -rf /tmp/xen_back*

exit 0

[7] Comentário enviado por taryk em 27/06/2017 - 10:55h

muito bom o tutorial!!
mais na hora de importa a maquina remotamente ta dando um erro.

The VM could not be imported.
msg: INTERNAL_ERROR: [ Unix.Unix_error(Unix.ECONNRESET, "read", "") ]

se alguem ja passou por isso e poder ajuda agradeço!

[8] Comentário enviado por doomk em 18/08/2017 - 15:38h

Parabéns pelo artigo!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts