Я создал инструмент Python, который может сделать это. Я сделал это потому, что попробовал подход @Thomas Luzat как в своей собственной, так и в реализации @Johannes Ernst, а используемое пространство удвоилось с 20GB до 40GB в процедуре клонирования. Я думал, что нужно что-то более эффективное.
Рассмотрим эту общую историю файловой системы:
current ---------------------------------\
| | | |
snap4 snap3 snap2 snap1
С помощью алгоритма Томаса "текущий" будет клонирован первым, и все снимки (являющиеся снимками предыдущих состояний "текущего") будут использовать "текущий" в качестве источника / родителя клона. Очевидно, что было бы лучше основать snap3 на snap4, snap2 на snap3 и т.д.
И это только верхушка айсберга; Найти "лучшие" источники клонов (с точки зрения экономии места) в файловой системе btrfs со сложной историей - нетривиальная проблема. Я предложил 3 другие стратегии для решения этой проблемы, которые, кажется, используют пространство намного эффективнее. Один из них на самом деле привел к размеру клонов чуть ниже исходного.
Вы можете прочитать подробности на странице GitHub, если вам интересно.