我们在使用 NFS 时遇到了一个问题。如果目录是在 NFS 服务器上创建的,我们就无法写入 NFS 客户端计算机上的目录。原因似乎是文件/目录权限和用户映射。
我们的设置:
我们有 2 个 EC2 节点 - Ubuntu 16.04.2 LTS
一台机器上安装的NFS服务器:
ubuntu@master:~$ less /etc/exports
/home/ubuntu/data *(rw,no_subtree_check,sync,insecure)
同一目录安装在另一台机器上:
sudo mkdir /home/ubuntu/data
sudo mount -t nfs masterIp:/home/ubuntu/data /home/ubuntu/data
我们面临的一个问题:
当我们在主服务器上的 NFS 中创建目录时,它的创建方式如下:
# sudo mkdir /home/ubuntu/data/Test
# sudo ls -all /home/ubuntu/data
drwxr-xr-x 2 root root 4096 Jul 5 07:19 Test
主节点可以毫无问题地访问此目录,在其中创建文件等。但是,当我们尝试从测试目录中的从属节点创建文件时,我们得到了权限被拒绝的错误。
当我们从 NFS 客户端机器创建目录时,它看起来像这样:
# sudo mkdir /home/ubuntu/data/Test2
# sudo ls -all /home/ubuntu/data
drwxr-xr-x 2 root root 4096 Jul 5 07:19 Test
drwxr-xr-x 2 nobody nogroup 4096 Jul 5 07:21 Test2
因此,似乎 NFS 客户端的 root 用户在写入 NFS 目录时被映射到 nobody@nogroup,因此无法写入 NFS 服务器上由 root 用户创建的目录。我们需要将 NFS 客户端的 root 用户映射到 NFS 服务器的 root 用户,这样他们俩都可以自由地处理目录,无论我们在哪里创建目录。
答案1
no_root_squash
在您的条目中使用选项/etc/exports
。从的手册页exports
:
用户 ID 映射
nfsd 根据每个 NFS RPC 请求中提供的 uid 和 gid 对服务器计算机上的文件进行访问控制。用户期望的正常行为是,她可以像在普通文件系统上一样访问服务器上的文件。这要求在客户端和服务器计算机上使用相同的 uid 和 gid。这并不总是正确的,也不总是理想的。
通常,当访问 NFS 服务器上的文件时,不希望客户端计算机上的 root 用户也被视为 root 用户。为此,uid 0 通常映射到不同的 id:所谓的匿名或没有人用户ID。此操作模式(称为“根压缩”)是默认模式,可以使用 关闭
no_root_squash
。