Sincronizando o pendrive automaticamente toda vez que conectar a máquina

Existem tarefas que fazemos rotineiramente e que poderiam ser automatizadas para deixar-nos livres alguns minutos. Uma destas coisas é o backup do seu pendrive e embora o procedimento que eu mostro aqui seja funcional no Linux apenas, vou deixar umas dicas para quem quiser fazer no Windows também, de forma fácil.

Introdução (pule isso se quiser)

Atualmente os pendrive substituem os nem um pouco saudosos disquetes – coisas da evolução tecnológica. Desde então é comum gravarmos coisas neste dispositivo e usá-lo em tudo quanto é PC e atualmente até em outros equipamentos como rádios, HomeTeather, TV, DVDplayer etc com uma conexão USB para uso destes “gadgets”.

A grande vantagem é que eles gravam muito mais arquivos e com tamanhos maiores do que seus equivalentes do século passado. O seu maior problema é seu tamanho físico cada vez menor, claro que isso é uma vantagem também, já que você pode transportá-lo para qualquer lugar, mas também é um convite aos esquecidos largarem-no perdido em algum canto onde nunca mais vão encontrá-lo e ai, aquela sua planilha com as vendas do mês, aquelas fotos da galera que você já apagou da câmera etc estão todas perdidas.

Alguém poderia lembrar: “Você deveria ter feito o backup”. Mas sejamos sinceros, por mais ciente disso que você seja, backups são chatos de se fazer e se não for algo automatizado, dificilmente eles serão feitos com a devida frequência. Claro que existem excessões a esta regra e há pessoas que realizam backup manualmente de tudo sem reclamar. Certamente que eu não sou uma destas, tanto que  o meu último backup do desktop por exemplo eu fiz no mês passado e de lá pra cá muita coisa mudou em minhas pastas “Documentos”, “Fotos” e outras.

Pendrive x Rede

Atualmente eu lido com quatro computadores diferentes (todos com Linux/Ubuntu) Dois no trabalho e dois em casa. Embora estas máquinas estejam em uma rede o que permitiria a transferência de arquivos entre elas facilmente, caso eu vá a casa de uma amigo e ele queira me passar algum arquivo, certamente que a máquina dele não estará em nenhuma das minhas redes então,ou ele grava em um CD/DVD, ou no meu pendrive.

Diante disso (e se pararmos para pensar mais um pouquinho) vamos concluir que para manter nossos arquivos sincronizados entre várias máquinas é mais interessante usar um pendrive do que uma rede.

Faz algum tempo que percebi isso e adotei o uso do pendrive para manter os meus arquivos sincronizados entre meus dois notebooks e dois desktops. Mas desde então eu passei a salvar meus arquivos no “aparelhinho” e sempre que ia trabalhar em uma determinada máquina eu o conectava a uma porta USB livre, criava uma pasta no desktop, com a data/hora daquela operação e fazia uma cópia do seu conteúdo para aquela pasta, assim, mesmo que eu perdesse o pendrive eu teria uma cópia do conteúdo salvo pela última vez na máquina que estava trabalhando. Isso era um procedimento manual, porco, … mas funcionava! Até que me entediei disso.

Automatizando

Tem algum tempo que decidi que tudo que se tornasse rotineiro em minhas atividades no computador deveria ser automatizado. O backup do meu pendrive não poderia ser diferente, então após muito pensar sobre as alternativas para isso cheguei a três soluções distintas:

CRON

Eu poderia agendar no cron, o agendador de tarefas do Linux, uma rotina que testaria se o pendrive estava plugado e copiasse o seu conteúdo para uma pasta de backup. Seria simples prático e funcional mas, pra ser honesto, essa não era a solução que poderia se chamar de perfeita.

UDEV

Qualquer distribuição Linux atual tem um recurso chamado UDEV o qual não vou entrar  no mérito de descrevê-lo, já que não é meu objetivo, mas em resumo o que isso faz é emitir um aviso toda vez que ocorre um evento no sistema. Por exemplo, quando você conecta um dispositivo USB em sua máquina, um evento destes ocorre e dispara um script/programa definido em um arquivo de regras previamente preparado para este fim.

