Fundo
Eu mantenho uma série de instantâneos de hora em hora no meu sistema de arquivos btrfs usando btrbk . O subvolume e os instantâneos são armazenados assim (nomes encurtados para facilitar o acompanhamento):
/@vol (subvolume)
/btrbk/@vol.00 (snapshots of /@vol, one per hour)
/btrbk/@vol.01 ...
/home/user/vol (mountpoint for /@vol)
Agora apaguei um único arquivo no /home/user/vol
qual não deveria ter apagado. Sem problemas, posso restaurar facilmente a partir do instantâneo mais recente:
# cd /home/user/vol
# cp -a --reflink=always /btrbk/@vol.01/all_ipv4_numbers.txt ./
cp: failed to clone './all_ipv4_numbers.txt' from '/btrbk/@vol.01/all_ipv4_numbers.txt': Invalid cross-device link
Parece que não consigo "reflinkar" o arquivo. Mas eu não quero acabar com duas cópias do arquivo. Idealmente, quero que pareça que nada aconteceu entre o instantâneo mais recente e o próximo instantâneo que será tirado no futuro.
(Sim, também tenho backups reais, mas a restauração de instantâneos é mais conveniente sempre que disponível!)
Pergunta
Como faço para restaurar um único arquivo de um instantâneo do btrfs, mantendo todas as boas referências e mágicas que fazem o btrfs saber que são os mesmos dados em todos os instantâneos?
Em kernels Linux anteriores a 5.18 (especificamente, commit
9f5710b
), você só poderia usarcp --reflink
quando a origem e o destino estivessem no mesmo ponto de montagem. Para este propósito, montar o mesmo sistema de arquivos em vários diretórios não contava. Atualize para o Linux 5.18 ou mais recente ou monte o volume "raiz" do sistema de arquivos btrfs em algum lugar e façacp --reflink
entre o subvolume do instantâneo e o @vol que estão nesse diretório.