Discuta este tópico no fórum

Se este conteúdo te ajudou, deixe um presente!

Mostrando postagens com marcador samba. Mostrar todas as postagens
Mostrando postagens com marcador samba. Mostrar todas as postagens

quarta-feira, 11 de abril de 2018

OpenWrt/LEDE: fazendo seus backups no roteador (e distribuindo-os): parte 3

Mais um artigo da série sobre o OpenWrt/LEDE. 

No primeiro artigo deste tema, comentei o que uma solução de backup deveria ter. Passei pela solução que usava anteriormente (crashplan) e uma brevíssima introdução aos recursos do borg. Depois apresentei a configuração do backup em um HD externo no seu roteador. Neste artigo, iremos implementar a sincronia entre repositórios.

Só relembrando, esse é o esquema do backup:


O computador roda o borg e copia os arquivos (amarelo) para um repositório no roteador. Esse repositório é acessado por CIFS e aponta para um HD externo conectado na USB. Em um segundo momento, um rsync sincroniza esse repositório com um destino remoto utilizando o rsync. O destino remoto também é um roteador com um HD externo conectado, mas poderia ser qualquer destino com suporte a rsync. A comunicação do rsync é feita dentro de uma VPN, que interliga o roteador de origem e destino do repositório.

Este artigo aborda a parte verde do diagrama.

Sincronizando repositórios


Já ouvi a estória do "eu tinha backup, mas perdi junto". Incêndio, roubo, descarga elétrica durante o backup, não são se preocupar em "não queimar" o HD externo do seu backup. E o backup parece ter um certo magnetismo que o atrai para próximo da fonte original da informação, em especial antes de eventos catastróficos.

Como já havia comentado na parte 1 deste assunto, distribuir geograficamente o backup de forma automatizada era um requisito. A opção foi utilizando o rsync sobre uma VPN, onde o repositório do backup, conectado no roteador (que sempre está ligado), é enviado lentamente para um outro armazenamento remoto, também conectado em outro roteador (que sempre está ligado).

A parte da VPN é assunto antigo. O rsync pode ser feito pelo SSH, com autenticação por chaves. Porém, isso exige um certo grau de confiança da ponta remota pois as mesmas chaves podem abrir uma sessão no roteador remoto. Outra opção é um serviço rsyncd. Apesar de não ter autenticação, você pode controlar pelo firewall e pela restrição do próprio rsyncd quem pode acessar esse serviço. Se somente o teu roteador puder conectar no roteador remoto, só você poderá apagar algo indevidamente.

No roteador que receberá a cópia:

roteador-remoto# opkg update
roteador-remoto# opkg install rsyncd

A configuração não foi UCIficada e deve ser feita diretamente em /etc/rsyncd.conf. Só adicionar:

/etc/rsyncd.conf:
(...)
[fulano@gmail.com]
path = /mnt/HD-externo-XYZ/backup/borg/fulano@gmail.com
read only = no
fake super = yes

O identificador fulano@gmail.com é arbitrário. Eu gosto de usá-lo pois o repositório normalmente terá mais de um cliente. E nada melhor do que o email para lembrar o nome do repositório. 

Agora, basta ativar e disparar o serviço:

roteador-remoto# /etc/init.d/rsyncd enable
roteador-remoto# /etc/init.d/rsyncd start

Opcionalmente, se já estiver usando o xinetd (por exemplo, para o scanner na rede - SANE), pode também usar o xinetd ao invés do serviço rsyncd:

service rsync 
{
disable = no
socket_type = stream
port = 873
protocol = tcp
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}

E falta, agora, somente a rotina que envia do meu roteador-local para o roteador-remoto.

rsync --bwlimit=30k --partial --archive --delete --delay-updates --delete-after  /mnt/HD-externo-abc/borg/ roteador-remoto::fulano@gmail.com/

E se usar por cima do SSH:

rsync --bwlimit=30k --partial --archive --delete --delay-updates --delete-after  /mnt/HD-externo-abc/borg/ roteador-remoto:/mnt/HD-externo-XYZ/backup/borg/fulano@gmail.com/

A primeira opção --bwlimit limita a taxa de transferência para o rsync. Ajuste para sua realidade. Como eventualmente teremos múltiplos gigabytes para serem enviados, o processo pode durar dias. A recomendação é sempre deixar um tanto para outros fins. O --partial permite continuar o envio quando a conexão foi perdida. Eu gosto de usar o --delay-updates --delete-after para manter o repositório íntegro durante a cópia. Se espaço for um problema do outro lado e ele não aguentar armazenar a mais a diferença a ser enviada, pode usar o --inplace e --delete-before. E sempre, man é seu amigo.