Este seria o método ideal já que além de mais seguro, poderia preparar o sincronismo para ocorrer apenas nas máquinas em que isso fosse interessante pra mim, mas além de ter que pesquisar um pouco mais sobre o assunto, eu teria o trabalho de criar estas regras e copia-las para as máquinas em questão, o que consumiria mais tempo para ser feito adiando mais ainda a automatização desta tarefa. Talvez um dia eu veja esta questão com mais carinho, mas por hora ela vai ficar na minha lista de “projetos futuros”.

Autorun

Um recurso que existe tanto no Windows, quanto nos ambientes gráficos do Linux é o “autorun”. Apesar dele ser comumente usado em CDs para disparar um instalador, menu etc, ao colocá-lo no drive, na verdade você pode usá-lo em qualquer dispositivo de armazenamento. O funcionamento e implementação deste recurso é bem simples: Você cria um determinado arquivo na raiz do seu dispositivo (pendrive, disquete, HD etc) e toda vez que este dispositivo for montado o script/programa definido será executado.

Ao lembrar dele eu achei uma solução para o meu problema. Bastava criar um shell-script que copiasse o conteúdo do pendrive para uma pasta de backup em minha máquina. Não poderia ser mais fácil que isso, poderia?

Apesar de fácil, é importante lembrar que no Linux não se pode sair executando scripts de qualquer jeito. Devido as políticas de restrição de execução de arquivos e do próprio sistema de arquivos, você pode não conseguir exito com esta alternativa. Por exemplo os sistemas FAT e NTFS usados em pendrives formatados pelo windows costumam não executar o autorun a menos que eles sejam devidamente montados com parâmetros específicos para permitir tal façanha.

Fazendo na prática

Como já disse o procedimento e os scripts são simples. Caso você pretenda fazer o backup do pendrive a partir do Windows, precisará criar dois arquivos: autorun.inf e autorun.bat; Para Linux criamos apenas um: autorun.sh

O conteúdo destes arquivos são o que seguem abaixo:

No Linux

Basicamente o seu arquivo autorun.sh deve ter o seguinte conteúdo:

#!/bin/bash
DATA=$(date +%Y%m%d-%H%M)
NOME="pendrive"
DESTINO=${HOME}/backups/${NOME}/${DATA}
mkdir -p ${DESTINO}
cp -R * ${DESTINO}

Veja que o que estou fazendo nada mais é do que criar uma pasta onde o backup será armazenado e em seguida copiando todo o conteúdo para esta pasta. A partir de agora toda vez que você plugar o pendrive em qualquer máquina com Linux você será solicitado a decidir se quer ou não executar o script que fará o backup. Caso responda de forma positiva o script será disparado.

Caso o seu pendrive esteja formatado como FAT, ou NTFS você poderá ter problemas de permissão para executar o script (vide observação dada anteriormente), caso ele esteja formatado como ReiserFS, ext3 etc você deverá dar permissão de execução para este script e está prontinho.

Outro detalhe é que você pode substituir o comando cp pelo tar, por exemplo, para criar um backup compactado, ou então usar o scp, para copiar para outra máquina via ssh. Vale a sua criatividade. Divirta-se!

OBS: AO INVÉS DE USAR ESTE SCRIPT RUDIMENTAR, CONTINUE LENDO O ARTIGO. VOCÊ PROVAVELMENTE GOSTARÁ MAIS DO OUTRO QUE ESTÁ LÁ EMBAIXO. 🙂

Ei! Eu uso Windows…e ai?

Como disse, no Windows precisamos de dois arquivos. Então a partir do bloco de notas, crie o primeiro arquivo com o nome “autorun.inf” e com o seguinte conteúdo:

[autorun]
open=autorun.bat

O segundo arquivo, chamado autorun.bat BASICAMENTE PODERÁ SER PARECIDO com seguinte conteúdo:

@echo off
set NOME="pendrive"
set DESTINO="C:\Document and settings\Shared Documents\backups"
mkdir %DESTINO
xcopy /s * %DESTINO

