27 de outubro de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Copiar arquivos com rsync – até 99% mais rápido!

copiar arquivos com rsync

Vamos pegar o pior caso para exemplificar algumas vantagens de se copiar arquivos com rsync, mas já adianto: Serve para Windows, Linux, Mac, UNIX. Próximo a esse artigo escrevi também sobre interoperabilidade de sistemas com SAMBA e compartilhamento com NFS. Ambos podem ser artigos de interesse, já que estão relacionados.

Suponhamos que você tem um Raspberry. O micro-SD pode ser classe 10, mas continua sendo micro-SD. Daí já sabemos que a vida útil de um micro-SD é curta e corriqueiramente guardamos arquivos no cartão, seja download ou seja programa gerado para usar GPIO etc. Como você copia esses arquivos importantes para outra mídia?

Copiando arquivos para uma mídia externa com rsync

Se você tem um HD/SSD que faz uso para backup através da porta USB, usar o rsync vai agilizar o processo, fazendo cópia apenas da diferença. Isso significa que se você tem um diretório /media/pi/HD_EXTERNO/Vídeos e quer copiar apenas os arquivos de vídeo que ainda não foram copiados para o HD, não será necessário verificar nada, nem fazer a cópia de todos os arquivos novamente! O rsync vai copiar apenas a diferença!

Usando como exemplo o diretório supracitado, vamos copiar os arquivos que estão em /home/pi/Vídeos.

rsync [OPTS] SRC DST

Esse é o formato que você deve ter em mente. O rsync recebe as opções e então indicamos o diretório de origem e o diretório de destino.

rsync   -av   /home/pi/Vídeos/   /media/pi/HD_EXTERNO/Vídeos/

As opções usadas (-av) são para verbosidade; para mostrar informações mais detalhadas durante o processo de cópia. A barra ao final do diretório é muito importante pois indica que é para copiar o que está dentro do diretório. A mesma coisa no destino; é para copiar para dentro do diretório.

rsync –dry-run

Mas antes de executar a operação, podemos nos certificar do que será feito para ver se compusemos o comando corretamente. Para isso, usamos a opção –dry-run.

rsync    -av    --dry-run    /home/pi/Vídeos/ /media/pi/HD_EXTERNO/Vídeos/

Esse comando simulará o que será feito. Se a saída for satisfatória, basta remover a opção dry-run.

Copiando arquivos para um diretório remoto com rsync

De forma muito semelhante, podemos copiar arquivos com rsync de ou para um diretório remoto. Vamos focar em origem local sempre nesse artigo.

O diretório remoto deverá ser um Linux. Você pode copiar arquivos com rsync de um Raspberry para outro, por exemplo. De um Linux em uma máquina virtual para um Raspberry etc. Quando a origem for Windows, o procedimento será semelhante, descreverei, mas leia todo o artigo para entender o funcionamento.

Já sabemos que o formato do comando é rsync [flags] src dst. Sendo o destino uma máquina remota, como descrevemos o caminho para o programa rsync? Vamos nomear os diretório de exemplo primeiro: Localmente, /home/pi/Vídeos/ e remotamente /home/usuario/backup/Vídeos/. Supondo que o IP do computador remoto seja 192.168.0.2, fazemos assim:

rsync -avP --dry-run /home/pi/Vídeos/ usuario@192.168.0.2:/home/usuario/backup/Vídeos/ 

Aqui adicionamos mais uma flag: -P. Isso nos dá uma barra de progresso e caso percamos a comunicação, o backup será retomado exatamente do mesmo ponto, quando o processo for iniciado novamente. Isso significa que temos um backup incremental.

Para especificar o computador remoto, indicamos o usuário ‘at’ IP e diretório de destino: usuario@192.168.0.2:~/backup/Vídeos/. E repare que nesse momento o comando está incluindo o dry-run. Desse modo, certificaremos que o comando está correto, para depois eliminarmos essa opção. Aí o comando ficará assim:

rsync -avP /home/pi/Vídeos/ usuario@192.168.0.2:/home/usuario/backup/Vídeos/

