He creado una herramienta de Python que puede hacer esto. Hice esto porque probé el enfoque de @Thomas Luzat tanto en mi propia implementación como en la de @Johannes Ernst, y el espacio utilizado se duplicó de 20GB a 40GB en el procedimiento de clonación. Pensé que se necesitaba algo más eficiente.
Considere este historial común del sistema de archivos:
current ---------------------------------\
| | | |
snap4 snap3 snap2 snap1
Con el algoritmo de Thomas, "actual" se clonaría primero, y todas las instantáneas (que son instantáneas de estados anteriores de "actual") usarían "actual" como fuente de clon / padre. Obviamente, sería mejor basar snap3 en snap4, snap2 en snap3, etc.
Y esto es solo la punta del iceberg; encontrar las "mejores" fuentes de clonación (en términos de ahorro de espacio) en un sistema de archivos btrfs con un historial complejo es un problema no trivial. Se me ocurrieron otras 3 estrategias para resolver este problema, que parecen utilizar el espacio de manera mucho más eficiente. Uno de ellos ha resultado en clones de tamaño ligeramente inferior al de la fuente.
Puede leer los detalles en la página de Github si está interesado.