Agora é só colocar na cron. Como o processo pode rodar "por dias", é importante que ele não volte a rodar se o rsync anterior ainda estiver em execução. Por isso, podemos melhorar o comando usando o comando "lock":

lock -n /tmp/rsync.lock && { bwlimit=30k --partial --archive --delete --delay-updates --delete-after  /mnt/HD-externo-abc/borg/ roteador-remoto::fulano@gmail.com/; lock -u /tmp/rsync.lock; }

Se rodar novamente este comando enquanto a execução anterior ainda estiver em curso, você vai receber um:

Can't lock /tmp/rsync.lock

E, como esperado, não teremos dois rsync em execução.

No OpenWrt, não temos os /etc/cron.* que usamos no Linux. Sendo assim, temos que usar o bom e velho 'crontab -e'. Para rodar todos os dias 1 AM:

0 1 * * * lock -n /tmp/rsync.lock && { bwlimit=30k --partial --archive --delete --delay-updates --delete-after  /mnt/HD-externo-abc/borg/ roteador-remoto::fulano@gmail.com/; lock -u /tmp/rsync.lock; }

Outra funcionalidade interessante é abortar o processo quando ele demorar muito tempo. Assim você pode manter a rotina apenas durante a madrugada. Todavia, isso só faz sentido se usar a opção "--partial". Bem, a partir deste ponto, a linha do comando vai ficar muito longa, mesmo por um costumas one-liner. É hora de fazer um script:

#!/bin/sh
# Sincroniza repositorio local com remoto
#
RSYNC_TIMEOUT=${1:?Informe o tempo maximo em segundos deste script}; shift
REPO_LOCAL=${1:?Informe o repositorio local}; shift
REPO_REMOTE=${1:?Informe o repositorio remoto}; shift
REPO_LOCK=/tmp/rsync-remote.lock

lock -n "$REPO_LOCK" || {
echo "Falha ao obter lock! Existe um rsync-backup rodando?" >&2
exit 1
}
trap "lock -u '$REPO_LOCK'" EXIT

rsync --archive --partial --delete --delay-updates --delete-after "$@" "$REPO_LOCAL" "$REPO_REMOTE" &
pid_rsync="$!"
(sleep $RSYNC_TIMEOUT; echo "Estouro de tempo ($RSYNC_TIMEOUT segundos)" >&2; kill -TERM $pid_rsync) &
pid_timeout="$!"
# Deveria ser kill -TERM -$pid_timeout... mas com o ash nao fuciona ainda
trap "lock -u '$REPO_LOCK'; kill -TERM $pid_timeout $pid_rsync 2>/dev/null" EXIT
wait $pid_rsync
err=$?
exit $err

Que ficaria na cron assim:

#  Roda todos os dias 1AM por 6 horas (21600 segundos)
0 1 * * * /caminho/para/rsync-backup.sh 21600 /mnt/HD-externo-abc/borg/ roteador-remoto::fulano@gmail.com/

E é isso. Agora você já tem um mecanismo de sincronia dos backups.

Recuperando dados

Primeiro, vamos imaginar o cenário onde você precisa recuperar os dados do repositório remoto. Você deve ter perdido os dados principais e também seu backup local. Nesta situação, é provável que você nem tenha mais o seu computador para recuperar os dados.

A primeira alternativa de recuperação é ir fisicamente onde o backup remoto está e copiar o repositório. O melhor seria primeiro reconstruir seu repositório local e depois recuperar o que você quiser com calma a partir dele.

Se o acesso físico for complicado, você pode simplesmente reconstruir seu repositório local fazendo um rsync inverso, como origem o repositório remoto e destino um caminho local. Vai demorar mas funciona.

Por fim, se precisar apenas de uma ou outra coisa, eu recomendaria testar a montagem remota em cima de rsync, como em fuse-rsync. Não testei mas deve funcionar perfeitamente.

Ah, e não se esqueça que você sempre precisa ter acesso a chave ou a senha usada na criação do repositório. E isso sem depender do próprio backup ;-)

Se pintar uma dúvida, tem sempre o fórum deste blog. Até a próxima.

sábado, 6 de abril de 2013

OpenWRT: Compartilhando seu HD na rede pelo roteador(NAS)

A porta USB no roteador o torna muito versátil. Um dos usos mais interessantes é transformá-lo em um NAS (Network Attached Storage) ou, em suma, um "HD na rede". Para tal, vamos precisar de um roteador com porta USB, uma unidade de armazenamento USB e espaço em disco para instalar o servidor de arquivos.


