%2C%20%D1%87%D1%82%D0%BE%D0%B1%D1%8B%20%D0%B2%D1%81%D0%B5%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B8%20%D0%B8%D0%BC%D0%B5%D0%BB%D0%B8%20%D0%BA%20%D0%BD%D0%B5%D0%BC%D1%83%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%3F.png)
Я пытаюсь использовать unionfs для создания нескольких (100+) экземпляров нескольких инструментов разработки для нашего сервера разработки. Вот скрипт, который я использую:
PROJECT=$1
DEPLOYMENT=$2
TOOL=$3
DIR_TOOL="/var/www/tools/${TOOL}"
DIR_CONFIG="/var/www/tools-instances/${PROJECT}/${DEPLOYMENT}/${TOOL}/config"
DIR_TMP="/var/www/tools-instances/${PROJECT}/${DEPLOYMENT}/${TOOL}/tmp"
DIR_MERGED="/var/www/tools-instances/${PROJECT}/${DEPLOYMENT}/${TOOL}/merged"
mkdir -p "${DIR_CONFIG}"
mkdir -p "${DIR_TMP}"
mkdir -p "${DIR_MERGED}"
unionfs -o cow "${DIR_TMP}"=RW:"${DIR_CONFIG}"=RO:"${DIR_TOOL}"=RO "${DIR_MERGED}"
А затем используйте это вот так:
create-tool-overlay.sh "project-1" "staging" "phpmyadmin"
Все работает отлично, но только для нашего manager
пользователя. Если я пытаюсь получить доступ к папке как любой другой пользователь, включая www-data
(кому нужен этот доступ) и root
(кому должен быть доступ ко всему), я получаю permission denied
. А если я пытаюсь запустить ls
на этой папке, я получаю этот странный вывод:
root@app-1:/var/www/tools-instances/project-1/staging/phpmyadmin# ls -al
ls: cannot access 'merged': Permission denied
total 32
drwxrwxr-x+ 5 manager manager 4096 Dec 16 15:51 .
drwxrwxr-x+ 3 manager manager 4096 Dec 14 15:29 ..
drwxrwxr-x+ 2 manager manager 4096 Dec 14 15:29 config
d?????????? ? ? ? ? ? merged
drwxrwxr-x+ 2 manager manager 4096 Dec 16 15:51 tmp
решение1
Используемый вами исполняемый файл unionfs
создалфайловая система впользовательское пространство(ПРЕДОХРАНИТЕЛЬ). Процесс управления файловой системой выполняется под определенным пользователем (в вашем случае: manager
), и другие пользователи не имеют доступа. Предоставление доступа другим пользователям менее безопасно. Читайте опроблемы безопасности.
Вы можете понизить уровень безопасности. Смотрите man 8 fuse
. Параметр allow_root
разрешит root использовать файловую систему. Параметр allow_other
разрешит любому использовать файловую систему. Эти параметры являются взаимоисключающими, похоже, вы хотите последний. Обратите внимание, что вам нужно поместить user_allow_other
в /etc/fuse.conf
, чтобы использовать allow_other
как обычный пользователь. Это соответствующий комментарий из default fuse.conf
в моем Kubuntu [ formatting
мой]:
user_allow_other
- Использованиеallow_other
опции монтирования отлично работает как root, чтобы она работала как пользователь, который вам нуженuser_allow_other
./etc/fuse.conf
(Эта опция позволяет пользователям использовать опциюallow_other
.) Вам нужно,allow_other
если вы хотите, чтобы пользователи, отличные от владельца, имели доступ к смонтированному fuse. Эта опция должна отображаться в строке сама по себе. Значения нет, просто наличие опции.
Вы передаете allow_other
как (часть) аргумента-опции -o
при вызове unionfs
. В вашем случае это будет так:
unionfs -o cow,allow_other …
Обратите внимание, если файловая система работает под определенным обычным пользователем, то она сможет делать (с базовым хранилищем) только то, что может делать этот пользователь. Например, если вы работаете unionfs
как manager
и allow_other
разрешаете www-data
использовать файловую систему, то любой файл, созданный с помощью, www-data
все равно будет принадлежать manager
. Другие ограничения, возможно, проявятся.
Запуск файловой системы root
может помочь, но см.уже связанный ответ. Бегать под root
ним не рекомендуется.
В целом FUSE разработан как универсальный способ для пользователей без прав root монтировать и использовать файловые системы длясами себя, не беспокоя настоящих администраторов. Чтобы использовать файловую систему с другими пользователями, правильный путь — иметь поддержку от ядра и от администратора, который может mount
.
AFAIK, UnionFS можно использовать как модуль ядра (не FUSE), но его нет в основном ядре, вам нужно собрать его самостоятельно. Если я правильно понимаю, UnionFS, реализованный в ядре, должен вести себя так, как вы ожидали.
В моем Kubuntu я могу использовать OverlayFS (это один изальтернативы) уже присутствует как модуль ядра (не FUSE).