Um shellscript feito para backup de dados em disco externo
Por Marcelo Munhoz
em 25/02/2023

A maioria das pessoas desconhecem a importância do backup em suas vidas, o que é curioso. Traçamos um paralelo... Fotos.

Fotografia, por definição é escrita pela luz. Histórias, vidas, sonhos e momentos gravados pela luz. Isso é um tipo de backup de nossos momentos, nossas memórias. E o backup dessas fotos é uma forma de garantir que manteremos nossas memórias por mais tempo.

Backup x Cópia

Sendo assim, porque não simplesmente copiar os arquivos/fotos numa pasta qualquer, no computador, ou pendrive?

A princípio parece uma boa ideia. Mas o conceito de backup é criar cópias ordenadas e de forma contínua, garantindo um versionamento dos dados salvos.

Uma cópia é apenas isso; copiar arquivos sem um sistema ordenado, datado e periodicamente.

Como efetuar backups

Existem diversas ferramentas gratuitas e também pagas para backups. Aqui eu foco num Shell script que escrevi. Em seguida algumas explanações.

backup-home.sh

#!/usr/bin/env sh

# Backup DIR
backup_path="/home/user-home"
backup_size=$(du -s $backup_path | cut -f1)

# Backup destiny
external_storage="/mnt/backup"

# File format
date_format=$(date "+%Y-%m-%d_%R")
final_archive="my-backup-$date_format.tar.gz"

# Logs
log_file="/var/log/my-daily-backup.log"

###########
# Tests
###########
# Checking if external disk is mounted
if ! mountpoint -q -- $external_storage; then
        printf "[$date_format] DEVICE NOT MOUNTED in $external_storage.\n" >> $log_file
        exit 1
fi

# Checking backup size vs destiny free space
avail_space_ext_storage=$(df $external_storage | awk 'NR==2{print $4}')

if ! [ $backup_size -le $avail_space_ext_storage ]; then
        printf "INSUFFICIENT SPACE AVAILABLE in $external_storage.\n" >> $log_file
        exit 1
fi

###############
# Backup begin
###############
if tar -czSpf "$external_storage/$final_archive" "$backup_path"; then
        printf "[$date_format] BACKUP SUCESS.\n" >> $log_file
else
        printf "[$date_format] BACKUP ERROR.\n" >> $log_file
fi

#################################
# Delete old backups - 14 days+
#################################
find $external_storage -mtime +14 -delete

Foi utilizado #!/usr/bin/env sh como definição do interpretador porque cada pessoa pode ter seu interpretador favorito instalado e, dessa forma script será rodado pelo primeiro encontrado em seu env.

Nesse exemplo, estamos fazendo backup da pasta home/user-home, comumente utilizada como pasta onde os dados de aplicações, documentos, imagens, vídeos etc são salvos. Para adicionar outras pastas, basta adicioná-las separando-as com espaço.

Estamos utilizando mountpoint /mnt/backup para ficar claro seu propósito. Criaremos um arquivo compactado no formato .tar.gz contendo a data de execução em seu nome.

Antes de fazer efetivamente o backup, algumas verificações serão feitas.

  • Existe um HD externo/pendrive montado em /mnt/backup ? SIM
  • Há espaço livre suficiente para concluir o backup? SIM

Passado todo processo, o log /var/log/my-daily-backup.log será atualizado informando se houve sucesso.

# Exemplo de log

[2023-02-17_21:41] BACKUP SUCESS.
[2023-02-18_23:54] BACKUP SUCESS.
[2023-02-20_22:00] BACKUP ERROR.
[2023-02-24_22:00] BACKUP SUCESS.

Os backups com 14 dias ou mais serão apagados do HD externo/pendrive.

Lembretes

  • Para executar o script é necessário dar a permissão ao usuário. Exemplo chmod u+x backup-home.sh
  • Para descompactar o arquivo gerado tar -xvf my-backup-2023-02-25_13:21.tar.gz
  • Para que o backup seja feito automaticamente (com o hd já montado) em dia e horário marcados, necessário adicionar essa instrução no cron da máquina estando como root. crontab -e. Sugiro utilizar o site Crontab.guru.