Я играю с 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.
Два файла совместно используют дедуплицированные/клонированные данные на накопителе, если они совместно используют какие-либо идентичные или перекрывающиеся диапазоны.
Что касается определения того, где оригинал, а где клон… Это практически невозможно определить без машины времени.