Как проверить, является ли копия файла рефлинком/CoW?

Как проверить, является ли копия файла рефлинком/CoW?

Я играю с btrfs, которая позволяет cp --reflinkкопировать при записи. Другие программы, такие как lxc-clone, также могут использовать эту функцию. Мой вопрос в том, как определить, является ли файл CoW другого? Как и для жесткой ссылки, я могу определить по номеру инода.

решение1

Хороший вопрос. Похоже, что в настоящее время нет простых высокоуровневых способов определить.

Одна из проблем заключается в том, что файл может делиться только частью данных через Copy-on-Write. Это называется физическим экстентом, инекоторый или всефизических экстентов могут совместно использоваться файлами CoW.

Нет ничего аналогичного inode, которое при сравнении файлов показало бы, что файлы имеют одинаковые физические экстенты. (Редактировать: см.мой другой ответ).

Ответ на низком уровне заключается в том, что вы можете спросить ядро, какие физические экстенты используются для файла, используяFS_IOC_FIEMAP ioctl, которыйзадокументировано вDocumentation/filesystems/fiemap.txt. В принципе, если все физические экстенты одинаковы, то файл должен совместно использовать одно и то же базовое хранилище.

Мало что реализует способ просмотра этой информации на более высоком уровне. Я нашел некоторыевведите код здесь. По-видимому,filefragутилита должна показывать экстенты с -v. Кроме того,btrfs-debug-treeпоказывает эту информацию.

Однако я бы проявил осторожность, поскольку эти вещи, возможно, не нашли широкого применения в реальных условиях, и вы можете обнаружить ошибки, дающие неверные ответы. Поэтому будьте осторожны, полагаясь на эти данные при принятии решений об операциях, которые могут привести к повреждению данных.

Некоторые сопутствующие вопросы:

решение2

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

решение3

Самым простым решением для этого является использование btrfs filesystem du . Exclusive, который будет равен 0,00B, если это CoW.

Найдено здесь:https://unix.stackexchange.com/a/655813/525352

решение4

Это не добавляет многого к принятому ответу, но кто-то обобщил проблемы и несколько методов здесь -https://www.ctrl.blog/entry/distinguish-file-link-clone.html

Проблемы:

  • различать символические ссылки и жесткие ссылки от реф-ссылок
  • определить частичные клоны (файлы, которые разделяют некоторые, но не все данные)

Решения:

  • Использовать файлфрагмент
  • Используйте statдля идентификации устройства, поскольку клоны должны находиться в одной и той же файловой системе.

Цитировать:

Жесткие ссылки имеют тот же номер инода, что и их назначение, тогда как клоны имеют свои собственные иноды. Это различие (плюс файловая система копирования при записи) позволяет клонам действовать независимо от своих оригиналов, даже если они изменены не клонирующими программами".

  • Выполните команду filefrag -v file1 file2 (часть e2fsprogs). Сравните диапазоны physical_offset файлов в строках экстентов, в которых установлен флаг shared.

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

Что касается определения того, где оригинал, а где клон… Это практически невозможно определить без машины времени.

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