我正在尝试使用 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
unionfs
您使用的可执行文件在用户空间(FUSE)中创建了一个文件系统。管理文件系统的进程在特定用户下运行(在您的情况下:)manager
,其他用户无权访问。授予其他用户访问权限的安全性较低。阅读有关安全问题的信息。您可以降低安全性。看
man 8 fuse
。该选项allow_root
将允许 root 使用文件系统。该选项allow_other
将允许任何人使用文件系统。这些选项是相互排斥的,看来你想要后者。请注意,您需要放入user_allow_other
才能/etc/fuse.conf
作为allow_other
普通用户使用。fuse.conf
这是我的 Kubuntu [我的]中默认的相关评论formatting
:您在调用时将
allow_other
作为(的一部分)选项参数传递给. 在你的情况下,它将是这样的:-o
unionfs
请注意,如果文件系统在特定的普通用户下运行,那么它将只能(对底层存储)执行该用户可以执行的操作。例如,如果您运行
unionfs
并允许使用文件系统,那么创建的任何文件仍然属于。其他限制可能会显现出来。manager
allow_other
www-data
www-data
manager
在下面运行文件系统
root
会有所帮助,但请参阅已链接的答案。root
不建议在下面运行。一般来说,FUSE 被设计为一种通用方式,供没有 root 访问权限的用户自己挂载和使用文件系统,而无需打扰实际管理员。要与其他用户一起使用文件系统,正确的方法是获得内核和管理员的支持
mount
。AFAIK 可以将 UnionFS 作为内核模块(不是 FUSE),但它不在主线内核中,您需要自己构建它。如果我理解正确,在内核中实现的 UnionFS 应该像您预期的那样运行。
在我的 Kubuntu 中,我可以使用已经作为内核模块(不是 FUSE)存在的OverlayFS(这是替代方案之一)。