AVISO: Vale lembrar que tem muito tempo que não uso Windows, então este script deve ser TESTADO quanto a sua eficácia. Veja ainda que ele não cria pastas com data/hora para criar vários backups. Como está vocÊ terá apenas um backup – o que é melhor do que nada, mas se eu fosse você procurava um jeito de melhorá-lo.  Há um jeito de salvar a data/hora atual em uma variável e usar isso como nome das pastas  no Windows (da mesma forma como fiz no Linux) mas não me recordo como eu fazia isso (acho que estou purificado 🙂 ), então ficará a seu critério implementar isso já que é você quem usa Windows, e não eu. 😛

Considerações sobre segurança

Antes de cantar vitória pelo achado, caso você use Windows, é bom lembrar que que existem questões de segurança a serem conhecidas e você precisará lembrar delas SEMPRE. Imagine então que você plugue o seu pendrive na máquina daquele seu vizinho pervertido só para copiar algumas fotos do pagode do Sábado passado.

As seguintes implicações devem estar em sua mente:

Questão 1: Quando plugar o pendrive, o Windows do seu amigo poderá executar o script automaticamente e copiar todo o conteúdo de seu pendrive para a máquina dele.

Solução: Após ejetar o pendrive, assegure-se de olhar o caminho onde os arquivos deveriam ser armazenados em um backup normal. Se houver algo lá apenas apague-os sem mandar para lixeira (clique na pasta, SHIFT-DEL)

Questão 2: Atualmente existem vários worms e trojans que se utilizam deste recurso para se espalhar em maquinas com Windows, sabendo disso, em um destes “remendos” que a Microsoft lançou com o pomposo nome de “Service Pack” ela alterou este procedimento, impedindo que o script execute diretamente, passando a ser feita uma pergunta, em que você deverá dizer se quer abrir o pendrive para navegar nas pastas, ou executar o script.

Solução: Caso isso ocorra (o que é bom), na máquina do seu amigo, nunca escolha executar o script. Mas caso o faça por engano, proceda como explicado antes e apague os arquivos.

Questão 3: Ainda com relação aos trojans e worms, eles poderão mudar o comportamento explicado acima e o Windows voltar executar o programa automaticamente, o que vale lembrar a solução anterior, mas além disso estes worms e trojans podem ainda mudar o arquivo autorun.inf de forma que, ao plugar o pendrive em outra máquina, ele executará o arquivo do worm/trojan infectando esta máquina também.

Solução: Não há uma solução única para isso, mas segue algumas:
– Nunca aceite a opção de executar o script (o que invalida o seu sistema de backup automatizado)
– Nunca use o seu pendrive em máquinas que você não conhece a capacidade do dono em manter-se seguro
– Não use Windows (minha preferida 🙂 )

Turbinando o script de backup no Linux

No Linux existem muitos caminhos para se chegar ao mesmo lugar. Alguns são fáceis, outros difíceis, outros são divertidos etc. Há caminhos para todos os gostos. O script proposto anteriormente para Linux, embora funcione, é bastante rudimentar, usando alguns recursos especiais podemos ter um sistema de backup muito melhor.

Hardlinks são demais

Hardlink[3,4] é um recurso poderoso disponível em todos os sistemas baseados em posix (Unix, BSD e Linux) que  permite um determinado arquivo estar em dois lugares ao mesmo tempo (esta é a melhor explicação que se pode dar a eles, embora eu ache que muita gente boa vai criticá-la). Imagine que você tenha uma pasta repleta de arquivos e você precisa fazer um cópia destes arquivos, como backup. Em uma cópia normal você duplicará tudo e se aquela pasta consumia 5GB no seu disco você agora estará consumindo 10GB.

Se ao invés da cópia você criasse um hardlink para estes arquivos (não existe hardlink para diretórios) você teria os arquivos duplicados, mas ocupando os mesmos 5GB de espaço. Caso você altere um arquivo qualquer, o hardlink é desfeito e você terá dois arquivos distintos: O original com as suas alterações que você acabou de fazer e o hardlink com o conteúdo do arquivo antes destas alterações (veja que ai eles deixaram de ser um o link do outro).

Este recurso é muito legal para sistemas de backup, já que a cada vez que o seu sistema de backup for executado, apenas os arquivos modificados estarão consumindo espaço. Na prática, isso geralmente se resume a um backup com o tamanho equivalente 30% do que teríamos sem hardlink, o que é está muito bom.

Rsync é o cara

