(Novamente o wordpress tá transformando – - seguidos nisso aqui : –, por isso, se houver erros no script atente-se que voce pode estar copiando e colando algo diferente do que planejei).
Certamente um dos maiores atrativos de se usar discos usb’s externos é a realização de backup, isto é, cópia de segurança. Dentro de empresas, não há nada melhor. Os tapes, é claro tem seu lugar ao sol, especialmente para aqueles que tem que guardar backups diários no modo completo (full) ou diferencial por toda vida útil. Para aqueles que preferem um backup incremental, ou mesmo para arquivar mídias como filmes, músicas e afins, o backup em disco usb externo é insuperável, mesmo o pendrive com 4GB já dá para fazer bastante coisa.
Apesar dessas vantagens, no linux, muita gente faz a cópia do modo trivial, isto é, abre um gerenciador de arquivos e copia os arquivos dum local origem para a unidade usb destino. Isto não está errado, porém dependendo do tamanho do local de origem a ser copiado é melhor esperar sentado, pois vai demorar. Um outro problema para esse tipo de solução é a falha humana para quem tem de lidar com mais de uma unidade de disco usb, a chance de ocorrer num daqueles dias de ressaca a inversão dos discos pode ser fatal e deve ser evitado a qualquer custo. Mas será que há como evitar esses problemas ? Sim, há.
Compreendendo a solução
Programas para a realização de backup já existem, inclusive com interfaces gráficas. Mas se você quer fazer um backup do seu jeito e com características pessoais ou da sua empresa então talvez a melhor solução seja programar. “Ah, mas eu não sou programador !” – talvez você diga, calma espere. A programação é algo simples, um simples script-bash resolve e vou detalhar como fazê-lo.
Para resolver o problema de não ter que copiar todos os arquivos de uma única vez e sempre, vamos usar o rsync, um utilitário que existe em praticamente em todos os sistemas, este utilitário é capaz de fazer um backup incremental onde copiaria apenas os arquivos que modificaram desde o ultimo backup e com a possibilidade de sincronizar entre origem e destino até mesmo as exclusões.
Para evitar que façamos o backup na unidade de disco usb errada, podemos usar o UUID que cada um desses discos possuem em sua tabela de particionamento. Para você entender melhor, cada partição do disco possui um volume de identificação (volume-id) que em nosso sistema linux vai chamar-se UUID. Quando particiona um disco, essa nova partição (ou volume) recebe um UUID novo que raramente será igual a de outro, é quase um SERIAL NUMBER. Isto pode ser utilizado de diversas formas a seu favor. Você deve lembrar-se que antigamente os discos recebiam uma sequencia em função da ordem dos discos, particionamento e dos jumpers, assim se estivesse rodando um Sistema Operacional que foi inicialmente instalado no HD-0 como master, este sistema poderia não funcionar se mudássemos essa ordem. No Windows eu tinha um problema com discos externos, pois dependendo da porta USB onde eu plugasse, a letra do drive poderia ser diferente. No Debian de versões atrás também era assim, dependendo donde plugava era sdc, sdd,… Hoje, no linux usando o UUID evitamos esse problema porque o UUID do disco é mais relevante que a localização(ou ordem) física desse dispositivo. Usando o UUID podemos evitar que backups de segunda-feira venham parar no disco de terça-feira por exemplo.
Mão na massa
Abra o terminal do seu sistema linux e plugue o disco usb em seu sistema, se quiser experimentar com o pendrive pode faze-lo também. No terminal digite :
$dmesg
O resultado será algo como :
(...) [ 3079.250948] scsi 6:0:0:0: Direct-Access SAMSUNG HM121HI PQ: 0 ANSI: 2 CCS [ 3079.258015] sd 6:0:0:0: [sdc] 234441648 512-byte hardware sectors (120034 MB) [ 3079.258711] sd 6:0:0:0: [sdc] Write Protect is off [ 3079.258716] sd 6:0:0:0: [sdc] Mode Sense: 00 38 00 00 [ 3079.258720] sd 6:0:0:0: [sdc] Assuming drive cache: write through [ 3079.259834] sd 6:0:0:0: [sdc] 234441648 512-byte hardware sectors (120034 MB) [ 3079.260473] sd 6:0:0:0: [sdc] Write Protect is off [ 3079.260478] sd 6:0:0:0: [sdc] Mode Sense: 00 38 00 00 [ 3079.260482] sd 6:0:0:0: [sdc] Assuming drive cache: write through [ 3079.260487] sdc: sdc1 [ 3079.833370] sd 6:0:0:0: [sdc] Attached SCSI disk [ 3079.833443] sd 6:0:0:0: Attached scsi generic sg3 type 0
As indicações acima dizem que o dispositivo está atachado e foi reconhecido como [sdc], este é o endereço físico, memorize-o para a próxima seção. Se nada aparecer é porque seu disco não foi reconhecido.
E o UUID ? Execute no terminal :
$ ls -l /dev/disk/by-uuid/ total 0 lrwxrwxrwx 1 root root 10 2008-04-07 06:01 188669D9075BD3E6 -> ../../sda1 lrwxrwxrwx 1 root root 10 2008-04-07 06:01 2C88743C8874071C -> ../../sda2 lrwxrwxrwx 1 root root 10 2008-04-07 09:52 4741-75E1 -> ../../sdc1 lrwxrwxrwx 1 root root 10 2008-04-07 06:01 47c8851f-d196-4d18-bed3-ae7ed353076a -> ../../sda4 lrwxrwxrwx 1 root root 10 2008-04-07 06:01 589dedee-71e8-49ab-a7eb-f8b06c977446 -> ../../sdb1 lrwxrwxrwx 1 root root 10 2008-04-07 06:01 5ecb70c1-57bc-48f4-9226-9de9f7176e0f -> ../../sda3
Na relação acima voce deve procurar o seu disco, lembre-se que o UUID da(s) sua(s) partição(ões) é aquele que iniciar-se com [sdc], portanto só há uma partição :
lrwxrwxrwx 1 root root 10 2008-04-07 09:52 4741-75E1 -> ../../sdc1
O código seqüencial 4741-75E1 é o UUID para a partição usada neste disco (sdc1). Repare que esse UUID está apontando para ../../sdc1. Agora matamos a charada, se eu achar o UUID acho também o /dev/sdc1, isso será útil para montarmos sempre o mesmo disco e evitarmos o erro de troca de unidade.
Criando um script básico para backup usando o UUID
Carregue seu editor preferido e copie para ele as linhas abaixo :
1 #/bin/bash 2 # Script desenvolvido por : 3 # Hamacker <sirhamacker em gmail.com> 4 # Licença : GNU GPL 3 5 # pasta no meu sistema que preciso fazer o backup 6 # o parametro especificado a baixo é o meu HOME" 7 # altere conforme suas necessidades 8 backup_origem="/home/$USER" 9 10 # pode ser unidades remotas também se do outro lado houver 11 # o openssh-server instalado. Ex : 12 #backup_origem="root@192.168.1.2:/home/fulano" 13 14 ### Nem todo tipo de arquivo precisa ir para o backup 15 ### então é uma boa idéia criar um arquivo que possua 16 ### dentro o nome de pastas que deverão ser ignoradas 17 ### Este arquivo pode ter este conteúdo : 18 ### .recycle/* 19 ### /home/fulano/Desktop/* 20 ### /home/fulano/downloads/* 21 ### *.log 22 23 backup_lista_negra="/etc/backup_lista_negra.txt" 24 if ! [ -e "$backup_lista_negra" ] ; then 25 sudo touch $backup_lista_negra 26 fi 27 28 ### meu disco de backup tem sempre o mesmo UUID 29 ### para evitar que eu faça backup num disco errado 30 ### altere o UUID abaixo para o UUID do volume desejado 31 backup_disco="4741-75E1" 32 33 if ! [ -e "/dev/disk/by-uuid/$backup_disco" ] ; then 34 echo "O disco [$backup_disco] não foi encontrado no sistema." 35 exit 2; 36 fi 37 38 ### Onde montaremos nosso disco de backup ? 39 ### altere o caminho abaixo conforme suas necessidades. 40 backup_montagem="/media/backup" 41 42 if ! [ -d $backup_montagem ] ; then 43 sudo mkdir -p $backup_montagem 44 fi 45 46 ### Que pasta deverá ser criada dentro da unidade usb para 47 ### armazenar o backup ? 48 ### Do jeito que esta abaixo o nome da pasta será AAAA-MM 49 ### isto é, ano seguido do mes, porém voce pode alterar para 50 ### algo como : 51 ### backup_subpasta="meus_backups" 52 ### se desejar. 53 backup_subpasta="meus_backups" 54 #backup_subpasta="`date +%Y-%m`" 55 56 ### Nao altera a linha abaixo 57 backup_destino="$backup_montagem/$backup_subpasta" 58 59 ### Tipo de partição usado no volume 60 backup_particao="auto" # serve para ext2, ext3 e vfat 61 62 # Opcoes de montagem 63 # Eu uso o async por ser mais rápido, porém no modo sync 64 # é mais confiável especialmente com pendrives. 65 # Altere conforme suas necessidades, lembrando que cada 66 # tipo de partição pode ter algumas opções que não 67 # funcionam noutro tipo. 68 backup_montagem_opcoes="async,rw,users" 69 70 ### Montando a unidade de destino do backup 71 sudo mount -t $backup_particao /dev/disk/by-uuid/$backup_disco $backup_montagem -o $backup_montagem_opcoes 72 73 ### Realizando o backup com o RSYNC 74 # -r = recursivamente 75 # -p = preservar permissões 76 # -t = preservar a data/hora 77 # -v = verbose, ie. exibe na tela mensagens do que está ocorrendo 78 # -z = para fazer a compressão dos arquivos antes de enviar pela rede. 79 # longos backups sem compressão pela rede é suicidio, especialmente 80 # se houver usarios de sistema sistema remoto com ssh ou X. 81 # Há muitas outras opções que podem se aplicar a backup incremental, 82 # diferencial ou sincronização absoluta, ou aplicar novos sufixos para 83 # pastas, remover arquivos antes ou depois da cópia, etc... 84 # PS: exclude-from logo abaixo é precedido por dois - - juntos e não um único 85 # traço, isso é culpa do wordpress. 86 sudo rsync -rptvz $backup_origem $backup_destino --exclude-from=$backup_lista_negra 87 88 ### Se houve erros então... 89 if [ $? -ne 0 ] ; then 90 echo "backup falhou totalmente ou parcialmente." 91 fi 92 93 # concluido o backup entao desmontar a unidade 94 sudo umount $backup_montagem 95 if [ $? -ne 0 ] ; then 96 # se nao desmontou da 1a tentativa, tentar de novo 97 sudo umount $backup_montagem 98 # se falhou na segunda tentativa entao é melhor avisar 99 if [ $? -ne 0 ] ; then 100 echo "Não foi possivel desmontar a unidade $backup_montagem" 101 echo "Isso terá de ser feito manualmente." 102 fi 103 fi 104 105 echo "Fim do backup"
PS: Eu identei direitinho, mas o wordpress simplesmente suprime os espaços no inicio do paragrafo, arghhh! Ele não fazia isso antes, é a primeira vez. Para solucionar isso, tive que numerar as linhas. Sei que vai lhe dar trabalho para retirar os numeros no inicio, mas se não fizesse isso voce poderia perder a capacidade de concentrar-se no que o script está fazendo linha por linha.
Salve o arquivo acima como backup-fulano.sh e pimba! você vinculou o backup de $backup_origem ao disco com o volume 4741-75E1. Se você é novato com scripts, execute no terminal :
chmod a+x /caminho/para/o/script/backup-fulano.sh e para executar : /caminho/para/o/script/backup-fulano.sh
Com um pouco mais de acréscimos pode-se produzir um log e enviar para o email do administrador, além disso poderá fazer agendamento através do cron. Em especial pode-se fazer com que esse script só funcione para determinados discos evitando erros “a-la-estagiários”, por exemplo : a inversão de backups de dias pares no disco de dias-pares e dias-ímpares no disco de ímpares.
Conclusão
O artigo é apenas para demonstrar o que acontece quando juntamos peças unix como script-bash, rsync e uuid e criamos uma solução nova : cada backup no seu devido disco. Ele foi baseado na minha experiência com bash-scripts, e é garantido o seu funcionamento.
Não foi intento dizer que este tipo de backup é melhor que o outro ou coisa do gênero. Cada um deve fazer o backup do jeito que for melhor, mas para considerar qual é o melhor deverá conhecer um pouco mais das outras opções.
Se quiser incrementar o teu backup utilizando o rsync pra versionar, segue a dica:
http://blog.foscarini.biz/2007/10/backup-versionado-no-linux.html
Lembrando que o sistema de arquivos deve ser de algum tipo nativo Unix, com suporte à hardlinks.
Comentário por Everton — 7 de Abril de 2008 @ 12:12 |
Eu sei que é coincidência, só te passei o link do meu script de backup pro caso de tu ter interesse em incrementar um pouco mais, usando o versionamento.
E quem é o colega que conhecia meu blog? Fiquei até curioso!
Grande abraço!
Comentário por Everton — 7 de Abril de 2008 @ 13:46 |
Putz grilla, é voce mesmo.
Esse negocio de artigo parecer com outro já me causou grandes aborrecimentos, e por essa razão fui as pressas ao link que voce me passou e postei o comentario sem prestar atenção que voce é o próprio autor do blog. Foi mal, desculpa aí.
Comentário por hamacker — 7 de Abril de 2008 @ 14:33 |
Muito interessante a dica, ainda não testei mas já está entre minhas favoritas no del.icio.us.
Comentário por Renato — 8 de Abril de 2008 @ 11:09 |
[...] por hamacker (sirhamackerΘgmail·com) – referência [...]
Pingback por Backup com unidades USB externas — 8 de Abril de 2008 @ 11:40 |
Legal o artigo.
Eu uso um script semelhante há algum tempo pra fazer a mesma coisa.
Uma sugestão, inclua as opções:
-l : Copia os links como links mesmo
–copy-unsafe-links: Se o link estiver fora da arvore, copia o arquivo pra onde aponta
Se o sujeito não quiser fazer um backup de todo o sistema (meu caso), essas opções permitem que seja poupado
espaço mantendo os links que apontam para dentro da árvore de backup que tá sendo copiada.
Os links que apontam para fora não vão ser mantidos. Os arquivos serão copiados na íntegra ;-)
Comentário por Alexandre Zabot — 9 de Abril de 2008 @ 9:07 |
Kra muito loko este script…
Estou criando o sistema de backup aqui da empresa e estava utilizando o cp vou testar agora com o rsync deve ser muito melhor, só queria saber uma coisa, como nao testei ainda, pois estou desenvolvendo eu vou montar um servidor win da rede com o mount e vou copiar uns diretórios dele para o servidor de backup que é linux e contem os discos, vc sabe se é normal isso ou só se utiliza isso em servidores linux???
Comentário por Henrique — 9 de Abril de 2008 @ 9:25 |
Não só os — como as “” também.
Script bacana, à propósito.
[]
Comentário por Nighto — 12 de Abril de 2008 @ 19:34 |
Hamacker,
nas linhas 59/60 você informa que funciona com aqueles sistemas de arquivos. E para XFS??
Abs.
Comentário por Evaristo — 16 de Abril de 2008 @ 16:01 |