rsync para / from tar archive

6

É possível rsync um sistema de arquivos real (remoto) com um arquivo tar (local)? Se sim, como?

O problema é que eu preciso fazer o backup correto das configurações de usuário / grupo / permissão e, embora eu tenha acesso root no remoto, gostaria de evitar a execução como root na máquina local.

Meu primeiro (e mais importante) caso de uso seria atualizar um destino integrado remoto (ARM9) de um .tar produzido pela Buildroot. Eu não tenho a "coisa real" no disco (eu posso produzir uma cópia enquanto sou root) e eu gostaria de evitar a transferência de todos os rootfs para atualizar alguns arquivos.

    
por ZioByte 12.01.2016 / 16:01

2 respostas

1

A resposta correta parece ser descompactar o arquivo tar usando o fakeroot (para evitar tornar-se root) e então usar o rsync. Possivelmente reembale o arquivo, se necessário.

Infelizmente, as coisas não são tão fáceis porque há uma interação ruim entre o ssh e o fakeroot. Vou detalhar o que fiz para ajudar quem quer que procure.

A teoria é direta:

  1. crie um diretório temporário
  2. descompacte o arquivo tar nele
  3. rysnc conforme necessário
  4. se algo mudou localmente, reembale em um novo arquivo tar
  5. limpeza

Para preservar todas as etapas de usuário / grupo / permissões, a versão 2..4 deve ser feita sob fakeroot.

O catch é o rsync usa o ssh para comunicação (e eu quero isso!) e assim, sendo "fakerooted" ele tenta abrir credenciais de root (em /root/.ssh/), falhando mal. O seguinte conjunto de opções funciona para mim.

#!/bin/bash

target=myHost
here=$(pwd)

# 1. create a temp directory
cd /tmp
mkdir TMPfs
cd TMPfs

fakeroot bash <<- EOF
    # 2. unpack tar archive into it
    tar xf $here/archive.tar
    # 3. rysnc as needed (ssh options are *the* relevant thing)
    rsync -av -e "ssh -i $HOME/.ssh/id_rsa -oUserKnownHostsFile=$HOME/.ssh/known_hosts" . root@$target:/
    # 4. if something changed locally repack int a new tar archive (not needed here)
EOF

# 5. cleanup
rm -rf *
cd ..
rmdir TMPfs

Eu ainda recebo o erro "Não foi possível criar o diretório '/root/.ssh'." mas parece ser benigno (nenhum arquivo é criado / usado lá).

    
por 12.01.2016 / 23:08
0

Eu não tentei isso, mas deve funcionar.

Usando "arquivemount" (fonte de:)

http://www.cybernoia.de/software/archivemount/

e um 'libarchive' incluído em muitas distros (suse, redhat, etc) ...

Ou um pré-criado de:

https://rpmfind.net/linux/rpm2html/search.php?query=archivemount

Você pode montar um arquivo tar usando o recurso fusermount no linux.

De lá, você deve ser capaz de usar o rsync diretamente no sistema final.

Eu escrevi um arquivo batch de passagem simples para testar o repasse do rsync:

#!/bin/bash
# ussh -- use root@ssh to target system
exec ssh  root@"$@"

depois, como teste, usou o rsync para passar dir 'test1' para 'ishtar', chamando-o de / tmp / test2 no destino:

RSYNC_RSH=$PWD/Ussh rsync -uva /tmp/test1/ ishtar:/tmp/test2

Ele pedirá a senha do logon de raiz do sistema alvo, ou você poderia configurar o sistema de destino para aceitar um login raiz por meio de um certificado, para que nenhuma senha fosse necessária.

Isso parece ser a maneira mais eficiente de fazer o que você quer (você pode precisar modificar as opções de rsync para não copiar tempos de dir e coisas assim), mas é esse o tipo de coisa que você estava procurando?

-Astara

    
por 07.05.2017 / 07:22

Tags