Depois de conectar um HD externo e, talvez, aumentar o espaço do disco do OpenWRT para poder instalar mais coisas, vamos a instalação do servidor de arquivos. O servidor de arquivos padrão para o Linux é o Samba. Apesar de ser uma implementação do protocolo "padrão" da Microsoft para troca de arquivos em rede, é o que temos de melhor para troca de arquivos mesmo entre duas máquinas Linux. Se o cliente for um Windows®, nem se fala.

Já existe um pacote pronto do samba para o OpenWRT. Basta instalar o pacote samba36-server e, opcionalmente, luci-app-samba, e você terá tudo que precisa para o servidor. Você pode usar tanto a interface WEB como a linha de comando para a instalação:
opkg update
opkg install samba36-server
A configuração do samba pode ser feita com as opções do arquivo smb.conf ou, de forma mais limitada, pela infraestrutura do OpenWRT, no arquivo "/etc/config/samba" . Vou me limitar ao segundo caso pois atenderá a maioria dos usuários. Quanto ao primeiro, não seria diferente de um sistema Linux padrão. Preferencialmente altere o arquivo "/etc/samba/smb.conf.template" pois a configuração final será obtida juntando as informações deste arquivo com o que for configurado em "/etc/config/samba". O pacote luci-app-samba, opcional, fornece uma página na interface WEB Luci que possibilita a configuração básica do samba ou a edição do arquivo "smb.conf.template" sem precisar saber usar o vim.

Na inteface WEB, assim como no arquivo de configuração, é bom definir o nome e o grupo de trabalho do seu roteador. Os diretórios compartilhados são criados em um item sambashare ou em "Diretórios Compartilhados" na interface Luci. Caso a segurança não seja preocupação, ative a opção "permitir convidados" ou "guest_ok". Assim, não será necessário fornecer um usuário e senha para conectar no roteador. A opção "somente leitura" vai no mesmo sentido. Só lembrando que, por padrão, usuário sem senha assume o usuário unix nobody e este precisa ter permissão de leitura ou escrita ou diretório para poder acessar ou escrever nos diretórios. Se a segurança não for importante, dê acesso completo a todos os usuários:
chmod a+rw /mnt/sd??
Onde o /mnt/sd?? é o local onde seu disco está montado no sistema. Só lembre que ao liberar o acesso sem senha e com permissão de escrita a todos, seus arquivos estarão acessíveis a qualquer usuário que tenha acesso a sua rede local. Isto inclui as suas visitas que conectam no seu wireless. Por padrão, o acesso externo (pela internet) ao samba está bloqueado no firewall. Não recomendaria a abertura deste servidor para a internet e, se for feito, por favor, não usem acesso de convidados.

Para colocar o servidor de arquivos em uso, habilite o serviço e inicie:
/etc/init.d/samba enable
/etc/init.d/samba start
E teste a partir de um computador. No windows, o caminho será \\<nome ou ip do roteador\<compartilhamento> e nas interfaces gráficas do Linux, em geral, smb://<nome ou ip do roteador/<compartilhamento>. Ex:
  • \\roteador\fotos ou smb://roteador/fotos
  • \\192.168.1.1\documentos ou smb://192.168.1.1/documentos
Se seu desejo é o uso somente com usuário convidado, sem senha, este artigo termina aqui para você. Para os mais preocupados com segurança, pode-se criar contas no OpenWRT para cada usuário. O processo é o mesmo de um sistema Linux. Infelizmente, por padrão, não tem os comandos para facilitar esta tarefa. Portanto, para criar usuários, adicione linhas como esta ao arquivo /etc/passwd:
newuser:*:1000:65534:new user name:/var:/bin/false
O newuser é o login do usuário. O número 1000 é o identificador. Deve ser único entre os usuários e preferencialmente acima de 1000. "new user name" é o nome completo, sem muito uso no OpenWRT. "/var" é o home e "/bin/false" o shell. Se ele não for conectar por SSH com este usuário no roteador, pode ficar como está. O caminho do home, "/var", pode ser interessante mudar se for habilitada a opção "homes" ou "compartilhas os homes dos usuários" na configuração do samba. Assim, quando ele se autenticar, será criado dinamicamente um diretório compartilhado com o nome do usuário para este caminho. É necessário definir uma senha para este usuário no samba utilizando o comando smbpasswd. Na primeira vez, é preciso criar o usuário nos bancos de dados do samba.
smbpasswd -a usuário
O mesmo comando pode ser usado para trocar a senha, mas sem o "-a".

Com isto temos mais uma função, um NAS, consolidado no roteador. Com um NAS e um servidor DLNA, você terá um MediaBox. Com o NAS e um cliente Torrent, um SeedBox. E por que não ambos? E por que não mais coisas? Isto fica para outro post. Até mais.