我已成功设置 NFSv4 客户端和服务器,大致遵循设置 NFS HOWTO 中的指南。两者都运行 Ubuntu Linux 14.04。这是一个没有复杂认证的小型测试环境;两台服务器只是使用相同的密码文件。一切似乎都在正常工作;文件在客户端可见,并且权限/用户 ID 正确。
现在我想使用 NFSv4 ACL 来控制对 NFSv4 服务器上文件的访问。我在客户端上安装了必需的命令行工具,并且能够看到类似于 NFSv4 ACL 的内容:
$ nfs4_getfacl .
A::OWNER@:rwaDxtTcCy
A::GROUP@:rxtcy
A::EVERYONE@:rxtcy
Run Code Online (Sandbox Code Playgroud)
但是,虽然我可以很好地获取 ACL 列表,但我无法设置任何 ACL。每次尝试都会导致Invalid argument错误setxattr。
$ nfs4_setfacl -a A::OWNER@:rxtncy .
Failed setxattr operation: Invalid argument
Run Code Online (Sandbox Code Playgroud)
我使用 strace 来查看发生了什么。根据我能够找到的稀疏文档,NFSv4 ACL 作为二进制 XDR 数据存储system.nfs4_acl在文件上调用的扩展属性中。果然,这就是正在发生的事情;setxatt正在返回EINVAL。
getxattr("/primary/home/rstudiouser", "system.nfs4_acl", 0x0, 0) = 80
getxattr("/primary/home/rstudiouser", "system.nfs4_acl", "\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\xe7\x00\x00\x00\x06OWNER@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x06GROUP@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x09EVERYONE@\x00\x00", 80) = 80
setxattr("/primary/home/rstudiouser", "system.nfs4_acl", "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa9\x00\x00\x00\x06OWNER@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\xe7\x00\x00\x00\x06OWNER@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x06GROUP@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xa1\x00\x00\x00\x09EVERYONE@\x00\x00", 104, XATTR_REPLACE) = -1 EINVAL …Run Code Online (Sandbox Code Playgroud)