Ao trabalhar com virtualizações conseguimos otimizar muitas tarefas, uma delas é o backup a quente de máquinas virtuais. Este tipo de backup, 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 o backup a quente de múltiplas virtualizações no Xen Server 7, através de um script de backup otimizado.
CONSIDERAÇÕES
Estamos considerando que você já possua um servidor hospedeiro Xen Server 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. Também disponibilizei um artigo referente a backups de vms de forma individual, caso tenha interesse acesse: “Script de Backup a quente VM’s XenServer 6.5, 7.x“
PEGA A VISÃO
Se você conhece pouco de Xen Server e necessita aprofundar-se no assunto, que tal aceitar minha dica? Assista a aula de apresentação.
Agora se seu foco e ir além do Xen Server, então você precisará conhecer o Xen Desktop. Assista a aula de apresentação.
Mas se seu foco é migração de Hypervisor, também tenho uma indicação especial para você. Já ouviu falar do Proxmox? Assista a aula de apresentação.
1) COLHENDO INFORMAÇÕES PERTINENTES
Para que possamos criar nosso script, antes precisamos colher uma informação de nosso Xen Server a ser backupeado. 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 Xen Server.
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 “bkpvms.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 # #################################################################################### # Variaveis ######################################################################## storagebkp="9aee4ad3-9db2-315b-1bc6-401fea6ba74a" # Seu Storage. dataarq=`date +%d-%m-%Y` # data para numenclatura do arquivo de log. datain2=`date +%s` # data usada para subtracao de tempo final da execução do script bkpdestino=/mnt/backup/bkpvms # Caminho para armazenamento do backup # Cria o diretorio que armazena o log caso não exista ############################## if test -d /var/log/backup/vms; then echo ""; else mkdir -p /var/log/backup/vms; fi; # Definicao de array ############################################################### echo "==============================================================================" > /var/log/backup/vms/bkpvms-${dataarq}.log arrayvms=(Ubuntu1 Ubuntu2 WinServer2008R2) echo "Servidores a serem backupeados: ${arrayvms[*]}." >> /var/log/backup/vms/bkpvms-${dataarq}.log # For de backup #################################################################### for vmname in ${arrayvms[*]} do { dhvm=`date +%d-%m-%Y_%H-%M-%S` # data completa de informacao de cada etapa. datain=`date +%s` # data usada para subtracao de tempo de cada vm. sleep 60 # Aguarda 1 minuto antes de iniciar o bkp. echo "==============================================================================" >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "Iniciando backup da vm ${vmname} em ${dhvm}" >> /var/log/backup/vms/bkpvms-${dataarq}.log data=`date +%c` # Data e hora atual. echo "1) Cria snapshot da maquina em ${data}." >> /var/log/backup/vms/bkpvms-${dataarq}.log idvm=`xe vm-snapshot vm=${vmname} new-name-label=${vmname}_snapshot` &> /var/log/backup/vms/bkpvms-${dataarq}.log if [ $? -eq 0 ]; then { echo "Id Snapshot criado: ${idvm}" >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "Executou com sucesso." >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "------------------------------------------------------------------------------" >> /var/log/backup/vms/bkpvms-${dataarq}.log } else { echo "Problemas na execução, verifique o arquivo de log." >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "==============================================================================" >> /var/log/backup/vms/bkpvms-${dataarq}.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/bkpvms-${dataarq}.log xe template-param-set is-a-template=false uuid=${idvm} &> /var/log/backup/vms/bkpvms-${dataarq}.log if [ $? -eq 0 ]; then { echo "Executou com sucesso." >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "------------------------------------------------------------------------------" >> /var/log/backup/vms/bkpvms-${dataarq}.log } else { echo "Problemas na execução, verifique o arquivo de log." >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "==============================================================================" >> /var/log/backup/vms/bkpvms-${dataarq}.log exit 1 } fi; data=`date +%c` # Data e hora atual. echo "3)Convertendo o template em VM em ${data}" >> /var/log/backup/vms/bkpvms-${dataarq}.log cvvm=`xe vm-copy vm=${vmname}_snapshot sr-uuid=${storagebkp} new-name-label=${vmname}_${dhvm}` &> /var/log/backup/vms/bkpvms-${dataarq}.log if [ $? -eq 0 ]; then { echo "Executou com sucesso." >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "------------------------------------------------------------------------------" >> /var/log/backup/vms/bkpvms-${dataarq}.log } else { echo "Problemas na execução, verifique o arquivo de log." >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "==============================================================================" >> /var/log/backup/vms/bkpvms-${dataarq}.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/bkpvms-${dataarq}.log if test -d ${bkpdestino}/${vmname}; then { # Se existir o diretorio xe vm-export vm=${cvvm} filename="${bkpdestino}/${vmname}/${vmname}_${dhvm}.xva" &> /var/log/backup/vms/bkpvms-${dataarq}.log } else { # Se não existir o diretorio, cria um. mkdir -p ${bkpdestino}/${vmname} echo "Criando diretorio ${bkpdestino}/${vmname}" xe vm-export vm=${cvvm} filename="${bkpdestino}/${vmname}/${vmname}_${dhvm}.xva" &> /var/log/backup/vms/bkpvms-${dataarq}.log } fi; if [ $? -eq 0 ]; then { echo "Executou com sucesso." >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "------------------------------------------------------------------------------" >> /var/log/backup/vms/bkpvms-${dataarq}.log } else { echo "Problemas na execução, verifique o arquivo de log." >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "==============================================================================" >> /var/log/backup/vms/bkpvms-${dataarq}.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/bkpvms-${dataarq}.log xe vm-uninstall vm=${cvvm} force=true &> /var/log/backup/vms/bkpvms-${dataarq}.log if [ $? -eq 0 ]; then { echo "Executou com sucesso." >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "------------------------------------------------------------------------------" >> /var/log/backup/vms/bkpvms-${dataarq}.log } else { echo "Problemas na execução, verifique o arquivo de log." >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "==============================================================================" >> /var/log/backup/vms/bkpvms-${dataarq}.log exit 1 } fi; data=`date +%c` # Data e hora atual. echo "6)Deletando Snapshot criado em ${data}." >> /var/log/backup/vms/bkpvms-${dataarq}.log xe vm-uninstall --force uuid=${idvm} &> /var/log/backup/vms/bkpvms-${dataarq}.log if [ $? -eq 0 ]; then { echo "Executou com sucesso." >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "------------------------------------------------------------------------------" >> /var/log/backup/vms/bkpvms-${dataarq}.log } else { echo "Problemas na execução, verifique o arquivo de log." >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "==============================================================================" >> /var/log/backup/vms/bkpvms-${dataarq}.log exit 1 } fi; data=`date +%c` # Data e hora atual. echo "7)Excluindo backups duplicados em ${data}" >> /var/log/backup/vms/bkpvms-${dataarq}.log ls -td1 ${bkpdestino}/${vmname}/* | sed -e '1,2d' | xargs -d '\n' rm -rif &> /var/log/backup/vms/bkpvms-${dataarq}.log if [ $? -eq 0 ]; then { echo "Executou com sucesso." >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "------------------------------------------------------------------------------" >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "Backup VM ${vmname} concluido em ${data}." >> /var/log/backup/vms/bkpvms-${dataarq}.log } else { echo "Problemas na execução, verifique o arquivo de log." >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "==============================================================================" >> /var/log/backup/vms/bkpvms-${dataarq}.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/bkpvms-${dataarq}.log echo "==============================================================================" >> /var/log/backup/vms/bkpvms-${dataarq}.log } done; dataoud=`date +%s` #data final de execução seg=$((${dataoud} - ${datain2})) min=$((${seg}/60)) seg=$((${seg}-${min}*60)) hor=$((${min}/60)) min=$((${min}-${hor}*60)) echo "Tempo Total Estimado: ${hor}:${min}:${seg}" >> /var/log/backup/vms/bkpvms-${dataarq}.log echo "==============================================================================" >> /var/log/backup/vms/bkpvms-${dataarq}.log exit 0
Você também pode baixar o código:
Link: Script
Chave: !SZthjRhOxWw0QRzE9rFibaewKBTQR3ySbNPdBxqNYFg
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:
arrayvms – Array que armazena o nome das vm’s que serão backapeadas.
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/bkpvms.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/bkpvms-dd-mm-yyyy.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” baseada na array “ARRAYNAME” e adiciona a informação ao log. Se o comando foi bem sucedido passa para próxima etapa, caso contrário pula para a próxima VM a ser backupeada.
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 pula para a proxima VM a ser backupeada.
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 pula para a próxima VM a ser backupeada.
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 pula para a próxima VM a ser backupeada.
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 pula para a próxima VM a ser backupeada.
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 pula para a próxima VM a ser backupeada.
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 pula para a próxima VM a ser backupeada.
CONCLUSÃO
Através deste artigo conseguimos expor de maneira simples uma solução personalizada para realizar backups “a quente” de múltiplas máquinas virtuais no Xen Server.
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
49 respostas
Boa Tarde, muito obrigado pelas informações.
Agora estou com uma situação aqui diferente, veja se consegue me ajudar por favor:
Tenho um Xen com algumas vms, uma das virtualizações foi necessário a inclusão de 4 discos, sendo que 2 discos estão em uma storage e os outros 2 discos estão em outra storage, Como devo proceder para fazer este backup? Já que em 1 VM, tem discos em 2 storages diferentes.
Agradeço muito.
Fala Eduardo blz cara? Rapaz, realmente não peguei esse cenário, mas acredito que funciona de boa, a questão é que o script faz uma snapshot do HD no mesmo storage que ele se encontra, depois ele faz o bkp e apaga. Porém nunca testei neste cenário, não posso lhe afirmar, infelizmente. 😔
Entendi, tranquilo.
Agradeço a atenção.
Olá,
Seu script é realmente muito bom. Me ajuda bastante aqui no meu dia a dia.
Só que existe um pequeno inconveniente.
Voce direciona a saida do comando idvm utilizando o operador &>.
Só que isso acaba apagando todo o conteudo do log, o que é um problema.
De qualquer forma, eu gostaria de saber com voce como eu faço para direcionar a saida do comando para dentro do arquivo de log, afinal, não é muito util ir até o arquivo de log e não saber exatamente o que pode ter ocorrido.
Se eu dou um comando errado no Xen, ele irá me retornar um erro e eu quero que este erro esteja descrito dentro do log. A unica forma que eu consegui fazer isso foi com 2>, só que ele irá apagar todo o conteudo que existe no arquivo, o que não me é util.
Existe alguma forma de concatenar o STDOUT com o STDER?
Obrigado e otimo blog
Fala Wallace, blz? Que bom que foi útil, esse script já tem um tempinho que escrevi não percebi essa observação sua, depois vou revisar, obrigado! Com relação a sua dúvida vc já quase respondeu só utilizar 2>> assim vc irá acrescentar as informações a um arquivo existente sem apagar seu conteúdo. Espero ter ajudado mais uma vez. Abr.
Boa noite, tenho uma dúvida, no meu xen possuo mais de um storage, e as vms estão distribuidas neles, para utilizar este script, no caso, eu teria que fazer um script para cada storage? Por exemplo, tenho 5 VMs, 3 em 1 storage, 1 em outro storage e a ultima em outro storage.. Obrigado!
Fala Rodrigo blz? Cara, teoricamente você poderia utilizar um único script basta adapta-lo, mas vamos lá para esclarecer a dúvida, em regras gerais você precisará executar o script apontando para o storage que estão determinadas vms, e este storage precisará ter espaço para realizar o bkp.
Exemplo:
Storage 1: 3x VMs 10gb (O espaço no seu storage 1 tem que ser de no mínimo de 60gb, sendo 30gb livres para realizar os bkps).
Srotage 2: 1x VM 20gb (O espaço no seu storage 2 tem que ser de no mínimo 40gb, sendo 20gb livres para realizar o bkp).
Espero ter exclarecido.
Att,
Bom dia Rafael, estou com um problema, não tenho espaço em disco para realizar o backup, porém no mesmo servidor tenho outro hd que esta livre, eu não consigo executar o backup e salvar neste hd? Precisa ser no mesmo hd que esta a vm?
Boa tarde Rodrigo blz Cara?
Realmente não é possível, você precisa de um espaço de no mínimo o tamanho da vm no storage atual. Isso acontece porque ele faz uma cópia da VM (snapshot) e realiza o backup através desta cópia.
Boa tarde Rafael, mesmo ajustando para o script de backup de múltiplas VMs ele ainda continua me reportando o seguinte erro.
Error: Multiple matches VMs found. Operation can only be performed on one VM at a time
Fernando está estranho este seu erro, o script já é configurado para fazer bkp de uma VM de cada vez, inclusive já foi utilizados por várias outras pessoas. Pelo mensagem de erro ao tentar fazer bkp ele avisa que não é possível, pois não pode fazer bkp de várias VMs ao mesmo tempo. Verifique se existe algum bkp truncado ai no seu Xen, provavelmente deve ser isso que está travando.
Fiz um SRV de Homologação, não tinha nem uma backup a não ser o seu, fiz o servidor para testar o backup mesmo, tinha duas VMs no servidor uma desligada a outra ligada, fiz vários testes e dava o mesmo erro, tanto com ambas ligadas ou não tanto com os scripist para backcup de múltiplas vms e uma por vez =s
Neste caso sugiro realizar o bkp manualmente de forma a identificar o erro, desta forma conseguirá perceber em qual parte do script está acusando erro. Esqueça o script abra o prompt e realize o bkp manualmente veja se conseguirá. Abr.
Boa tarde ! O script é excelente, sem dúvidas. Gostaria de sua permissão para, baseado nesse seu script, realizar algumas pequenas modificações e postar o resultado, se possível. Obrigado !
Fala Vagner blz? Claro cara, será uma honra, pode utiliza-lo a vontade e por favor se possível marque o meu linkedin na publicação que fizer como contribuidor, serei muito grato, compartilhe com a comunidade suas alterações, será fantástico. Forte abr. tmj.
Rafael, coloquei os novos recursos no script e publiquei em https://www.profissionaisti.com.br/2020/05/script-de-backup-a-quente-para-citrix-xenserver/
Também mantive seus dados no arquivo do Script e link para este blog no texto descritivo.
O código está no github porque a intenção é compartilhar com a comunidade para melhorar cada vez mais.
Muito obrigado mesmo pela ajuda !
Show Vagner! tmj, Abr.
Boa noite Rafael.
Sou novato de linux, tenho poucos conhecimentos de comandos etc.
Gostei muito do seu artigo, estou tentando implementar seu script para rodar nos meus xenservers, mas ta dando erro ainda.
Acredito que fiz os ajuste necessários mas não tenho certeza.
[root@xenserver02 usb]# ./scriptvms.sh
./scriptvms.sh: line 34: syntax error near unexpected token `>’
./scriptvms.sh: line 34: ` idvm=`xe vm-snapshot vm=${vmname} new-name-label=${vmname}_snapshot` &>> /var/log/backup/vms/bkpvms-${dataarq}.log’
Será que poderia me ajudar, são 4 vms pra backupear, alterei assim:
# Definicao de array ##########################################################$
echo “=========================================================================$
arrayvms=(AD CONSULTA CRONO ZIMBRA)
echo “Servidores a serem backupeados: ${arrayvms[*]}.” >> /var/log/backup/vms/b$
esta certo???
mudou o erro .. usei 2> /dev/null e a mensagem de erro do tail parou de aparecer ..
Segue log do novo erro:
==============================================================================
Servidores a serem backupeados: SERVER.
==============================================================================
Iniciando backup da vm SERVER em 18-10-2018_11-53-46
1) Cria snapshot da maquina em Thu 18 Oct 2018 11:54:46 AM BRT.
The SR backend does not support the operation (check the SR’s allowed operations)
sr: a7a3d7ed-c825-3596-477c-8ed3355a6483 (Removable storage)
Id Snapshot criado: 3ea3a27a-ca9f-d0ef-0f5e-cdadf5080f10
Executou com sucesso.
——————————————————————————
2)Convertendo o snapshot criado em template em Thu 18 Oct 2018 11:54:49 AM BRT.
Executou com sucesso.
——————————————————————————
3)Convertendo o template em VM em Thu 18 Oct 2018 11:54:49 AM BRT
Problemas na execução, verifique o arquivo de log.
==============================================================================
pode ajudar?
Ei Anderson boa tarde!
Desculpe a demora em lhe responder, estou envolvido em um projeto que está me consumindo.
Mas vamos lá:
1) A dica que ti dou é utilizar o Script de Multiplas VMs que também tem no site. Através dele você pode fazer backup de uma ou varias VMs. Link: https://rafaelit.wordpress.com/2017/04/25/script-de-backup-a-quente-de-multiplas-vms-no-xen-server-7/
2) Sobre o problema de disco truncado de uma olhada neste artigo, criei justamente para resolver esse tipo de problema. link: https://rafaelit.wordpress.com/2017/04/27/removendo-disco-virtual-attached-to-control-domain-no-xen-server/
3) No artigo de múltiplas VMs tem o link do arquivo para baixar e não esta quebrado.
Qualquer coisa da um toque aqui, fico feliz em poder contribuir em algo. Abr.
Att,
Resolvi a mensagem Error: Multiple matches VMs found. Operation can only be performed on one VM at a time excluindo os Snapshots existentes.
Na sequencia recebo a mensagem tail: /var/log/backup/vms/bkpvms-18-10-2018.log: file truncated
.. alguém consegue ajudar?