Se os diretórios estiverem idênticos, o único tempo gasto é o da validação. De outro modo seria copiado tudo, se usando scp ou cp.

Excluir diretório da lista de cópia

“Excluir” não é “apagar”. Como estou produzindo vídeos para nosso canal DobitaobyteBrasil no Youtube com uma certa frequência, diversos arquivos importantes para fazer vfx, sfx, composite, overlay e afins estão sendo baixados no meu SSD local. Como não posso me dar ao luxo de manter grandes volumes nesse modesto SSD de 250GB, estou transportando esses dados importantes para o computador que transformei em storage. Bem, dentro do diretório Vídeos eu tenho o CacheClip, que é o cache dos vídeos que estão sendo produzidos e não tem serventia para backup. Além dele, tem um diretório oculto chamado .gallery e os arquivos mkv que são pré-produção. Para evitar que eles sejam copiado, uso a opção –exclude. O comando fica assim:

rsync -avP  --exclude={CacheClip,.gallery,*.mkv} Vídeos/ djames@duplicador.local:/home/djames/nfs/Vídeos/

Se fosse para excluir exclusivamente o diretório CacheClip, o exclude ficaria assim:

rsync -avP  --exclude=CacheClip Vídeos/ djames@duplicador.local:/home/djames/nfs/Vídeos/

Excluir do destino arquivos que não estejam mais na origem

Não use. Se errar esse comando, vai se lamentar. Já usei muito em ambiente de servidores e em alguns anos tivemos algumas ocorrências. A melhor coisa é dedicar um tempo analisando o que excluir. Se ainda assim quiser experimentar, o comando receberá apenas a opção –delete, para excluir a diferença.

Instalando rsync no Windows

É muito provável que tenha lhe despertado interesse e 70% dos visitantes do blog usam Windows, então me sinto na obrigação de descrever o processo de uso no sistema da Microsoft.

Instalar WSL no Windows

O WSL é um subsistema Linux rodando nativamente no Windows. É um recurso que há algum tempo a Microsoft adicionou ao Windows e que dá muito mais poder ao sistema operacional, já que entrega um shell com tudo o que usamos no Linux e que não tem no Windows.

Para habilitar o WSL no windows siga esses passos:

  • Abra o Windows Power Shell, digitando no campo de pesquisa. Clique com o botão direito e selecione Executar como administrador.
  • Digite o comando como a seguir:
dism.exe  /online  /enable-feature  /featurename:Microsoft-Windows-Subsystem-linux  /all  /norestart

Esse comando é uma linha apenas.

O próximo passo é habilitar a máquina virtual:

dism.exe  /online  /enable-feature  /featurename:VirtualMachinePlatform  /all  /norestart

Quando concluído, reinicie o Windows.

Abra a loja da Microsoft (que é um gerenciador de aplicativos semelhante ao gerenciador de pacotes do Ubuntu) e instale o Linux Ubuntu. Depois disso você terá o programa bash, que é o terminal do Linux, que pode ser aberto através do menu.

Se alguma coisa não funcionar até aqui, tente digitar esse comando no Power Shell:

wsl  --set-default-version 2

De outro modo, ignore-o.

Tendo instalado o Ubuntu, agora vamos instalar o rsync e o ssh através do bash:

sudo apt-get install rsync ssh

Exemplo de uso do rsync no Windows

Vamos supor que temos o diretório Vídeos em H: (ou sei lá que letra seria razoável sem ser o C:). Da mesma forma que fizemos no Linux, vamos copiar esse diretório de H:\Vídeos para o 192.168.0.2. No Windows a sintaxe fica um pouco diferente, mas é o mesmo princípio. Se fosse no power shell, digitaríamos:

wsl rsync -avv / mnt / h / Vídeos /   usuario@192.168.0.2:/home / usuario / Vídeos /

No bash a sintaxe é mais amigável, mas não sei se dá pra acessar diretórios fora da VM. Sugiro procurar mais exemplos de comandos rsync com Windows.

Vídeo mostrando como copiar arquivos com rsync

No vídeo explico mais visualmente, além de exemplificar uma cópia real de backup dos meus arquivos de vídeo. Visite o canal e inscreva-se!