Rsync[5,6] é um utilitário mantido pelo projeto Samba, que permite a transferência/cópia de arquivos de maneira incremental. Sua metodologia baseada na codificação delta[7] permite que apenas as alterações ocorridas em um arquivo sejam transferidas.

Imagine então que você tenha um arquivo de 10Mb a ser copiado. A primeira cópia realizada terá que transferir todos os 10MB do arquivo. Então você altera este arquivo conforme as suas necessidades e precisa substituir a sua copia. Usando o método delta, o programa que realiza a cópia procurará as partes que foram alteradas e enviará apenas elas. Ou seja, caso este arquivo tenha apenas 100KB modificados, apenas este volume de dados será transferido, o que será 100 vezes mais rápido do que transferir todo o arquivo novamente pela maneira convencional que copiaria os 10MB de dados.

Juntando os pedaços

Em testes práticos, imagine você ter 2GB de arquivos no seu pendrive usando uma porta USB que copie arquivos a uma taxa de 12MB/s,  os 2GB seriam transferidos em aproximadamente 170 segundos  (cerca de 3 minutos).

Com o script que listo abaixo, usando hardlinks e ainda a codificação delta, implementada pelo rsync, todo o backup não levará mais do que 1s ou 2s. Talvez uns 10s para jogar bem pra cima. Claro que este tempo poderá variar bastante dependendo do volume de dados alterados, da velocidade da porta etc. Mas uma coisa é certa: Sempre será mais rápido do que usar o método de cópia convencional e ainda com a vantagem da economia espaço.

#!/bin/bash
#
# Realiza o backup incremental deste dispositivo, usando o Rsync para
# sincronizar os dados.
#
#O primeiro backup pode ser demorado dependendo do volume dos dados e da
#velocidade da pota USB do equipamento. As próximas atualizações se
#aproveitarão dos recursos do protocolo Delta do Rsync para agilizar o processo.
#
# Welington Rodrigues Braga - welrbraga[]yahoo.com
# 2009-01-16
#
#Raiz do backup - todos os backup deste dispositivo estarão aqui
#Mude-o confrme sua necessidade. Caso o caminho não exista ele será criado, mas
#certifique-se de possuir permissões suficientes para gravar neste local.
RAIZ="${HOME}/backups/MeuPendrive"

#Data atual - Os backups estarão em diretórios datados
DATA=$(date +%Y%m%d-%H%M)
#Caminho do backup
CAMINHO="${RAIZ}/${DATA}"
#Link para o backup mais recente
RECENTE="${RAIZ}/recente"
#Link para o penultimo backup (usado para sincronizar  os hardlinks)
PENULTIMO="${RAIZ}/penultimo"
#Arquivo temporario de log da transferência
LOGFILE="/tmp/log-${DATA}.log"
#
function eco() {
  if [ "$TERM" == "dumb" ]; then
    TITULO="$@"
    zenity --notification --window-icon=info --text "${TITULO}" && \
    zenity --title "${TITULO}" --info --text "$@" &
  fi
  echo "$@"
}

function showlog() {
  if [ "$TERM" == "dumb" ]; then
    TITULO="Dados sincronizados"
    zenity --notification --window-icon=question --text "${TITULO}" && \
    zenity --question --ok-label="Sim" --cancel-label="Não" --text="Exibir log?" && \
    zenity --title "${TITULO}" --text-info --filename "$1" &
  fi
  echo "${TITULO}"
  cat "$1"
}

{
eco "Iniciando rotina de sincronismo - ${DATA}"
#
echo " - Referenciando o backup anterior"
mv -v ${RECENTE} ${PENULTIMO};
#
echo " - Criando o local para o novo backup"
mkdir -vp "${CAMINHO}";
#
echo " - Atualizando o link para o novo backup"
ln -vfs ${CAMINHO} ${RECENTE};
#
echo " - Sincronizando"
rsync -utlarzpvAEHX --delete --link-dest="${PENULTIMO}" "${PWD}/" "${RECENTE}"
#
echo " - Desfazendo referência ao backup anterior"
rm ${PENULTIMO};
#
echo "Sincronismo concluido"
} >>${LOGFILE}  2>>${LOGFILE}

showlog "${LOGFILE}"

