Script para backup em pen-drive inicializando automaticamente ao conecá-lo

Iniciado por Ricardo Tiburcio, 23 de Maio de 2009, 20:40

tópico anterior - próximo tópico

Ricardo Tiburcio

Procurando sobre backup no linux encontrei o seguinte script feito pelo Carlos Morimoto
(disponível em http://www.gdhpress.com.br/blog/usando-o-rsync/ e em http://www.guiadohardware.net/tutoriais/backup2/)

#! /bin/sh
mount /dev/sdb1 /mnt/sdb1
rsync -av --delete /var/ /mnt/sdb1/ >> /tmp/rsync.log
rsync -av --delete /home/ /mnt/sdb1/ >> /tmp/rsync.log
rsync -av --delete /etc/ /mnt/sdb1/ >> /tmp/rsync.log
umount /mnt/sdb1
hdparm -S 24 /dev/sdb

Neste exemplo ele usa o comando rsync para copiar as pastas /var, /home e /etc para a pasta  /mnt/sbd1. Esta pasta por sua vez fica numa outra partição do hd, que é montada no início do script e desmontada no final. Feito desta forma o script é ideal para ser rodado automaticamente de tempos me tempos, usando cron por exemplo

O que eu quero é um pouco diferente. Pretendo fazer backups da minha pasta /home num pen-drive, que comprei só pra isso. Sendo assim deixei o script da seguinte forma:

#! /bin/sh
rsync -av --delete /home/ /mnt/media/ >> /home/usuario

Ou seja, removi as linhas de montagem e desmontagem do pen drive, já que este semonta sozinho quando conecto ao computador, e alterei o destino do arquivo de log para aminh pasta de usuário

Também não pretendo colocar este arquivo para rodar automaticamente de tempo em tempos. Ao invés disso queria que o script ficasse no pen-drive e fosse iniciado automaticamente cada vez que eu o inserisse no compuadot. Simplesmente usar o nome autorun.sh para a cópia do script na raiz do pen-drive irá causar este efeito?

Obrigado

Ricardo

Ps.: Não conheço nada de programação em shell script* por isso me desculpo pelo nível um tanto primário das dúvidas

* nem sobre programação em qualquer outra coisa por sinal



raidicar

Para fazer o que deseja é preciso realizar alguns processos, siga-os rigorosamente.
Antes de tudo, instale o zenity: sudo apt-get install zenity

Preste bem atenção Ricardo, sera necessario mexer no sudoers e no gnome-mount, eles são importantes, por isso, não faça nada por conta propria, siga os passos pela ordem no que diz respeito ao sudoers e ao gnome-mount.

Passo 1 - Insira o pendrive.
Passo 1.1 - Crie na raiz do pendrive uma pasta de nome backup, vamos salvar vela os dados.
Passo 1.2 - Abra o terminal.
Passo 2 - De o comando df -h para verificar o local do pendrive, que será /dev/alguma coisa.
Passo 3 - Pegue e guarde o uuid do pendrive com o comando sudo vol_id --uuid /dev/alguma coisa (o paso 2 esta mostrando o dispositivo).
ex: abaixo resultado do comando df-h no meu micro. Dentr os resultados tenho abaixo a linha que corresponde ao meu pendrive de 8gb.
/dev/sdb              7,6G  2,0G  5,7G  26% /media/disk.
o comando para pegar o uuid será sudo vol_id --uuid /dev/sdb, o /media/disk é apenas o caminho onde o pendrive é montado.
4 - É preciso liberar permissão de sudo sem senha ao comando /sbin/vol_id para o usuário que realizará o backup.
4.1 - Para isso, de o comando sudo cp /etc/sudoers /etc/sudoers-old para realizarmos o backup do sudoers.
4.2 De agora o comando sudo nano /etc/sudoers.
Agora, no final do arquivo, insira (sem aspas) a linha "usuario ALL=NOPASSWD: /sbin/vol_id".
Altere "usuario" pelo nome do usuario que fará o backup, no caso, seu nome de usuário.
Agora Pressione Ctrl + O (letra O, de ovo, não é o numero 0) e em seguida a tecla ENTER para salvar e Ctrl + X em seguida para sair.
5 - É preciso criar o arquivo de log, então, de o comando: sudo gedit /var/log/pendrive.log.
Afinal, voce quer ver o resultado, nao quer...
6 - É preciso dar permissão ao arquivo de log, de o comando: sudo chmod 777 /var/log/pendrive.log.
7 - De agora o comando sudo mv /usr/bin/gnome-mount /usr/bin/gnome-mount-old.
8 - De agora o comando sudo gedit /usr/bin/gnome-mount e insira o conteudo informado logo mais abaixo.
Atenção:
Na Linha 3 - Altere UUID-UUID pelo uuid do pendrive adquirido no Passo 3.
Na Linha 4 - Altere usuario pelo nome do usuario que fará o backup.
Na Linha 6 - Coloque o caminho da pasta a ser realizado backup, alterando usuario pelo seu nome de usuário. Como deseja o backup da pasta home, deixe ORIG="/home/".
Na linha 18  - ${MNTDIR}/backup => ${MNTDIR}/ é o pendrive e backup é uma pasta que eu criei de antemão dentro do pendrive. Dentro dessa pasta será salvo is dados especificado na linha 6. Atençao caso queira alterar o destino dos dados no pendrive.
Porem, mantenha a linha 18 alterando apenas o usuario e fazendo backup do conteudo da pasta documentos, se der certo, altere a linha para /home/

Insira o conteudo abaixo:
#!/bin/bash
CMD="/usr/bin/gnome-mount-old"
UUID="UUID-UUID"
USER="usuario"
LOGDIR="/var/log/pendrive.log"
ORIG="/home/usuario/Documentos"
DEVICE="$@"
DEVICE=${DEVICE##* }
U=`echo "$@" | grep 'u '`
if [ -z "$U" ]; then
     $CMD $@
fi
MYUSER=`whoami`
MNTDIR=`mount | grep $DEVICE | awk '{ print $3 }' | head -1`
if [ "$MYUSER" = "$USER" ]; then
       UUID_DEV=`sudo /sbin/vol_id --uuid $DEVICE`
     if [ "$UUID_DEV" = "$UUID" ]; then
             rsync -Cravzpu --delete "${ORIG}" "${MNTDIR}/backup" 2>&1 >> ${LOGDIR} | zenity --progress --pulsate --auto-close --title="Backup" --text="Transferência de dados em Andamento, AGUARDE."
     fi
fi
if [ ! -z "$U" ]; then
     $CMD $@
fi


Agora salve o arquivo e feche.
Agora de o comando chmod +x /usr/bin/gnome-mount.
Agora retire e insira novamente o pendrive e veja o conteudo da pasta backup.
Abra o arquivo /var/log/pendrive.log
Se fez tudo certo, com certeza o resultado foi positivo.

Notas:
Agora sempre que inserir seu pendrive, o backup será efetuado de forma automática, mas isso apenas para o seu pendrive.
Se inserir outro pendrive, nada vai acontecer, isso graças ao uuid que foi inserido no script.
Apenas o seu usuario fara o backup, para isso no script foi definida a condicao if [ "$MYUSER" = "$USER" ], onde $USER foi especificado na linha 4 do script. caso o usuario seja diferente, o pendrive apenas sera montado.
Se quiser realizar o backup em outro pendrive, basta pegar o UUID e inseri-la no script na linha 3.
Se por um acaso formatar o pendrive, saiba que o uuid sera alterado e voce sera obrigado a pegar o novo uuid e corrigi-lo na linha 3 do script.
Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.

Ricardo Tiburcio

Muito obrigado Raidikar. Eu imaginei que precisari de um script no pen-drive. Não tinha idéia de que dava pra mantê-lo no próprio computador. Vou testar e tepasso os resultados aqui

Ricardo

marcospinho

ei tem um jeito de sincronizar o meu pendrive /media/MARCOS com a minha pasta ntfs /media/dados de modo que ele copie os arquivos do pendrive para o computador e substitua somente os arquivos mais recentes nao forçando a copia de arquivos que ja existem?
celeron 2.66Ghz, 1G Ram, DVDrw monitor AOC 17pol, HDsata500g, L-Ubuntu Maverick-i386, /root 20G /home 50G /win 40G /win7 50G /dados 20G /teste(nathy+Kde) 15G /acervo 220G  Linux Counter #478143. Ubuntu counter is # 24448

raidicar

É a mesma coisa Marcos, basta no script alterar o caminho da variavel ORIG que fica na linha 6 e a ordem como é feito o sincronismo.
ORIG seria uma abreviação de origem, então, nesse caso, eu alteraria o nome da variavel ORIG para DEST e a linha 6 ficaria:
De ORIG="/home/usuario/Documentos" para DEST="/media/dados/"
Por consequencia, inventendo a ordem de execução do sincronismo, o conteúdo do mesmo teria a linha 18 alterada para:
rsync -Cravzpu "${MNTDIR}/" "${DEST}" >> ${LOGDIR} 2>&1
De resto, nada muda.
Repare que o parametro --delete foi removido do rsync para que dessa forma os arquivos
Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.

raidicar

Só uma coisa que não tinha pensado em acrescentar até que um colega levantou no fórum uma duvida sobre o zenit. É possível acrescentar uma janela gráfica quando o backup é executado. Veja imagem: http://br.geocities.com/reimlima/zenity12.png
Para o Ricardo, a linha 18 do script ficaria assim:
rsync -Cravzpu --delete "${ORIG}" "${MNTDIR}/backup" 2>&1 >> ${LOGDIR} | zenity --progress --pulsate --auto-close --title="Backup" --text="Transferência de dados em Andamento, AGUARDE!!!"

Para o Marcos, a linha 18 do script ficaria assim:
rsync -Cravzpu "${MNTDIR}/" "${DEST}" >> ${LOGDIR} 2>&1 >> ${LOGDIR} | zenity --progress --pulsate --auto-close --title="Backup" --text="Transferência de dados em Andamento, AGUARDE!!!"
E também cuidado com o rsync, cuidado com as opções escolhidas, como a --delete que o Ricardo utiliza.
Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.

Ricardo Tiburcio

Na verdade esta é uma outra dúvida minha. A opção --delete irá remover do backup os arquivos que eu remover da pasta original certo? Como ficam, or exemplo, arquivos que forem renomeados na pasta original, se esta opção for usada?

Ricardo Tiburcio


clcampos

Citação de: Ricardo Tiburcio online 11 de Junho de 2009, 23:35
Mais uma dúvida (de leigo): o que é o Zenite?

Vá no terminal e digite man zenity ou zenity --help que você terá uma explicação mais detalhada, mas o zenity é um comando que permite criar dialogos gráficos com o usuário durante um shell.

Na internet também tem bons sites sobre isso.
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

raidicar

Citação de: Ricardo Tiburcio online 11 de Junho de 2009, 23:29
Na verdade esta é uma outra dúvida minha. A opção --delete irá remover do backup os arquivos que eu remover da pasta original certo? Como ficam, or exemplo, arquivos que forem renomeados na pasta original, se esta opção for usada?
Exatamente, o --delete removerá os arquivos do backup que não mais existirem na pasta original.
Obviamente, se você renomear o arquivo na pasta original, ao efetuar a sincronização (por que é isso que o rsync faz), o arquivo renomeado na pasta original vai para o backup e, no backup, o arquivo que, agora tem outro nome na pasta original, é removido.
Vejá bem, o rsync trabalha com o nome e as datas dos arquivos, se o arquivo é alterado na origem, no momento de rodar o rsync, ele não vai interpretar que o nome foi alterado, ele simplesmente vai verificar que o arquivo que está no backup não possui nenhum nome correspondente na pasta original e simplesmente vai remove-lo.
É por isso que eu não costumo utilizar esse parâmetro, pois backup também é útil naqueles casos onde alguém exclui sem querer um arquivo e ai, não tem mais volta.
Se o backup fica grande demais, eu armazeno em algum lugar e recomeço novamente.
com relação ao zenity, o clcampos já disse tudo, digite no terminal o comando zenity --info --text "O que é zenity" e vai entender, agora, como funciona é só seguir o conselho e vasculhar na net, exemplo tem de monte.
Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.

Ricardo Tiburcio

Entendi. Sem a opção --delete os arquivos apagados na pasta original irão permanecer no backup. Bem útil para apagamentos acidentais ou equivocados.
Quanto ao zenity, achei muito interessante a possibilidade de interagir com o usuário do script sem precisar da linha de comando. Mais uma coisa legal para estudar.