Hamacker’s Palace

7 de Abril de 2008

Backup com unidades usb externas

Arquivado em: GNU/Linux, ubuntu — hamacker @ 11:55

(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.

9 Comentários »

  1. 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 | Responder

  2. 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 | Responder

  3. 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 | Responder

  4. 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 | Responder

  5. [...] por hamacker (sirhamackerΘgmail·com) – referência [...]

    Pingback por Backup com unidades USB externas — 8 de Abril de 2008 @ 11:40 | Responder

  6. 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 | Responder

  7. 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 | Responder

  8. Não só os — como as “” também.

    Script bacana, à propósito.

    []

    Comentário por Nighto — 12 de Abril de 2008 @ 19:34 | Responder

  9. 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 | Responder


Feed RSS dos comentários deste post URI do TrackBack

Deixe um comentário

Blog no WordPress.com.