Restaurar arquivos do tar usando o rsync

1

Estou escrevendo a funcionalidade de atualização de software para um equipamento embarcado. Atualmente, o sistema de arquivos raiz é atualizado com um novo arquivo rootfs.tar.gz e descompactando-o no sistema de arquivos raiz (sobrescrevendo arquivos existentes e adicionando novos). Mas isso não exclui arquivos que não estão no novo pacote.

Então agora eu vou ter que rm -rf todos os arquivos existentes, então descompacte o novo arquivo tar rootfs. Isso parece muito trabalho, e leva muito tempo, e talvez a única coisa que mudou foi um arquivo de configuração.

Em vez disso, eu 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 para um diretório temporário e fazer o rsync)?

    
por Dave 16.04.2018 / 19:49

1 resposta

2

Diretamente, não há como fazer o que você deseja. Como mencionado nos comentários, archivemount pode ser uma opção, embora tenha suas próprias limitações (uma delas sendo uma dependência de um determinado opção de configuração sendo ativada quando você construiu o kernel).

No entanto, existem duas opções alternativas que vêm à mente:

  1. Use imagens SquashFS em vez de arquivos tar compactados com gzip. Eles podem ser montados diretamente pelo kernel e, em muitos casos, serão menores 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 realmente criar o sistema de arquivos raiz para isso, existe uma opção para gerar diretamente uma imagem desse tipo.

  2. Em vez de apenas ter uma partição raiz, use dois. Quando você fizer uma instalação inicial, escreva todos os dados nas duas partições e configure o bootloader para inicializar apenas a partir de um deles. Quando você atualizar o sistema, faça o nuke da outra partição, extraia seu arquivo raiz lá, atualize o gerenciador de inicialização para inicializar a partir dele e, em seguida, reinicialize. Embora isso leve um pouco mais para executar atualizações do que o que você está propondo, há algumas vantagens bastante grandes:

    • Permite reverter uma atualização que quebrou algumas funcionalidades quase instantaneamente. Em vez de ter que reinstalar o firmware antigo, basta atualizar o gerenciador de inicialização para inicializar a partição raiz e reinicializá-lo.
    • Torna muito difícil brockar o sistema. Como você só atualiza o gerenciador de inicialização depois que a atualização é concluída, você pode garantir que não será inicializado em um sistema de arquivos raiz parcial devido à perda de energia no meio de uma atualização.
    • Permite recuperar a corrupção de dados em repouso no hardware de armazenamento sem precisar de RAID (embora, se isso precisar ser um dispositivo confiável, você considere seriamente o RAID). Se você souber que sua versão atual é "ruim", retroceda temporariamente para a versão anterior e reinstale a nova versão.
    • Reduz o tempo de inatividade. Para a sua estratégia, você tem que fazer quase tudo com o dispositivo funcionalmente off-line (caso contrário, você corre o risco de as coisas falharem misteriosamente durante a atualização). Com esse método, você pode reduzir o tempo de inatividade necessário para uma atualização, independentemente do tempo necessário para reinicializar o dispositivo.
por 16.04.2018 / 21:12