我正在尝试使用 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
以便作为普通用户使用。这是我的 Kubuntu [我的]中allow_other
的默认相关注释:fuse.conf
formatting
user_allow_other
- 使用allow_other
mount 选项可以很好地以 root 身份工作,为了让它以用户身份工作,您也需要这样做user_allow_other
。/etc/fuse.conf
(此选项允许用户使用该allow_other
选项。)allow_other
如果您希望所有者以外的用户访问已安装的保险丝,则需要这样做。此选项必须单独出现在一行上。没有值,只是选项的存在。
在调用时,你将allow_other
选项参数(部分)传递给 。在你的情况下它将是这样的:-o
unionfs
unionfs -o cow,allow_other …
请注意,如果文件系统在特定普通用户下运行,那么它将只能执行该用户可以执行的操作(对底层存储)。例如,如果您unionfs
以用户身份运行manager
并allow_other
允许www-data
使用文件系统,那么由其创建的任何文件www-data
仍然属于manager
该文件系统。其他限制可能会自行显现。
运行文件系统root
可能会有所帮助,但请参阅已经链接答案root
。不建议在下面跑步。
总体而言,FUSE 的设计初衷是为没有 root 权限的用户提供一种通用方式来挂载和使用文件系统他们自己,而无需打扰实际管理员。要与其他用户一起使用文件系统,正确的方法是获得内核和能够 的管理员的支持mount
。
据我所知,UnionFS 可以作为内核模块(而不是 FUSE),但它不在主线内核中,您需要自行构建。如果我理解正确的话,内核中实现的 UnionFS 应该会像您预期的那样运行。
在我的 Kubuntu 中我可以使用 OverlayFS(它是备择方案) 已经作为内核模块存在(不是 FUSE)。