Script de Backup a quente VM’s XenServer 6.5, 7.x

citrixAo trabalhar com virtualizações conseguimos otimizar muitas tarefas, uma delas é o backup a quente. O backup “a quente” significa que podemos realizar uma cópia de segurança de uma ou várias virtualizações sem a necessidade de desliga-la. Neste artigo será demonstrado como realizar backups de virtualizações a quente no XenServer, através de um script de backup otimizado.

CONSIDERAÇÕES

Estamos considerando que você já possua um servidor hospedeiro XenServer instalado e em funcionamento. Também iremos considerá que já possua entendimento básico da ferramenta e noções avançadas de Linux. A versão utilizada no servidor hospedeiro é o XenServer 7.0, a mais atual no momento da elaboração deste artigo.

1) COLHENDO INFORMAÇÕES PERTINENTES

Para que possamos criar nosso script, antes precisamos colher uma informação de nosso XenServer a ser backapeado. Para isso, utilize a ferramenta XenCenter, selecione seu servidor, e na aba console, acesse o shell conforme ilustrado abaixo.

Nota: Também é possível realizar o acesso ao console do servidor utilizando o protocolo SSH. Utilize uma ferramenta de acesso para isto, por exemplo o putty.

A informação que precisamos obter é o “Storage-Repository-UUID” de nosso servidor. Para isso, utilize o comando conforme ilustrado abaixo no console do xenserver.

xe sr-list

Após executar o comando, teremos em mãos a informação necessária para criar um novo arquivo de script capaz de realizar backups de VM’s “a quente”, totalmente automatizado. Crie um arquivo chamado “bkp-vm-individual.sh” em “/etc/init.d/” ou onde preferir e adicione o código ilustrado abaixo:

Nota: O nome e local foi definido neste artigo para fins didáticos, eles podem ser definidos de acordo com suas necessidades. A alteração não afeta o funcionamento do script.


#!/bin/bash
# Script de backup das VM's Xen-Server (VM's a QUENTE)
####################################################################################
# Criado por: Rafael Oliveira #
# Fone:(27) 99981-4409 #
# e-mail: faelolivei@gmail.com #
####################################################################################

storagebkp="12dbe502-642d-d601-f606-7fae3edefe86" # Storage beckapeado.
dhvm=`date +%d-%m-%Y_%H-%M-%S` # data completa de informacao de cada etapa.
datain=`date +%s` # data usada para subtracao de tempo.
vmname="Ubuntu1"

echo "==============================================================================" >> /var/log/backup/vms/bkp-${vmname}.log
echo "Iniciando backup da vm ${vmname} em ${dhvm}" >> /var/log/backup/vms/bkp-${vmname}.log

data=`date +%c` # Data e hora atual.
echo "1) Cria snapshot da maquina em ${data}." >> /var/log/backup/vms/bkp-${vmname}.log
idvm=`xe vm-snapshot vm=${vmname} new-name-label=${vmname}_snapshot` 2>> /var/log/backup/vms/bkp-${vmname}.log
if [ $? -eq 0 ]; then
echo "Id Snapshot criado: ${idvm}" >> /var/log/backup/vms/bkp-${vmname}.log
echo "Executou com sucesso." >> /var/log/backup/vms/bkp-${vmname}.log
echo "------------------------------------------------------------------------------" >> /var/log/backup/vms/bkp-${vmname}.log
else
echo "Problemas na execução, verifique o arquivo de log." >> /var/log/backup/vms/bkp-${vmname}.log
echo "==============================================================================" >> /var/log/backup/vms/bkp-${vmname}.log
exit 1
fi

data=`date +%c` # Data e hora atual.
echo "2)Convertendo o snapshot criado em template em ${data}." >> /var/log/backup/vms/bkp-${vmname}.log
xe template-param-set is-a-template=false uuid=${idvm} 2>> /var/log/backup/vms/bkp-${vmname}.log
if [ $? -eq 0 ]; then
echo "Executou com sucesso." >> /var/log/backup/vms/bkp-${vmname}.log
echo "------------------------------------------------------------------------------" >> /var/log/backup/vms/bkp-${vmname}.log
else
echo "Problemas na execução, verifique o arquivo de log." >> /var/log/backup/vms/bkp-${vmname}.log
echo "==============================================================================" >> /var/log/backup/vms/bkp-${vmname}.log
exit 1
fi

