我正在设置一个带有共享目录的文件服务器。里面有任何用户都可以读取的每用户文件夹和任何用户都可以读取和写入的共享目录。每个用户的文件夹非常简单。但是,我在共享文件夹方面遇到了一些问题。我执行了创建 GID 文件夹的标准过程:
# chown root shared
# chmod -R ug+rwX shared
# chgrp -R users shared
# find shared -type d -exec chmod g+s "{}" \;
# find shared -type d -exec setfacl -m "default:group::rwx" "{}" \;
确保所有用户都在“users”组中后,通过直接控制台登录、ssh、rsync 等可以完美地工作。但是,samba 存在一些问题。
使用默认的 samba 配置,会传播 SGID 位和 GID,但新文件和文件夹没有设置组写入位。这似乎是因为 ACL 被忽略。根据Samba 忽略 POSIX ACL,解决办法是在smb.conf中添加vfs objects = acl_xattr
。当我设置它时,组写入权限已正确设置。然而,该组随后被设置为用户的主组而不是父目录的组,这违背了设置 GID 位的目的。我尝试了链接( 、 和 )中提到的其他 smb.conf 调整map acl inherit = yes
,store dos attributes = yes
但inherit acls = yes
这些没有效果。使这项工作有效的正确方法是什么?
答案1
要设置新文件和文件夹的组、用户和权限,我在服务器上使用此配置(在 中smb.conf
):
[shared-folder]
writeable = yes
force user = "user"
force group = "users"
create mask = 0664
force create mode = 0664
directory mask = 0775
force directory mode = 0755
您可以通过单独的共享文件夹以这种方式处理公共文件夹。
笔记:正如评论中指出的,此设置可能与 ACL 不兼容。我建议仅当您仅依赖 UNIX 权限时才执行此操作。
答案2
如果vfs objects = acl_xattr
,则自动inherit acls = yes
按照inherit acls
以下中描述的手册页进行操作smb.conf
:
请注意,使用 VFS 模块acl_xattr或将本机 Windows 存储为元数据的 acl_tdb 将自动为加载它们的任何共享打开此选项,因为它们需要此选项来正确模拟 Windows ACL。
一旦inherit acls
打开,用于创建新文件/目录的unix模式将为0777(有效地将该setgid
位清零):
启用此选项会将 unix 模式设置为 0777,从而保证传播默认目录 ACL。
明确指定inherit acls = no
并排vfs objects = acl_xattr
似乎可行,但它们可能不适合以这种方式一起使用,并且可能具有未知/隐藏的副作用。