Чи є файлова система, яка зберігає лише одну копію файлу, а інші копії - лише посилання?


18

Питання може бути неточним, тому я спробую пояснити його більш детально.

З кількох причин у моїй файловій системі Linux є багато копій одного файлу . Багато з них досить великі.

Скажіть, у мене є /path/to/some.fileі копії цього файлу, /other/path/file.nameі /yet/another/path/third.copy. Цікаво, чи існує файлова система, яка буквально змусила б два з цих файлів діяти як посилання на оригінал. Природно, якщо користувач модифікує одну з них, то і лише тоді вони стають незалежними файлами.

PS. Я знаю, що це можна (частково) досягти за допомогою посилань. Але я хочу, щоб ця функція, яку я намагався пояснити вище, була прозоро оброблена файловою системою.


Оскільки, здається, ще немає ідеальної відповіді, чому б не написати сценарій (можливо, запустити з cron), який замінює файли жорсткими посиланнями (або, якщо це безпечно для деяких з них, посиланнями)? У будь-якому випадку, якщо ви ще не знаєте, де всі дублікати, перегляньте fdupes code.google.com/p/fdupes .
Джо

1
Я не можу цього зробити, оскільки коли якийсь користувач змінює дані в одному з дублікатів, вони повинні стати незалежними файлами, оскільки вміст після зміни стає іншим ... Якщо я буду символічні посилання, то модифікація фактично змінить оригінал. Подумайте про вихідний файл як про значення у функціональній мові програмування - коли ви модифікуєте його, ви отримуєте буквально новий об’єкт і посилаєтесь на нього.
DejanLekic

ДОБРЕ. Лише декілька ідей: чи є спосіб, яким ви можете дістатись між вашими користувачами та цими файлами? Якщо можете, ви можете почати зі посилання (sym або hard), а потім розірвати посилання, якщо вони щось записують у файл. Ви також можете використовувати щось на зразок diff, щоб просто зберігати відмінності, щоб заощадити багато місця, як у системі управління версіями. Якщо ви помістите файли в один із таких, вони можуть управляти різницями для вас. Я мало використовував системи vcs, тому не знаю деталей.
Джо

Відповіді:


17

Ця особливість називається дедупликацією . Жодна з популярних файлових систем Linux (ext *) не підтримує її, але, мабуть, ZFS підтримує її частково . Існує також таблиця файлових систем, в якій перераховано дедупликацію, але, схоже, не існує жодного популярного вибору - хоча це є плановою функцією для Btrfs.

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


Я сподівався, що BTRFS матиме це протизаконно. Я не знав, що вони планують мати цю особливість - хороші новини! Спасибі!
DejanLekic

10

Основне ключове слово, яке ви хочете шукати, - це "копіювати при записі". У BTRFS є операція з клонуванням, яка виконує саме те, що ви хочете, і cp --reflinkбуде робити те, що ви шукаєте, за умови, що у вашій системі є досить сучасне ядро ​​та coreutils 7.5. Wiki Source Також bedup - це інструмент, який об'єднує дублікати на весь обсяг. CoW також є рушійною силою під технологією знімків btrfs, IIRC.


Мені відомо, cp --reflinkале зауважте, що я дійсно хочу, щоб ФС виявляла клони і використовувала замість них посилання прозоро. Я також віддалений bedupінструменту.
DejanLekic

Коли процес на рівні користувача читає з одного файлу і записує в інший, то як FS-шар дізнається, що це точна копія, а не змінена копія? Ось чому існує окремий йокт для клонування проти простого читання та письма. Програми, які хочуть клонувати файли і хочуть використовувати CoW, повинні використовувати такі речі, коли вони доступні, і повернутися назад. Немає надійного магічного методу, за допомогою якого FS-шар може виявляти копію, яка відбувається, а замість цього робити CoW. Додаток повинен або використовувати відповідний виклик для роботи ( cp --reflink/ клонування) або окремий інструмент, щоб закінчити роботу пізніше (спадання).
afrazier

Порівнюючи хеші (більш безпечні) або значення crc + часові позначки. Запис обов'язково призведе до того, що FS створить незалежну копію файлу. Крім того, ця система може бути впроваджена на рівні сторінки ...
DejanLekic

І де саме в ядрі це зроблено? Те, про що ви говорите, не є простою проблемою. Зробити це на рівні сторінки також можливо, але потрібні великі обсяги оперативної пам’яті, щоб зробити вбудований - ZFS може бути більше 20 ГБ оперативної пам’яті на ТБ даних [Джерело ], а OpenDedup хоче 8 ГБ оперативної пам’яті на ТБ даних w / 4k сторінки [Джерело ]. Вимоги ZFS можна зменшити за допомогою L2ARC за рахунок продуктивності.
afrazier

1
WHS не робить дедуптування, якщо ви не говорите про магазин резервного копіювання. Що стосується резервного програмного забезпечення, клієнт може виконати більшу частину роботи та перевірити хеш із сервером, перш ніж надсилати на нього будь-які дані для запису. Служба резервного копіювання - це зовсім інший звір, ніж файлова система. Стратегії, які працюють для одного, можуть не бути життєздатними для іншого.
afrazier

4

Існує онлайн-файлова система S3QL, призначена для створення резервних копій з великою ємністю дедуплікації.


Я мав би сказати, що мені це потрібно для локальної файлової системи ... +1 все одно для корисної інформації.
DejanLekic

@DejanLekic, URL-адреси на зразок локальних: // ... дозволені.
Даніель Фанджул

0

Zfs, btrfs, ext3cow, bcachefs (afaik, але є ймовірність, що вона ще не реалізована). Майкрософт був у розробці, але вони зупинилися з невідомих причин.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.