data=`date +%c` # Data e hora atual.
echo "3)Convertendo o template em VM em ${data}" >> /var/log/backup/vms/bkp-${vmname}.log
cvvm=`xe vm-copy vm=${vmname}_snapshot sr-uuid=${storagebkp} new-name-label=${vmname}_${dhvm}` 2>> /var/log/backup/vms/bkp-${vmname}.log
if [ $? -eq 0 ]; then
echo "Executou com sucesso." >> /var/log/backup/vms/bkp-${vmname}.log
echo "------------------------------------------------------------------------------" >> /var/log/backup/vms/bkp-${vmname}.log
else
echo "Problemas na execução, verifique o arquivo de log." >> /var/log/backup/vms/bkp-${vmname}.log
echo "==============================================================================" >> /var/log/backup/vms/bkp-${vmname}.log
exit 1
fi

data=`date +%c` # Data e hora atual.
echo "4)Exportando VM criada para o HD externo em ${data}." >> /var/log/backup/vms/bkp-${vmname}.log
xe vm-export vm=${cvvm} filename="/mnt/backup/bkpvms/${vmname}/${vmname}_${dhvm}.xva" &>> /var/log/backup/vms/bkp-${vmname}.log
if [ $? -eq 0 ]; then
echo "Executou com sucesso." >> /var/log/backup/vms/bkp-${vmname}.log
echo "------------------------------------------------------------------------------" >> /var/log/backup/vms/bkp-${vmname}.log
else
echo "Problemas na execução, verifique o arquivo de log." >> /var/log/backup/vms/bkp-${vmname}.log
echo "==============================================================================" >> /var/log/backup/vms/bkp-${vmname}.log
exit 1
fi

data=`date +%c` # Data e hora atual.
echo "5)Deletando VM e seu VDI criado em ${data}." >> /var/log/backup/vms/bkp-${vmname}.log
xe vm-uninstall vm=${cvvm} force=true &>> /var/log/backup/vms/bkp-${vmname}.log
if [ $? -eq 0 ]; then
echo "Executou com sucesso." >> /var/log/backup/vms/bkp-${vmname}.log
echo "------------------------------------------------------------------------------" >> /var/log/backup/vms/bkp-${vmname}.log
else
echo "Problemas na execução, verifique o arquivo de log." >> /var/log/backup/vms/bkp-${vmname}.log
echo "==============================================================================" >> /var/log/backup/vms/bkp-${vmname}.log
exit 1
fi

data=`date +%c` # Data e hora atual.
echo "6)Deletando Snapshot criado em ${data}." >> /var/log/backup/vms/bkp-${vmname}.log
xe vm-uninstall --force uuid=${idvm} &>> /var/log/backup/vms/bkp-${vmname}.log
if [ $? -eq 0 ]; then
echo "Executou com sucesso." >> /var/log/backup/vms/bkp-${vmname}.log
echo "------------------------------------------------------------------------------" >> /var/log/backup/vms/bkp-${vmname}.log
else
echo "Problemas na execução, verifique o arquivo de log." >> /var/log/backup/vms/bkp-${vmname}.log
echo "==============================================================================" >> /var/log/backup/vms/bkp-${vmname}.log
exit 1
fi

