Backup de Máquinas Virtuais
Objetivo
Configuração dos scripts para backup das Máquinas Virtuais alocadas na Nuvem.
Requisitos de Software
Nuvem privada instalada com máquinas virtuais em produção.
Procedimentos
Montando a partição iSCSI
Será montado uma partição iSCSI para gravação dos arquivos de backup das MV.
- Para backup utilizaremos um volume iSCSI montada no diretório /backup_storage:
Descobrir os compartilhamentos iSCSI:# iscsiadm -m discovery -t st -p 192.168.0.100
Ver os nós capturados:# iscsiadm -m node
- Conectar o node desejado:
# iscsiadm -m node --targetname "iqn.2001-05.com.equallogic:0-8a0906-dea03ab06-2c30000000c4d9df-xxxxx" --portal "192.168.0.100:3260" --login
- Verificar a partição criada:
# fdisk -l
- Criar uma partição primaria ocupando todo o espaço:
# fdisk /dev/sdc
- Formatar a partição criada:
# mkfs.ext3 /dev/sdc1
- Criar o direrório /backup_storage.
- Montar a partição no diretório.
Automatizar a montagem da partição
Para deixar automático a montagem da partição, seguir os procedimentos:
- Editar o arquivo /etc/iscsi/iscsid.conf e configurar a opção node.startup para "automatic":
node.startup = automatic
- Ligar o open-iscsi na inicialização:
# chkconfig open-iscsi on
Ou:
# insserv open-iscsi
- Alterar a configuração do node para iniciar automaticamente:
# iscsiadm -m node --targetname iqn.2001-05.com.equallogic:0-8a0906-dea03ab06-2c30000000c4d9df-xxxxx --portal 192.168.0.100:3260 -o update -n node.s tartup -v automatic
- Parar e inicializar o serviço iscsi:
# /etc/init.d/open-iscsi stop
# /etc/init.d/open-iscsi start
- Criar uma etiqueta(label) para a partição criada a partir do compartilhamento:
# e2label /dev/sdd1 iscsi001
- Ediar o /etc/fstab e incluir a montagem do label para o diretório:
LABEL=iscsi001 /backup_storage ext3 _netdev 0 0
Script de backup
O script foi escrito com base nas referências abaixo e alterado de acordo com a necessidade.
-
O script a seguir faz backup completo das máquinas virtuais que compõem a nuvem. Tanto as que estão funcionando, quanto as paradas, suspensas, ou cópias.
Foi utilizado o diretório /backup para conter o script.
- Criar o script backup.sh no diretório /backup:
# vi backup.sh
- Exemplo de arquivo de backup:
#!/bin/bash #Programa de criacao de backup de VMs #update: 23/12/2010 echo "Programa de backup VM" echo " " dadosfull(){ # diretorio que sera feito backup destino="/backup_storage/" # nome do arquivo nome_saida=" VM.xva" #data de inicio backup data=$(date +%d-%m-%Y-%H.%M) # Iniciando Log echo "Iniciando Backup das VMs: $data" >> /backup/live_backup_vm.log echo "------------------------------------------" >> /backup/live_backup_vm.log echo " " >> /backup/live_backup_vm.log } listavm(){ # VMs para realizar Backup vm_backup_list=() vm_backup_list_count=${#vm_backup_list[@]} # Listando as Maquinas Virtuais vm_list_string=`xe vm-list is-control-domain=false power-state=running` #vm_list_string=`xe vm-list is-control-domain=false` IFS=" " vm_list_array=($vm_list_string) vm_list_count=${#vm_list_array[@]} cont=0 index=0 for line in ${vm_list_array[@]}; do if [ ${line:0:4} = "uuid" ]; then uuid=`expr "$line" : '.*: \(.*\)$'` label=`expr "${vm_list_array[cont+1]}" : '.*: \(.*\)$'` echo "Adicionada ao backup: $label" let "index = $index+1" fi # Incrementa contador let "cont = $cont+1" done # Criando arrays para utilizacao vm_uuid_array=() vm_label_array=() } getvm(){ # Pegando as VM da lista para exportacao echo "Analisando a lista de VMs..." >> /backup/live_backup_vm.log #Contador cont=0 index=0 for line in ${vm_list_array[@]}; do if [ ${line:0:4} = "uuid" ]; then uuid=`expr "$line" : '.*: \(.*\)$'` label=`expr "${vm_list_array[cont+1]}" : '.*: \(.*\)$'` vm_uuid_array[index]=$uuid vm_label_array[index]=$label echo "Added VM #$index: $uuid, $label" >> /backup/live_backup_vm.log let "index = $index+1" fi # Incrementa contador let "cont = $cont+1" done echo "Analise da Lista de VMs concluido..." >> /backup/live_backup_vm.log echo " " >> /backup/live_backup_vm.log } backupvm(){ # Backup VMs echo "Backup VMs" >> /backup/live_backup_vm.log echo " " >> /backup/live_backup_vm.log #Contador cont=0 for uuid in ${vm_uuid_array[@]}; do # Setando o estado da maquina backup_vm=false # Se a lista de Backups estiver vazia if [ $vm_backup_list_count = 0 ]; then # Faca backup de todas a Maquinas backup_vm=true # Senao, verifica se a maquina esta na lista de backups else for backup_uuid in ${vm_backup_list[@]}; do if [ $uuid = $backup_uuid ]; then backup_vm=true break fi done fi # Se o backup for para ser realizado if [ $backup_vm = true ]; then # O processo e iniciado echo "VM: $uuid" >> /backup/live_backup_vm.log # Label label=${vm_label_array[cont]} echo " " echo "Backup VM: $label" echo " " # Cria snapshot echo "Criando Snapshot..." >> /backup/live_backup_vm.log # Se contiver os drivers de VSS instalado snapshot=`xe vm-snapshot-with-quiesce vm=$uuid new-name-label="$label-backup-$data" &> /dev/null` log="Snapshot com quiesce" # Senao faz snapshot sem quiesce if [ $? -eq 0 ]; then snapshot=`xe vm-snapshot vm=$uuid new-name-label="$label-backup-$data"` log="Snapshot sem quiesce" fi echo $log echo $log >> /backup/live_backup_vm.log echo "Snapshot: $snapshot" >> /backup/live_backup_vm.log # Seta a VM para n?o ser um Template echo "Setando para nao ser um Template..." >> /backup/live_backup_vm.log snapshot_template=`xe template-param-set is-a-template=false uuid=$snapshot` # Deleta VM antiga echo "Deletando backup antigo..." >> /backup/live_backup_vm.log echo " " echo "Deletando backup antigo..." echo " " deletou=`rm -rf "$destino$label-backup.xva"` # Exporta echo "Exportando VM..." >> /backup/live_backup_vm.log echo "Exportando VM..." echo #snapshot_export=`xe vm-export vm=$snapshot filename="$destino$label-$data$arq_saida"` snapshot_export=`xe vm-export vm=$snapshot filename="$destino$label-backup.xva"` echo "Exportado: $snapshot_export" >> /backup/live_backup_vm.log # Apaga snapshot echo "Deletando Snapshot..." >> /backup/live_backup_vm.log snapshot_delete=`xe vm-uninstall uuid=$snapshot force=true` echo "Deletado: $snapshot_delete" >> /backup/live_backup_vm.log # Se o backup nao for para ser realizado else # Log echo " " >> /backup/live_backup_vm.log echo "VM: $uuid" >> /backup/live_backup_vm.log echo "Backup de aquina Virtual Ignorado!" >> /backup/live_backup_vm.log fi # Incrementa contador let "cont = $cont+1" done echo " " >> /backup/live_backup_vm.log echo "Backup realizado com sucesso!!!" >> /backup/live_backup_vm.log echo "Backup realizado com sucesso!!!" data=$(date +%d-%m-%Y-%H.%M) # Finalizando Log echo "Finalizando Backup das VMs: $data" >> /backup/live_backup_vm.log echo "--------------------------------------------" >> /backup/live_backup_vm.log echo " " >> /backup/live_backup_vm.log } enviaemail(){ #Envia email tail -n 6 /backup/live_backup_vm.log | mail -r "backup@hc.ufpe.br" -s "Backup VM: $DATA" leandro.caetano@hc.ufpe.br } #Chamada das Funcoes dadosfull listavm getvm backupvm #enviaemail exit 0
- Para executar o script:
# sh backup.sh
- Para executar diariamente inserir no agendamento:
# crontab -e
1 0 * * * sh /backup/backup.sh
Serão criados arquivos de backup no diretório backup_storage. Para automação do script configura-lo no cron.
Ativando o servidor NFS no XenServer
Para facilitar o uso dos arquivos de backup em outros servidores (recuperação de backup por exemplo), vamos ativa o servidor de NFS que ja acompanha o XenServer.
Configurando o NFS
- Configurando o diretório /backup_storage para ser exportado:
# vi /etc/exports
Conteúdo:/backup_storage *(rw,async,no_root_squash)
- Fixar as portas do NFS para não serem aleatórias e poderem ser tratadas pelo firewall. Alterar o arquivo /etc/sysconfig/nfs:
LOCKD_TCPPORT=32803 LOCKD_UDPPORT=32769 MOUNTD_PORT=892 RQUOTAD_PORT=875 STATD_PORT=662 STATD_OUTGOING_PORT=2020
- Inicializar os serviços na inicialização do sistema:
# service portmap start
# service nfs start
# chkconfig portmap on
# chkconfig nfs on
- Editar o arquivo /etc/rc.d/rc.sysinit e adicionar no final a seguinte linha:
modprobe nfsd
- Listar as monstagens:
# showmount -e localhost
Se aparece a mensagem "RPC: Port mapper failure - RPC: Unable to receive" em vez do ponto de montagem editar o arquivo /etc/sysconfig/portmap conforme abaixo:
PMAP_ARGS=""
Configurando o Firewall
- Adicionar as seguintes regras no arquivo /etc/sysconfig/iptables. Elas tem que ser inseridas após a regra "-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT":
-A RH-Firewall-1-INPUT -s 10.225.1.0/24 -m conntrack --ctstate NEW -p udp --dport 111 -j ACCEPT -A RH-Firewall-1-INPUT -s 10.225.1.0/24 -m conntrack --ctstate NEW -p tcp --dport 111 -j ACCEPT -A RH-Firewall-1-INPUT -s 10.225.1.0/24 -m conntrack --ctstate NEW -p tcp --dport 2049 -j ACCEPT -A RH-Firewall-1-INPUT -s 10.225.1.0/24 -m conntrack --ctstate NEW -p tcp --dport 32803 -j ACCEPT -A RH-Firewall-1-INPUT -s 10.225.1.0/24 -m conntrack --ctstate NEW -p udp --dport 32769 -j ACCEPT -A RH-Firewall-1-INPUT -s 10.225.1.0/24 -m conntrack --ctstate NEW -p tcp --dport 892 -j ACCEPT -A RH-Firewall-1-INPUT -s 10.225.1.0/24 -m conntrack --ctstate NEW -p udp --dport 892 -j ACCEPT -A RH-Firewall-1-INPUT -s 10.225.1.0/24 -m conntrack --ctstate NEW -p tcp --dport 875 -j ACCEPT -A RH-Firewall-1-INPUT -s 10.225.1.0/24 -m conntrack --ctstate NEW -p udp --dport 875 -j ACCEPT -A RH-Firewall-1-INPUT -s 10.225.1.0/24 -m conntrack --ctstate NEW -p tcp --dport 662 -j ACCEPT -A RH-Firewall-1-INPUT -s 10.225.1.0/24 -m conntrack --ctstate NEW -p udp --dport 662 -j ACCEPT
- Reiniciar o servidor para que o mesmo mude as portas do NFS, ative os serviçoes e o firewall
Restaurando Backups
- Colocar o volume online no storage
- No pool-master, montar a partição:
# iscsiadm -m discovery -t st -p 192.168.0.100
# iscsiadm -m node
# iscsiadm -m node --targetname "iqn.xxxxx" --portal "192.168.0.100:3260" --login
# fdisk -l|grep Disk
# mount /dev/sdx /mnt
- Entrar no diretório montado, e importar a VM com o seguinte comando:
# xe vm-import filename="Nome do arquivo" sr-uuid="UUID do SR dos discos do pool"
- Após o término da cópia, desmontar o diretório e deslogar o iscsi:
# umount /mnt
# iscsiadm -m node --targetname "iqn.xxxxx" --portal "192.168.0.100:3260" --logout
- Terminado o processo, colocar o volume de backup offline de novo.
Referências