Если у меня есть 2 каталога, a и b, может ли кто-нибудь предложить удобный метод создания каталога, который, по-видимому, имеет содержимое как a, так и b, без копирования файлов? В данный момент я использую ln -s * для создания загрузки сим-ссылок, а затем удаляю сим-ссылки, когда закончу. Я бы предпочел, чтобы содержимое подкаталогов казалось объединенным, и управление этим с помощью метода сим-ссылок может потребовать некоторой возни.
Ничего страшного, если полученный каталог будет доступен только для чтения данным приложением.
решение1
Вы можете эффективно объединять каталоги с помощьюСоюзФСпутем наложения двух каталогов (в данном контексте называемых ветвями) на одну единую точку монтирования.
Существует несколько реализаций UnionFS;UnionFsFuseявляется одним из самых простых, поскольку представляет собой приложение (а не патч ядра).
На сайте есть ссылка на их архив. Компиляция исходного кода должна быть простой на большинстве дистрибутивов.
В Ubuntu, например, достаточно установить пакетunionfs-предохранительвыполнив следующую команду:
sudo apt-get install unionfs-fuse
После установки вы можете приступить к наложению каталогов. Существует множество вариантов. Я кратко объясню самые основные из них:
Команда
unionfs-fuse foo:bar baz
накладывает содержимое каталоговфуибарв каталогебаз. 1
Этот оверлей будет доступен только для чтения; любая попытка создать или изменить файл вбазприведет кДоступ запрещен.ошибка. Однако вы все равно сможете создавать и изменять файлы внутрифуибарсами себя.
Коллизии обрабатываются фиксированным образом: если файл существует в более высокой ветке (фу), он будет иметь приоритет перед файлом с тем же именем в более низкой ветке (бар).
Команда
union-fuse foo=RW:bar=RO baz
делаетфузаписываемый ибар(только для чтения). Изменение файловфубудет возможно, но изменение файловбарне будет. Все вновь созданные файлы вбазпоявится вфу.
Команда
union-fuse -ocow foo=RW:bar=RO baz
похожа на предыдущую команду.копирование при записиопция (
cow
) имеет эффект, что попытка изменить файлбарвнутрибазприведет к созданию измененной копии файла вфу(или любая другая записываемая ветвь более высокого уровня).С командой
union-fuse foo=RW:bar=RW baz
все можно изменить. Новые файлы будут созданы в верхней ветке (фу).
Команда
union-fuse foo=RO:bar=RW baz
позволяет изменять файлыбарвнутрибаз, но новые файлы не могут быть созданы.
Команда
sudo umount baz
отменяет крепление соединения.
Смотрите также:человек unionfs-fuse
1 баздолжен существовать до выполнения этой команды. Это относится и ко всем последующим командам.