我有两台 Linux 服务器:
文件服务器
Debian 5.0.3(2.6.26-2-686)
Samba 版本 3.4.2
阿帕奇
Ubuntu 10.04 LTS(2.6.32-23-通用)
Apache 2.2.14
我有许多 Samba 共享文件服务器这样我就可以从 Windows PC 访问文件。我还导出/data/www-data
到阿帕奇服务器,我已将其安装为/var/www
。
设置没问题,除了当我在 NFS 挂载上创建文件时。我最终得到的文件无法被 Apache 读取,或者无法被系统上的其他用户修改。
使用 Samba,我可以指定force user
、force group
和,这可确保所有文件都具有适合我的 Apache Web 服务器的权限。我找不到使用 NFS 执行此操作的方法。有没有办法使用 NFS 强制执行权限和所有权 - 我是否遗漏create mask
了directory mask
一些显而易见的东西?
尽管我已经在 Linux 上花了相当多的时间,并且正在逐渐摆脱对 Windows 的依赖,但我仍然还没有完全掌握 Linux 权限...如果这不是正确的做事方式,我愿意接受其他建议。
答案1
鉴于您来自 Windows,您会发现 NFS 是....不同的。
您遇到的问题相当常见。NFS 正在机器之间来回传递文件/目录的 UID 和 GID假设用户和组 ID 在两个设备上的映射相同。这意味着您可能会遇到这样的情况:服务器上的 UID/GID 被传回 NFS 客户端,但无法在客户端的/etc/passwd
或中匹配/etc/group
,这意味着无法访问。
在(遥远的)过去,这与 NIS 和 NIS+ 协调一致,尽管还有其他方案被纳入这个框架(Samba 的 Winbind 就是其中之一)。然而,这需要一个中央 ID 服务器,随后需要大量手动修复权限。
有多种方法可以解决此问题,但最便宜/最快捷的方法是创建一个在两台机器上具有相同组 ID 号的组 - 比如,组 ID 50000 - 并在文件服务器上设置组位,同时在客户端上将适当的用户添加到该组;然后使用文件上的组权限来控制访问。这不是一个好的解决方案,但它会起作用。请注意,您可能会遇到在运行时明确更改其组的服务问题(又称特权删除),您可能需要更改控制在运行时假定哪个组的设置,以确保它是您创建的组。
对于通过 Windows 共享(又名 Samba)传入的文件,只需强制组与您创建的组相同即可。这样,所有文件都会自动获得“正确的”GID。
答案2
您还可以使用all_squash
使所有导出的文件和文件夹匿名(用户和组)的选项,并将它们附加到特定的 GID 和 UID。
/data/www-data apache(rw,all_squash,anonuid=<your UID>,anongid=<your GID>,sync)
问题在于,apache
服务器上的所有用户都将以用户和组的身份看到您的挂载点nobody nobody
,并可以在挂载中写入(但无论如何,在 Samba 服务器上,文件将创建为<your UID>
/ <your GID>
)。