Как найти копии данных заданного файла в файловой системе Btrfs?

Как найти копии данных заданного файла в файловой системе Btrfs?

Я дедуплицировал свою файловую систему Btrfs с помощью bedup, так что теперь все дублирующиеся файлы (больше определенного размера) являются копиями «reflink».

Есть ли способ узнать, какие еще файлы являются такими же рефссылками, зная имя файла?

решение1

Весь смысл наличия файловой системы Copy-On-Write (CoW), такой как btrfs, заключается в том, что содержимое нескольких версий файла может эффективно совместно использоваться. Таким образом, вы можете рассматривать файл как набор диапазонов с содержимым, где содержимое может или не может совместно использоваться другими файлами. Или другими версиями файла. Реализация больше похожа на дерево расширений, где расширения могут совместно использоваться.

Тот же механизм, который работает при записи изменений в файл (и, следовательно, создании новой версии этого файла), используется для выполнения дедупликации. Реализация описана наhttps://github.com/g2p/bedup:

Дедупликация реализована с использованием функции Btrfs, которая позволяет клонировать данные из одного файла в другой. Клонированные диапазоны становятся общими на диске, что экономит место.

Реализация в ядре находится (например) по адресуhttp://lxr.free-electrons.com/source/fs/btrfs/ioctl.c#L2843; комментарий ясно дает понять, что речь идет не о «перелинковке» файла, а о диапазонах:

2843 /**
2844  * btrfs_clone() - clone a range from inode file to another
2845  *
2846  * @src: Inode to clone from
2847  * @inode: Inode to clone to
2848  * @off: Offset within source to start clone from
2849  * @olen: Original length, passed by user, of range to clone
2850  * @olen_aligned: Block-aligned value of olen, extent_same uses
2851  *               identical values here
2852  * @destoff: Offset within @inode to start clone
2853  */

Так что это не файл, который повторно ссылается, это диапазон, который является общим. Новый файл также мог быть создан путем совместного использования диапазона с несколькими файлами. Или совместного использования между томами. Или (не уверен, поддерживается ли это в настоящее время) даже имея один и тот же диапазон несколько раз в одном файле ;)

Следовательно, не существует высокоуровневого инструмента для поиска файлов, которые разделяют весь файл, поскольку это производная концепция. Конечно, можно было бы написать поддержку для этого, но это не так, насколько я знаю...

решение2

Я только что выпустил программу под названиемfienode(← ссылка) которая вычисляет хэш SHA1 физических экстентов файла. Идентичные копии CoW имеют одинаковый хэш.

В принципе, вы можете запустить этот тест для всех файлов в файловой системе, а затем поискать идентичные хеши.

Здесь также есть более подробный ответ, объясняющий, почему это необходимо.

Однако следует отметить, что BTRFS может свободно изменять физические экстенты. Я наблюдал, как большой файл с перелинкованными ссылками менял свои физические экстенты без какой-либо причины, из-за чего вывод становился fienodeдругим, хотя большинство физических экстентов по-прежнему были общими.

Связанный контент