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.