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:
- crie um diretório temporário
- descompacte o arquivo tar nele
- rysnc conforme necessário
- se algo mudou localmente, reembale em um novo arquivo tar
- 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á).