Backup no escuro no Linux

Um dos maiores trunfos do Linux é podermos usar instalações realmente pequenas para funções específicas. Tratarei aqui de um mecanismo de backup automático, sem intervenção do usuário: ao plugar um HDD externo, o mesmo será montado, uma pasta será copiada com o rsync e, por fim, o disco será desmontado e desconectado. A distribuição usada é o openSUSE Leap 15.2, porém pode ser adaptado para qualquer outra[1].

Identifique o dispositivo onde será feito o backup:

# blkid /dev/sdb1
/dev/sdb1: LABEL="BACKUP123" UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4" PARTUUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Crie a regra para o udev:

/etc/udev/rules.d/99-hdd-externo.rules

ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_TYPE}=="ext4", ENV{ID_FS_LABEL}=="BACKUP123", TAG+="systemd", ENV{UDISKS_IGNORE}="1", ENV{SYSTEMD_WANTS}+="meubackup@%N.service"

ENV{UDISKS_IGNORE}="1" é para evitar que o ferramental da pilha gráfica, caso presente, interfira no backup. Usei uma regra que filtra pelo rótulo e tipo de sistema de arquivos. Você pode usar UUID se quiser (ENV{ID_FS_UUID}), ou qualquer outra característica fornecida pelo udev (udevadm info --query=property /dev/sdb1).

Rode udevadm control --reload.

Crie o serviço:

/etc/systemd/system/meubackup@.service

[Unit]
Description=Faz backup para HDD externo (%I)

[Service]
Type=oneshot
ExecStart=/usr/bin/mount -v -o X-mount.mkdir %I /mnt/backup
ExecStart=-/usr/bin/rsync -ah --stats --update /srv/dados/ /mnt/backup
ExecStart=/usr/bin/umount -v /mnt/backup
ExecStart=/usr/local/bin/rmusbbdev %I

Rode systemctl daemon-reload.

Quando o udev detectar um dispositivo com rótulo e sistema de arquivos especificados na regra, fará o systemd rodar, neste exemplo, o serviço meubackup@-dev-sdb1.service. Dentro do arquivo de unidade, o identificador %I é o nome usado pelo udev (%N, dispositivo em /dev). O serviço é do tipo oneshot para os comandos de ExecStart= serem executados serialmente. O primeiro monta o sistema de arquivos, o segundo roda o rsync (prefixo - significa que, caso termine com erro, será ignorado), o terceiro desmonta e o último é meu programinha para desconectar a porta USB.

Adapte o comando rsync à vontade (especialmente o diretório de origem). stdout e stderr vão para o journal, assim fica registrado o que foi feito:

kernel: usb 2-1.1: new high-speed USB device number 5 using ehci-pci
kernel: usb 2-1.1: New USB device found, idVendor=174c, idProduct=5106, bcdDevice= 0.01
kernel: usb 2-1.1: New USB device strings: Mfr=2, Product=3, SerialNumber=1
kernel: usb 2-1.1: Product: AS2105
kernel: usb 2-1.1: Manufacturer: ASMedia
kernel: usb 2-1.1: SerialNumber: S2ZAJ5ADA04249
kernel: usb-storage 2-1.1:1.0: USB Mass Storage device detected
kernel: scsi host4: usb-storage 2-1.1:1.0
kernel: scsi 4:0:0:0: Direct-Access     ST500LM0 12 HN-M500MBB    2AR2 PQ: 0 ANSI: 5
kernel: sd 4:0:0:0: Attached scsi generic sg2 type 0
kernel: sd 4:0:0:0: [sdb] 976773168 512-byte logical blocks: (500 GB/466 GiB)
kernel: sd 4:0:0:0: [sdb] Write Protect is off
kernel: sd 4:0:0:0: [sdb] Mode Sense: 23 00 00 00
kernel: sd 4:0:0:0: [sdb] No Caching mode page found
kernel: sd 4:0:0:0: [sdb] Assuming drive cache: write through
kernel:  sdb: sdb1
kernel: sd 4:0:0:0: [sdb] Attached SCSI disk
systemd[1]: Starting Faz backup para HDD externo (/dev/sdb1)...
kernel: EXT4-fs (sdb1): mounted filesystem with ordered data mode. Opts: (null)
mount[13162]: mount: /dev/sdb1 montada em /mnt/backup.
rsync[13166]: Number of files: 19 (reg: 18, dir: 1)
rsync[13166]: Number of created files: 0
rsync[13166]: Number of deleted files: 0
rsync[13166]: Number of regular files transferred: 0
rsync[13166]: Total file size: 6.53M bytes
rsync[13166]: Total transferred file size: 0 bytes
rsync[13166]: Literal data: 0 bytes
rsync[13166]: Matched data: 0 bytes
rsync[13166]: File list size: 0
rsync[13166]: File list generation time: 0.001 seconds
rsync[13166]: File list transfer time: 0.000 seconds
rsync[13166]: Total bytes sent: 325
rsync[13166]: Total bytes received: 12
rsync[13166]: sent 325 bytes  received 12 bytes  674.00 bytes/sec
rsync[13166]: total size is 6.53M  speedup is 19,387.40
umount[13169]: umount: /mnt/backup desmontado
rmusbbdev[13170]: Desconectando porta USB 2-1.1... sucesso.
systemd[1]: Started Faz backup para HDD externo (/dev/sdb1).
kernel: usb 2-1.1: USB disconnect, device number 5

Discos externos desligam o LED (ou fazem-o piscar mais lentamente) quando a porta é desconectada. Por outro lado, com gavetas marca diabo com a minha, depende do modelo. Esta aqui felizmente desliga.

Este post, numa encarnação anterior, foi publicado em 2012. Contudo, estava muito confuso.


[1] Distribuições sem systemd não me interessam.

Comentários

  1. Pergunta fora do contexto:
    Sabe onde posso encontrar o fsarchiver versão 0.86 em binário estático?
    Eu compilei a versão mas como apareceram algumas advertências que não sei avaliar durante a compilação fiquei inseguro em usar.

    ResponderExcluir
    Respostas
    1. Antigamente, havia um binário estático no site. Acho que não é mais disponibilizado. Provavelmente os avisos que apareceram não são críticos.

      Excluir
    2. Marcos, obrigado pelo retorno.

      Excluir

Postar um comentário