Observe no script que estou usando o zenity para emitir mensagens no ambiente gráfico (gnome), e também abusar do uso de mensagens no notificador do sistema. Caso você use o KDE terá duas alternativas: Instalar o Zenity (e as bibliotecas relacionadas do GTK) ou substituir as chamadas ao zenity pelas correspondentes ao Kdialog.

Se desejar, altere a variável “RAIZ”, no início do script, que define o local onde os backups serão armazenados. Para uso normal em um ambiente Gnome, ou qualquer outro com zenity instalado. Esta é a única linha a ser alterada em todo o script.

Lembrando ainda que para o script funcionar você deve salvá-lo na raiz do seu pendrive com o nome autorun.sh

Conclusão

Depois que conheci o rsync, eu não quero outra coisa para fazer backup. Lá no trabalho estou usando o rsync em modo daemon juntamente com a ferramenta BackupPC para gerenciar as cópias de segurança de 19 servidores. Meu montante de dados total não é muito grande para um ambiente destes (cerca 1TB no máximo), mas os backups diários armazenados por um período de uma semana, usando estes recursos, não ocupam mais do que uns 150GB, sem usar rsync e hardlinks para manter os backups pelo mesmo período seriam necessários 1TB x 7 dias, ou 7TB de espaço só para backup. Como o rsync pode ser configurado em modo deamon e o uso do BackupPC, vai ficar para outro dia, mas idéia é a mesma.

Muita coisa ainda poderia ser melhorada neste script, como por exemplo, ele poderia fazer um sincronismo em duas vias; usar o udev para que fosse executado somente onde eu tivesse interesse, manter os dados no pendrive criptografados etc. tudo isso são possibilidades que não vou abordar, mas fica ai como sugestão para quem quiser.

Caso você queira que ele funcione ao contrário, ou seja, ao ser plugado ele faça o backup da sua máquina para o pendrive é possível apenas alterando a linha:

rsync -utlarzpvAEHX --delete --link-dest="${PENULTIMO}" "${PWD}/" "${RECENTE}"

por:

rsync -utlarzpvAEHX --delete --link-dest="${PENULTIMO}" "${RECENTE}/" "${PWD}"

E por fim, não há um recurso como os hardlinks no Windows (eu acho), mas você poderá usufruir da maravilha do processo delta do Rsync neste ambiente.  Para obter uma cópia do RSync para Windows no Sourceforge com o nome de cwRsync[8], caso seja de seu interesse você pode ver o artigo [9] que exemplifica o uso do cwRsync para fazer backups de máquinas Windows com este utilitário.

Referências

[1] Referências de comandos no Windows – http://www.ss64.com/nt/
[2] Dicas e usos de comandos do Windows para administradores e usuários avançados – http://commandwindows.com/
[3] Hardlinks na Wikipedia – http://en.wikipedia.org/wiki/Hard_link
[4] Bruno Torres.  Entendendo links e links simbólicos – http://brunotorres.net/links
[5] Página oficial do Rsync – http://samba.anu.edu.au/rsync/
[6] Rsync na Wikipédia – http://en.wikipedia.org/wiki/Rsync
[7] Codificação Delta – http://en.wikipedia.org/wiki/Delta_encoding
[8] CwRsync – Implementação do Rsync para ambiente Windows – http://sourceforge.net/project/showfiles.php?group_id=69227&package_id=68081
[9] Dailson Fernandes. Utilizando o RSYNC para fazer backups de servidores e estações Windows – http://www.vivaolinux.com.br/artigo/Utilizando-o-RSYNC-para-fazer-backups-de-servidores-e-estacoes-Windows?pagina=1

