为什么不能在一台机器上更改另一台机器上的 nfs 挂载内容?

gab*_*be. 14 permissions nfs

在我的 NFS 服务器上,我定义了以下导出:

#NFS exports Database
/shared -alldirs -network=192.168.1 -mask=255.255.255.0
Run Code Online (Sandbox Code Playgroud)

在我的 NFS 客户端上:

192.168.1.7:/shared /shared nfs rw 0 0
Run Code Online (Sandbox Code Playgroud)

显然,作为服务器上的 root,我可以为所欲为。然而,在客户端上,我的普通用户 'gabe' 可以更改 nfs 挂载(假设我有权限),但 root 不能。

作为我的普通用户:

gabe@client$ cd /shared
gabe@client$ ls -l
total 8
drwxrwxrwx  4 gabe  wheel   512 Mar 20 19:20 tmp
gabe@client$ cd tmp
gabe@client$ touch test.txt
gabe@client$ rm test.txt
Run Code Online (Sandbox Code Playgroud)

作为根:

# cd /shared/tmp
# touch test.txt
touch: test.txt: Permission denied
Run Code Online (Sandbox Code Playgroud)

同样,这一切都在 NFS客户端,我怀疑这可能与 -maproot 选项有关。这是我第一次设置 NFS,我刚刚注意到这个特性。我现在要做一些阅读,看看我是否能解决这个问题,但如果有人有任何见解,我将不胜感激。

cjm*_*cjm 18

NFS 的设计理念是用户和组 ID 在网络上的所有机器上都是相同的。对于普通用户来说,这工作正常。但是 root 的 UID 总是 0,仅仅因为你在一个机器上有 root,并不意味着你应该对网络上的每一台机器都有 root 访问权限。

因此,NFS 特别对待 root。默认情况下,root 映射到nobody通常没有写访问权限的用户。该-maproot选项允许您更改处理 root 的方式。BSD-maproot=root对应于 Linux 的no_root_squash选项。


Gil*_*il' 5

这是传统 NFS 实现的常见行为。NFS 用户映射的执行与上下文无关,因此客户端 root 的所有访问都必须映射到特定用户(通常nobody默认情况下)。因此,这种奇怪的行为,客户端根不能直接访问您的文件,但可以su gabe访问它们。

(“最近”版本的 NFS,即 NFSv4 和 NFSv3,如果双方都支持,则允许更理智的行为,但我不知道细节。)