Gostaria de realizar backups incrementais (para todo o sistema de arquivos) de uma máquina. rsync
faz isso, mas também gostaria de preservar a propriedade do arquivo - ou seja, tornar possível restaurá-lo.
Isso é possível sem executar rsync
como root na máquina de destino (armazenando os backups)?
Algumas ideias...
- Existe uma maneira de montar um sistema de arquivos (FUSE?) De forma a permitir
chown
um usuário não root? (Eu acho que provavelmente precisaria sernoexec
para proibir a elevação.) - Alguma maneira de armazenar e restaurar a propriedade em arquivos de metadados em vez do próprio sistema de arquivos?
tar
pode armazenar a propriedade do arquivo, embora fazê-lo funcionar com rsync ou backups incrementais seria um pouco mais complicado. Também seria bom poder navegar pelos backups como um sistema de arquivos normal.- Talvez algum tipo de ambiente raiz falso? Uma máquina virtual funcionaria, mas seria bom para evitar a manutenção associada e sobrecarga de desempenho.
Conforme declarado nas outras respostas, para preservar diretamente as informações de propriedade, você precisa de acesso root à máquina de destino.
No entanto, você tinha pelo menos duas soluções alternativas para evitar o acesso root enquanto preservava a propriedade:
--fake-super
opção rsync. Na página de manual:Isso significa que a propriedade não é preservada diretamente no estilo clássico do Unix, em vez disso, as informações de propriedade são armazenadas dentro de um atributo estendido especial (ou seja: uma espécie de "tag" anexada ao arquivo). Ao restaurar,
rsync
pode usar este EA/tag para reconstruir corretamente o proprietário do arquivo original.getfacl
utilitário. Por exemplo, ao emitir,getfacl -R MNTPOINT > acls.txt
você salva efetivamente as informações de propriedade (e ACL) em um arquivo de texto que pode ser usado posteriormente para restaurar essas informações usando osetfacl --restore
comando.Se eu fosse você, colocaria os backups em um volume em um contêiner do Docker. Dessa forma, você pode colocar bons limites nele e evitar riscos de segurança, mas ainda executá-lo como root para que ele faça o que precisa fazer.
Em vez de copiar todos os seus arquivos um por um como o rsync faz, você deve considerar colocar os arquivos em algum tipo de "contêiner" que permite empacotar todos os arquivos, transportá-los e nunca perder nenhum metadado.
Já pensou em "alcatrão"? Eu sei que o tar é a antítese do rsync: não é incremental, não transporta os dados para lugar nenhum, etc.
No entanto, é muito bom em preservar propriedade, permissões, ACLs, tempos de modificação e outros. Você pode fazer um arquivo tar, copiá-lo para uma máquina que nem mesmo entende a maneira Unix de fazer permissões de arquivo (ou seja, Windows, TOPS-20, VAX/VMS), depois copiá-lo de volta para um host Unix, descompactá-lo, e você obtém todas as permissões etc. que ele tinha originalmente.
Existe um sistema de arquivos FUSE que montará arquivos tar (somente leitura) .
Claro, você perde as cópias incrementais e outros recursos que tornam o rsync uma ferramenta tão excelente. No entanto, o mundo Unix usou o tar por mais de 20 anos antes do rsync ser inventado e funciona muito bem em certas situações.
Presumo que, quando você diz "sem executar o rsync como root no destino", você realmente atingiu o problema de não poder estabelecer uma conexão com o destino como root - correto? Em outras palavras - você não quer dizer literalmente "sem executar o rsync como root no destino" - mas o que REALMENTE quer dizer é "sem fazer uma conexão (automática) como root para o destino" - o que, como todos sabem, é uma tarefa difícil e perigosa coisa para fazer.
Supondo que seja esse o caso (provavelmente é), uma solução é usar canos.
A ideia é criar um canal na máquina de destino que pertence ao login não root que enviará os backups e gravar o fluxo de backup nesse canal.
Em seguida, nessa mesma máquina, você a configura para executar um processo raiz que lê o pipe e restaura o backup.
por exemplo (usando tar por exemplo) - na máquina para extrair o backup:-
E na máquina para enviar os backups de:
Você também pode fazer o contrário (colocar o canal na outra máquina), o que pode ser útil se você quiser que o servidor de backup inicie o processo de backup (já que a máquina a ser copiada ficará bloqueada até o outro servidor lê do pipe).
Uma solução pode ser criar uma imagem de disco no local remoto e montá-la localmente:
Agora podemos executar o rsync em nossa máquina local como root:
Obviamente, para obter os arquivos "raiz" do destino, você precisa de acesso root. No entanto, existem muitas maneiras de estragar seu sistema.
1) Você pode permitir que o rsync use sudo sem senha 2) Você pode usar setuid para rsync para que ele possa acessar arquivos root, enquanto o orquestrador de backup é um usuário normal em vez do root. 3) use rssh para limitar os riscos de segurança de todos os itens acima