data=`date +%c` # Data e hora atual.
echo "7)Excluindo backups duplicados em ${data}" >> /var/log/backup/vms/bkp-${vmname}.log
ls -td1 /mnt/backup/bkpvms/${vmname}/* | sed -e '1,2d' | xargs -d '\n' rm -rif &>> /var/log/backup/vms/bkp-${vmname}.log
if [ $? -eq 0 ]; then
echo "Executou com sucesso." >> /var/log/backup/vms/bkp-${vmname}.log
echo "------------------------------------------------------------------------------" >> /var/log/backup/vms/bkp-${vmname}.log
echo "Backup VM ${vmname} concluido em ${data}." >> /var/log/backup/vms/bkp-${vmname}.log
else
echo "Problemas na execução, verifique o arquivo de log." >> /var/log/backup/vms/bkp-${vmname}.log
echo "==============================================================================" >> /var/log/backup/vms/bkp-${vmname}.log
exit 1
fi
dataoud=`date +%s` #data final de execução
seg=$((${dataoud} - ${datain}))
min=$((${seg}/60))
seg=$((${seg}-${min}*60))
hor=$((${min}/60))
min=$((${min}-${hor}*60))
echo "Tempo estimado: ${hor}:${min}:${seg}" >> /var/log/backup/vms/bkp-${vmname}.log
echo "==============================================================================" >> /var/log/backup/vms/bkp-${vmname}.log
exit 0
#####################################################################

Você também pode baixar o código:

Link: Script
Chave: !2hWYmDF0C3iU8mhy7e_GEWg0mDUYvpXjNhg9b7mxbw0

2) CONFIGURAÇÃO DO SCRIPT

Pensando em facilitar a utilização deste script em diversos ambientes, foi definido algumas variáveis de inicialização que devem ser alteradas de acordo com o ambiente proposto. Estas variáveis encontram-se no inicio do script à saber:

vmname – Nome da VM que deseja realizar o backup.
storagebkp – Responsável por armazenar o UUID do Storage que consta as VM’s a serem backapeadas.
bkpdestino – Caminho no qual irá armazenar o backup da máquina virtual. Pode ser um HD Externo, ambiente de rede ou qualquer outro tipo de armazenamento que preferir. Basta estar montado corretamente no XenServer.

Realize as alterações conforme seu ambiente, salve o arquivo, de permissão de execução para o mesmo, e execute o backup.

Nota: Uma forma inteligente de realizar o backup e acompanhar seus logs é executa-lo em segundo plano, para isso realize a execução do script conforme ilustrado abaixo:

/etc/init.d/bkp-vm-individual.sh &

Em seguida acesse o arquivo de log utilizando o comando “tail -f” para visualizar em tempo real o registro de logs do script, conforme também ilustrado abaixo:

tail -f /var/log/backup/vms/VMNAME.log


3) AGENDANDO SCRIPT

Podemos utilizar o agendador “CRONTAB” para agendarmos nosso script. Para isso, edite o arquivo “/etc/crontab” com o editor de texto de sua preferência, e adicionar o agendamento desejado conforme ilustrado abaixo.

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
48 14 * * * root sh /etc/init.d/bkpvms.sh


4) EXPLICAÇÃO DO SCRIPT

O script está dividido em 7 (sete) etapas, estas etapas foram definidas para melhor entendimento de todo o processo. O próprio script já é auto explicativo, porém, vou definir em poucas palavras o funcionamento do mesmo.

I) Cria snapshot da máquina definida pela variável de inicialização “VMNAME” e adiciona a informação ao log. Se o comando foi bem sucedido passa para próxima etapa, caso contrário aborta o script.

II) Converte o snapshot criado em template e adiciona a informação ao log. Se o comando foi bem sucedido passa para próxima etapa, caso contrário aborta o script.

III) Converte o template em VM e adiciona a informação ao log. Se o comando foi bem sucedido passa para próxima etapa, caso contrário aborta o script.

IV) Exporta a VM criada para o HD externo e adiciona a informação ao log. Se o comando foi bem sucedido passa para próxima etapa, caso contrário aborta o script.

V) Deleta a VM e seu VDI criado e adiciona a informação ao log. Se o comando foi bem sucedido passa para próxima etapa, caso contrário aborta o script.

VI) Deleta o snapshot criado e adiciona a informação ao log. Se o comando foi bem sucedido passa para próxima etapa, caso contrário aborta o script.

VII) Exclui os backups duplicados mais antigos, mantendo somente duas cópias da VM no diretório definido e adiciona a informação ao log. Se o comando foi bem sucedido finaliza o script registrando o tempo de duração do backup, caso contrário aborta o script.

CONCLUSÃO

Através deste artigo conseguimos expor de maneira simples uma solução personalizada para realizar backups “a quente” de máquinas virtuais no XenServer.

Se você gostou deste post e através dele pude lhe ajudar, o que acha de aproximarmos nosso contato? Siga meu blog e me adicione no Linkedin, aproveite para classificar algumas das minhas competências/recomendações, este simples gesto faz toda a diferença.

Até a próxima!

Rafael Oliveira
SysAdmin

Você pode compartilhar esse artigo.

Siga o Blog Via E-mail

Digite seu endereço de e-mail para assinar este blog e receber notificações de novas publicações por e-mail.

Junte-se a 47 outros assinantes

Sobre o Autor

Rafael Oliveira Maria - Linux

Rafael Oliveira

Bacharel em Sistemas de Informação, SysAdmin, Professor, Blogueiro e Entusiasta Linux.

Certificados:

LPIC-1-Large
LPIC-2
LinuxPlus Logo Certified
itil-foundation-digital-badge

Gostou do conteúdo? Ajude-me a manter o blog.

PicPay - Linux

Aceitamos pagamentos e doações via PicPay link picpay.me/rafaeloliveimar

22 respostas

    1. Fernando meu brother, já tem aqui no blog um artigo que trato de realizar bkp de multiplas vms, pesquise aqui no blog sobre este termo que irá encontrar, veja se ti ajuda. Forte abr.

  1. Ola Rafael, Eu executei o comando e meu deu erro abaixo será que consegue me ajudar.

    Error: Multiple matches VMs found. Operation can only be performed on one VM at a time

    Segue meu comando xe sr-list

    uuid ( RO) : c1b11b7c-6f77-6c6f-5a95-f2274f8f1ed2
    name-label ( RW): Removable storage
    name-description ( RW):
    host ( RO): xen-isat-01
    type ( RO): udev
    content-type ( RO): disk

    uuid ( RO) : 1f1047ba-53b8-a1b4-bd1e-40cc0cb479d9
    name-label ( RW): XenServer Tools
    name-description ( RW): XenServer Tools ISOs
    host ( RO): xen-isat-01
    type ( RO): iso
    content-type ( RO): iso

    uuid ( RO) : 45ebe9e6-cfb7-f622-ebaf-e836d1d30d83
    name-label ( RW): Local storage
    name-description ( RW):
    host ( RO): xen-isat-01
    type ( RO): lvm
    content-type ( RO): user

    uuid ( RO) : 6019f378-c7cf-d763-a82a-42e82a67f0cd
    name-label ( RW): STO-02
    name-description ( RW): iSCSI SR [10.0.0.110 (*; LUN 2: XEN020: 600 GB (FreeBSD))]
    host ( RO): xen-isat-01
    type ( RO): lvmoiscsi
    content-type ( RO):

    uuid ( RO) : be35c077-a8da-ec13-3382-b9bf74e48907
    name-label ( RW): STO-01
    name-description ( RW): iSCSI SR [10.0.0.110 (*; LUN 1: XEN010: 600 GB (FreeBSD))]
    host ( RO): xen-isat-01
    type ( RO): lvmoiscsi
    content-type ( RO):

    uuid ( RO) : d74e8960-2f48-de4b-1b9c-98d8ab8be1ee
    name-label ( RW): STO-03
    name-description ( RW): iSCSI SR [10.0.0.110 (*; LUN 3: XEN030: 600 GB (FreeBSD))]
    host ( RO): xen-isat-01
    type ( RO): lvmoiscsi
    content-type ( RO):

    uuid ( RO) : 58861b08-5531-4053-3c37-144dd69cad96
    name-label ( RW): DVD drives
    name-description ( RW): Physical DVD drives
    host ( RO): xen-isat-01
    type ( RO): udev
    content-type ( RO): iso

    uuid ( RO) : b150b127-f276-5f3d-7e42-385b481dee84
    name-label ( RW): Biblioteca de ISOs
    name-description ( RW): CIFS ISO Library [\\10.0.0.2\ISAT-SHARE\Equipe TIC\Ferramentas]
    host ( RO): xen-isat-01
    type ( RO): iso
    content-type ( RO): iso

    uuid ( RO) : 74e62d77-e3bd-763b-6f76-c91c7edcb7f8
    name-label ( RW): STO
    name-description ( RW): iSCSI SR [10.0.0.110 (*; LUN 0: XEN031: 3072 GB (FreeBSD))]
    host ( RO): xen-isat-01
    type ( RO): lvmoiscsi
    content-type ( RO):

  2. Rafael, estou recebendo a mensagem: Error: Multiple matches VMs found. Operation can only be performed on one VM at a time
    Consegue ajudar a entender ?

    Parabéns pela criatividade,
    Grato,

    1. Estou usando o XS 6.5 ..
      Copiei o código do site, o link de download está quebrado.
      Falta algo no código disponibilizado no site?

    1. Fala Thiago bom dia!

      Os comandos utilizados no scripts são destinados a Xen Server, estes comandos ali empregadas utilizam a ferramenta de comando “xe” do próprio Xen Server, por conta disso não é possível utilizar o script sem alterações para outro hypervisor. O que talvez pode ser feito é se basear no script e montar um outro focado no VMWare, eu particularmente migrei de VMware a bastante tempo e não poderei lhe ajudar muito em relação a isso, mas creio que a VMWare na versão paga tem soluções completas para essa situação. Espero ter esclarecido sua dúvida. Att,

  3. Olá Rafael,
    Fiz o processo igual você colocou, criei os diretórios iguais, mas na hora que executo o script traz abaixo.
    [root@localhost init.d]# ./backup.sh
    The uuid you supplied was invalid.
    type: SR
    uuid: d03f53db-480b-5048-e1ed-4415f31cc345

    —-
    Verificando qual será UUID para backup com o comando abaixo, porém não me traz as duas maquinas virtuais que tenho, um pfsense e um server 2012, se eu utilizar o vm-list aí mostra.
    Independente disso eu vou no arquivo e coloco o UUID mais o Nome e mostra o erro acima, tentei fazer das vms e do xen inteiro e não vai, pelo log ele

    [root@localhost vms]# xe sr-list
    uuid ( RO) : db987938-67cb-4e36-b78a-aaa85e68bb2d
    name-label ( RW): DVD drives
    name-description ( RW): Physical DVD drives
    host ( RO): xenserver-netnews
    type ( RO): udev
    content-type ( RO): iso

    uuid ( RO) : c5d5d3a1-91c6-8fd1-2bcc-f048bb9f671b
    name-label ( RW): Removable storage
    name-description ( RW):
    host ( RO): xenserver-netnews
    type ( RO): udev
    content-type ( RO): disk

    uuid ( RO) : 202e3252-f941-06a0-442f-fd277f047fd6
    name-label ( RW): XenServer Tools
    name-description ( RW): XenServer Tools ISOs
    host ( RO): xenserver-netnews
    type ( RO): iso
    content-type ( RO): iso

    uuid ( RO) : 0223da28-0436-a764-9c67-c16074469d51
    name-label ( RW): Local storage
    name-description ( RW):
    host ( RO): xenserver-netnews
    type ( RO): ext
    content-type ( RO): user

    ==============================================================================
    Iniciando backup da vm off-modelo-2012 em 16-07-2018_10-58-38
    1) Cria snapshot da maquina em Mon 16 Jul 2018 10:58:38 AM BRT.
    Id Snapshot criado: 6895a1f9-763e-207f-c821-4079921075f2
    Executou com sucesso.
    ——————————————————————————
    2)Convertendo o snapshot criado em template em Mon 16 Jul 2018 10:58:39 AM BRT.
    Executou com sucesso.
    ——————————————————————————
    3)Convertendo o template em VM em Mon 16 Jul 2018 10:58:39 AM BRT
    Problemas na execução, verifique o arquivo de log.
    ==============================================================================

    1. Fala Cesar tudo bem?

      O comando “xe sr-list” você vai usar para pegar o UUID do storage “Storage-Repository-UUID” e não o UUID de suas máquinas virtuais. O Armazenamento Storage “Em outras palavras: O HD físico do seu host, que armazena as virtualizações”, possui um UUID, e no script de backup e preciso informar qual é. Já as máquinas virtuais que deseja fazer backup vc não precisa pegar o UUID, elas são identificadas dentro do script pelo nome. Da uma olhada novamente no inicio do artigo para compreender melhor. Qualquer coisa só falar. Abr.

    1. Bom dia Gustavo, Tudo bom!

      Você pode utilizar qualquer editor de texto padrão no Linux, como “vi” ou “nano”. Porém, aconselho fortemente procurar conhecimentos sobre Linux antes de se aventurar no Xen, Linux é a base para esse hypervisor e os assuntos informados aqui irão lhe exigir um nível minimo de conhecimento.

      Att,

  4. Rafael, boa tarde!
    No meu está aparecendo esse erro:

    VM : df43b792-7d63-c465-b543-a94132018b16 (Ubuntu_1604_snapshot)
    VDI: b2b0882d-cf83-408e-9a1a-3a3c65f9c6b3 (Ubuntu_1604 0)
    You gave an invalid object reference. The object may have recently been deleted. The class parameter gives the type of reference given, and the handle parameter echoes the bad value given.

    1. Ei João boa noite! Desculpe a demora, correria aqui.

      Sobre seu problema verifique se identificou corretamente o seu ID do storage no script. Pelo erro, parece que ele não está conseguindo encontrar. Também tenha certeza que possui espaço necessário para realizar a cópia de backup no storage. Leve em consideração que você sempre precisará de no minimo o dobro de tamanho da VM em espaço livre, isso porque o script duplica a VM para fazer o bkp. Espero ter ajudado, abr.

  5. Rafael, sensacional esse script para backupear cada VM individualmente realmente possibilita uma tranquilidade a mais. Encontrei apenas uma coisa que acho válido levantar que é o fato de que em VM’s que tenham espaço no nome o script provavelmente vai dar um erro mais simples de resolver, aqui no meu caso como não quis mudar o script eu simplesmente removi os espaços no nome da VM e funcionou 100%.
    Muito obrigado pela ajuda e um abraço.

Ficou com dúvida? Alguma Sugestão ou Elogio? Deixe seu comentário!