Существует ли файловая система, в которой хранится только одна копия файла, а остальные копии являются просто ссылками?

18

Вопрос может быть неточным, поэтому я попытаюсь объяснить его более подробно.

По ряду причин у меня есть много копий одного и того же файла в моей файловой системе Linux. Многие из них довольно большие.

Скажем, у меня есть /path/to/some.fileи копии этого файла, /other/path/file.nameи /yet/another/path/third.copy. Интересно, существует ли файловая система, которая буквально заставила бы два из этих файлов действовать как ссылка на оригинал? Естественно, если пользователь изменяет один из них, тогда и только тогда они становятся независимыми файлами.

PS. Я знаю, что это может быть (частично) выполнено с помощью ссылок. Но я хочу, чтобы эта функция, которую я пытался объяснить выше, была прозрачно обработана файловой системой.

DejanLekic
источник
Поскольку пока что нет идеального ответа, почему бы не написать скрипт (возможно, запущенный из cron), который заменяет файлы жесткими ссылками (или, если это безопасно для некоторых из них, символическими ссылками)? В любом случае, если вы еще не знаете, где находятся все дубликаты, посмотрите fdupes code.google.com/p/fdupes .
Джо
1
Я не могу этого сделать, потому что, когда какой-либо пользователь изменяет данные в одном из дубликатов, они должны стать независимыми файлами, потому что содержимое меняется после изменения ... Если я создаю символические ссылки, тогда модификация фактически изменит оригинал. Думайте об оригинальном файле как о значении в функциональном языке программирования - когда вы изменяете его, вы получаете буквально новый объект и ссылку на него.
DejanLekic
OK. Просто некоторые идеи: есть ли какой-нибудь способ, которым вы можете получить между вашими пользователями и этими файлами? Если вы можете, вы можете начать со ссылки (sym или hard), а затем разорвать ссылку, если они что-то напишут в файл. Вы также можете использовать что-то вроде diff, чтобы просто хранить различия, чтобы сэкономить много места, как в системе контроля версий. Если вы поместите файлы в один из них, он сможет справиться с различиями. Я не пользовался системами vcs, поэтому не знаю деталей.
Джо

Ответы:

17

Эта функция называется дедупликацией . Ни одна из популярных файловых систем Linux (ext *) не поддерживает его, но, очевидно, ZFS поддерживает его частично . Существует также таблица файловых систем, в которой перечислены, среди прочего, дедупликация, но, похоже, нет популярных вариантов - это запланированная функция для Btrfs.

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

Клавдий
источник
Я надеялся, что в BTRFS это будет сделано. Я не знал, что они планируют иметь эту функцию - хорошая новость! Благодарность!
DejanLekic
10

Основное ключевое слово, которое вы хотите найти, - «копировать при записи». В BTRFS есть операция клонирования, которая делает именно то, что вы хотите, и cp --reflinkбудет делать то, что вы ищете, при условии, что ваша система имеет достаточно современное ядро ​​и coreutils 7.5. Wiki Source Кроме того, bedup - это инструмент, который объединяет дубликаты по всему объему. CoW также является движущей силой технологии создания снимков btrfs, IIRC.

afrazier
источник
Я знаю, cp --reflinkно отмечу, что на самом деле я хочу, чтобы FS обнаруживал клонов и использовал ссылки вместо этого, прозрачно. Я также отошел от bedupинструмента.
DejanLekic
Когда процесс уровня пользователя читает из одного файла и записывает в другой, как уровень FS узнает, что это точная копия, а не измененная копия? Вот почему существует отдельный ioctl для клонирования, а не только для чтения и письма. Приложения, которые хотят клонировать файлы и хотят использовать CoW, должны использовать такие вещи, когда они доступны, и использовать их в противном случае. Не существует надежного магического метода, с помощью которого слой FS может обнаружить происходящее копирование и вместо этого сделать CoW. Приложение должно либо использовать соответствующий вызов для задания ( cp --reflink/ клон), либо отдельный инструмент, чтобы завершить работу позже (постель).
afrazier
Сравнивая хэши (более безопасные) или значения crc + timestamp. Запись определенно заставит FS создавать независимую копию файла. Более того, эта система должна быть реализована на уровне страниц ...
DejanLekic
И где именно в ядре это сделано? То, о чем ты говоришь, не простая проблема. Выполнение этого на уровне страницы также возможно, но требует огромного объема оперативной памяти для оперативной работы - у ZFS может быть более 20 ГБ ОЗУ на ТБ данных [Source ], а OpenDedup требуется 8 ГБ ОЗУ на ТБ данных с / 4k страниц [Источник ]. Требования ZFS могут быть уменьшены с L2ARC за счет производительности.
afrazier
1
WHS не выполняет дедупликацию, если только вы не говорите о хранилище резервных копий. В случае программного обеспечения для резервного копирования клиент может выполнить большую часть работы и проверить хеш с сервером перед отправкой любых данных на него для записи. Служба резервного копирования - это совсем другой зверь, чем файловая система. Стратегии, которые работают для одного, могут быть нежизнеспособными для другого.
afrazier
4

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

Даниэль Фанжул
источник
Я должен был сказать, что мне нужно это для локальной файловой системы ... +1 в любом случае для полезной информации.
DejanLekic
@DejanLekic, URL-адреса, такие как local: // ... разрешены.
Даниэль Фанжул
0

Zfs, btrfs, ext3cow, bcachefs (афаик, но есть вероятность, что он еще не реализован). У Microsoft был один в разработке, но они остановились по неизвестным причинам.

orange_juice6000
источник