Estou escrevendo a funcionalidade de atualização de software para um equipamento embarcado. Atualmente, o sistema de arquivos raiz é atualizado pegando um novo arquivo rootfs.tar.gz e descompactando-o no sistema de arquivos raiz (substituindo os arquivos existentes e adicionando novos). Mas isso não exclui os arquivos que não estão no novo pacote.
Portanto, agora vou ter que rm -rf todos os arquivos existentes e descompactar o novo arquivo rootfs tar. Isso parece muito trabalhoso e leva muito tempo, e talvez a única coisa que mudou foi um arquivo de configuração.
Em vez disso, gostaria de poder rsync o conteúdo de um arquivo .tar.gz para um diretório. Isso é possível sem passar por algum tipo de intermediário (ou seja, sem descompactar o tar em um diretório temporário e fazer o rsync)?
Diretamente, não tem como fazer o que você quer. Conforme mencionado nos comentários, archivemount pode ser uma opção, embora tenha suas próprias limitações (uma das quais é a dependência de uma opção de configuração específica habilitada quando você criou o kernel).
No entanto, existem duas opções alternativas que vêm à mente:
Use imagens SquashFS em vez de arquivos tar gzipados. Eles podem ser montados diretamente pelo kernel e, em muitos casos, serão menores do que um arquivo tar compactado equivalente. Você pode então usar o rsync da imagem montada do SquashFS. Se você estiver usando o Buildroot para construir o sistema de arquivos raiz para isso, há uma opção para gerar diretamente essa imagem.
Em vez de ter apenas uma partição raiz, use duas. Ao fazer uma instalação inicial, grave todos os dados em ambas as partições e configure o gerenciador de inicialização para inicializar apenas a partir de uma delas. Quando você atualizar o sistema, destrua a outra partição, extraia seu arquivo raiz lá, atualize o bootloader para inicializar a partir dele e, em seguida, reinicie. Embora isso demore um pouco mais para executar atualizações do que o que você está propondo, ele tem algumas grandes vantagens: