Uma tentativa de uma solução on-line , mas não está exatamente lá.
A configuração (por exemplo, em /tmp directory, como root):
LOWER=$HOME
mkdir u1 w1 o1 O
mount -t overlay overlay -o lowerdir=$LOWER,upperdir=u1,workdir=w1 o1
mount --bind o1 O
Em seguida, você pode trabalhar no diretório O , que é uma sobreposição de $LOWER . Quando você quer fazer o instantâneo:
mkdir u2 w2 o2
mount -t overlay overlay -o lowerdir=o1,upperdir=u2,workdir=w2 o2
(Observe que as sobreposições aninhadas como essa não funcionarão em kernels mais antigos).
Mas, em seguida, quero mudar a montagem de ligação atomicamente em O para apontar para o2 em vez de o1 . Eu não sei como fazer isso além de:
%código%
( Não atômico ; há uma janela onde
umount O
mount --bind o2 O
é desmontado).
O ideal é que os processos em execução continuem sendo executados sem saber que o sistema de arquivos subjacente de O foi alterado de O para o1 . Eu não sei se isso é possível, ou se alterar o sistema de arquivos subjacente de o2 como este irá interromper demais os aplicativos abertos. Eu preciso investigar mais.
Em seguida, quando O tiver sido redirecionado para O , podemos remontar o2 somente leitura como precaução e, em seguida, realizar uma mesclagem off-line usando, por exemplo, rdiffdir ou overlayfs-tools.
Por fim, gostaríamos de remontar atomicamente o1 as o2 para que lowerdir=$HOME,upperdir=u2,workdir=w2 , o1 e u1 (todas agora dirs vazias) pudessem ser removidas. Mais uma vez, não sei se isso é possível.
Caso contrário, podemos obter snapshots apenas aninhando sobreposições mais e mais e deixando a sobreposição e dirs superiores para cada montado sem tentar mesclar ou limpar. Mas provavelmente há um limite para o número de sobreposições aninhadas que podem ser montadas. E, em algum momento, ainda precisamos mesclar as camadas se quisermos persistir as alterações.