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

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

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

  • Использование Btrfs для устранения поврежденных архивов
  • Переместите установку linux с помощью btrfs в подчиненном стандарте по умолчанию (subvolid = 0) на другой подвыбор
  • Ошибка при создании файловой системы BTRFS
  • Должен ли пользователь ноутбука переключаться с ext4 на btrfs?
  • Баланс BTRFS завершен, но все же отображает данные, хранящиеся в режиме «одного»
  • Как отремонтировать btrfs после сломанного кабеля sata?
  • BTRFS конвертирует RAID0 в RAID1
  • BTRFS: добавление нового жесткого диска как / home после установки
  • 2 Solutions collect form web for “Как найти копии данных данного файла в файловой системе Btrfs?”

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

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

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

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

     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 */ 

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

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

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

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

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

    • Как проверить копию файла reflink / CoW?

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

    Linux и Unix - лучшая ОС в мире.