11 comentários em “Sincronizando o pendrive automaticamente toda vez que conectar a máquina”

  1. Pingback: Welington via Rec6
  2. Ola muito interessante
    O que estou precisando é ao contrario, faço curso em uma unidade de minha cidade,
    o pc é travado e eles nao disponibilizam o material que fazemos no curso.
    tava pensando nesse script mas quando conectasse o pen drive ele copiava a pasta que fica gravada no pc (cada aluno tem uma pasta) e especificassemos essa pasta no script para o pen drive.

  3. Para familiarizar com o assunto comecei com o primeiro script, mas ele está me retornando a seguinte msg ao executar pelo terminal: mkdir: falta operando

  4. Olá@Rodrigo ,

    Havia um erro de digitação que passou desapercebido naquele script. O erro era os espaços antes e após o sinal “=” nas linhas 3 e 4 e que impediam a correta atribuição dos valores a estas variáveis e que por conseguinte impedia a criação das pastas.

    Em fim, o erro foi corrigido e se você o refizer com estas correções ele deverá funcionar sem problemas.

    Abraços

  5. bom dia, Cara eu to com um problemão aqui no meu pc, eu trabalho em uma fazenda e varias pessoas usam o meu pc, por si so isso ja é um problema , mas o que eu quero fazer mesmo é salvar 10 arquivos que estao em uma pasta no pendrive e ao mesmo tempo no hd do computador. Como eu faço o procedimento para realizar com sucesso esse salvamento. Eu nao estou nem um pouco afim de perder os arquivos que foram salvos no Hd, mas eu preciso de uma sincronização entre hd e pendrive urgentemente. Vc pode me explicar o que devo fazer para resolver o meu problema?? eu li toda a explicação mas ainda nao compreendi profundamente o que deve ser feito.

    abracos.

  6. Boa tarde@Valter ,

    Você não passou detalhes sobre o seu ambiente então presumo que esteja usando Windows. Neste caso não vou poder ajudar em muita coisa pois não trabalho com este sistema há alguns anos.

    Mas para que você não fique completamente perdido deixa eu esclarecer alguns pontos (de maneira um pouco genérica) que você precisa saber, caso já não saiba: Na verdade gravação simultânea em dois discos só ocorreria em uma configuração de discos em RAID o que não é viável entre um disco interno e um pendrive.

    Como esta solução não é viável para você o jeito seria partir para um backup periódico e automático dos seus arquivos. Em sites como o Baixaqui, superdownload etc existem inúmeras ferramentas que se propõe a realizar backups automáticos. Neste caso você só teria que instalar estas ferramentas e configurá-las para realizar o backup dos seus 10 arquivos a cada 1 minuto, 5 minutos ou o menor tempo possível.

    Outra alternativa seria adaptar o arquivo batch que exemplifiquei neste texto para que ele copiasse apenas os seus dez arquivos da pasta no seu PC para o pendrive e em seguida você teria que configurar o Agendador de tarefas do Windows para executá-lo em intervalos curtos.

    É importante lembrar ainda que a vida útil de um pendrive é limitada pelo número de gravações que ele pode receber. Ou seja quando mais vezes você gravar nesta mídia mais rápido ela o deixará na mão.

    A ideia é a mesma para qualquer outro sistema (Mas OS, Linux, Solaris, BSD stc) que você venha a usar (uma ferramenta de backup programado e automático) ou um script executado pelo agente de tarefas do sistema.
    Abç

  7. Encontrei um problema :/

    Quando peço para executar automaticamente, ele diz que não encontrou nenhum programa auto executável. Acredito que seja por eu não conseguir marcar o script como executável no Pendrive (está formatado em NTFS).

    Sabe como resolver esse problema??

  8. Olá @Emanuel Schott ,

    Você esbarrou no problema que eu descrevi no último parágrafo da seção sobre Autorun. Se o sistema de arquivos for NTFS ou FAT, dependendo do seu SO não será possível executar o autorun. Isso ocorre porque o sistema de controle de acessos nestes sistemas de arquivo é bem diferente dos sistemas para Linux.

    De forma genérica, ao montar uma partição pelo modo tradicional (via arquivo /etc/fstab) é possível acrescentar parâmetros que determinam as permissões de todo dispositivo (acredito que para o NTFS também haja esta opção, mas honestamente não conheço, já que há muito tempo que meus discos removíveis são formatados com EXT2).

    Versões antigas do Gnome permitiam também alterar as permissões padrões par dispositivos montados a partir do Nautilus usando o gconf-editor, mas atualmente estou usando o Gnome 3 até onde procurei, infelizmente não achei onde está a maldita opção.

    Para simplificar sugiro que no caso de você não poder formatar o dispositivo para um formato compatível com as permissões do Linux, que você use outro método como o UDEV, ou mesmo o Cron.

  9. Ola amigos. Precisava de um arquivo.bat para recortar uma determinada pasta para um pendrive automaticamente.

    alguém poderia me ajudar ???

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.