segunda-feira, 9 de janeiro de 2012

Backup no escuro com o systemd

CENÁRIO

Máquina rodando uma instalação mínima do CentOS 7 em modo texto. Típico caso de um servidor quieto lá no seu canto rodando Samba.

OBJETIVO

Fazer com que, ao plugar um HDD externo — e sem intervenção do usuário —, seja feito backup de uma pasta com o rsync e que toque bipes para avisar quando terminou. Será usado EXT3 no disco externo, por ser um sistema antigo e com melhor suporte em outros Unix-like, bem como no Windows.

PACOTES NECESSÁRIOS

# yum -y install rsync

PASSOS

Plugue o HDD externo na máquina com o CentOS. Agora você precisará de um monitor nela, ou então acesso por SSH.

Identifique o dispositivo rodando o blkid:

# blkid
...
/dev/sdb1: LABEL="BACKUP123" UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" SEC_TYPE="ext2" TYPE="ext3"

Adicione uma regra para o udev, criando um aquivo na pasta /etc/udev/rules.d/ (por exemplo: 99-hdd-externo.rules)

ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_TYPE}=="ext3", ENV{ID_FS_LABEL}=="BACKUP123", TAG+="systemd", ENV{UDISKS_IGNORE}="1", ENV{SYSTEMD_WANTS}+="backup.service"

Usei uma regra que filtra pelo rótulo do volume e pelo 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=env --name=/dev/sdb1

O udev monitora a pasta e aplica as regras na hora. Não é necessário reiniciar. A regra diz para o systemd rodar o serviço backup.service, que criaremos a seguir, logo que o dispositivo for conectado.

Distribuições colocam seus arquivos em /usr/lib/systemd/system/. Essa pasta não deve ser editada manualmente. O campo do administrador é a pasta /etc/systemd/system/. No caso do systemd se deparar com arquivos com mesmo nome em ambas, os existentes em /etc têm prioridade.

/etc/systemd/system/backup.service

[Unit]
Description=Faz backup para HDD externo
ConditionPathExists=/mnt/backup

[Service]
Type=oneshot
ExecStartPre=/usr/bin/mount -v -o context=system_u:object_r:removable_t:s0,x-gvfs-hide LABEL=BACKUP123 /mnt/backup
ExecStart=-/usr/bin/rsync -ah --stats --update /srv/pub/ /mnt/backup
ExecStartPost=/usr/bin/umount -v /mnt/backup ; /usr/bin/bash -c '( printf \\a ; sleep 0.2 ; printf \\a ) > /dev/console'

Crie a pasta /mnt/backup, que servirá de ponto de montagem, e rode systemctl daemon-reload para o systemd atualizar a lista de arquivos unit.

A lógica de operação é a seguinte. Quando o udev detectar que o HDD externo foi plugado e que o rótulo e o tipo de sistema de arquivos batem, ele avisa o systemd para rodar o serviço backup.service. O serviço é do tipo oneshot para os comandos postos em ExecStartPre, ExecStart e ExecStartPost serem executados serialmente. O primeiro monta a partição usando o rótulo, o segundo roda o rsync (prefixo - significa que exit codes anormais serão ignorados) e o último desmonta a partição e toca dois bipes para avisar que o disco externo pode ser removido.

Adapte o comando rsync à vontade. Se precisar executar mais comandos, serviços oneshot podem ter a opção ExecStart declarada mais de uma vez (são executadas na ordem que forem encontradas no arquivo). Ou, se realmente precisar de shell script, crie um (/usr/local/libexec é um bom lugar) e especifique-o em ExecStart.

stdout e stderr vão para o journal. Assim todas as mensagens dos programas executados vão para /var/log/messages (CentOS 7 usa o rsyslog). Por isso, mount e umount estão com a opção -v (verbose), e rsync com --stats, para ter um histórico do que foi feito em cada backup.

O módulo pcspkr não é carregado por padrão. Crie o arquivo /etc/modprobe.d/beep.conf:

alias platform:pcspkr pcspkr

Por fim, habilite este boleno do SELinux:

# setsebool -P rsync_full_access 1

Você deve ter notado a presença de ENV{UDISKS_IGNORE}="1" na regra do udev e a opção de montagem x-gvfs-hide. Seu propósito é evitar que o ferramental da pilha gráfica, caso presente, interfira no backup.

Nenhum comentário:

Postar um comentário