/etc/exports中默认启用root_squash,要禁用需显式添加no_root_squash;修改后必须执行exportfs -ra重载配置,客户端须重新挂载才能生效权限变更。

直接改 /etc/exports 里的选项,然后重载配置即可,不需要重启服务。 但必须注意:客户端挂载行为不会自动更新,已有挂载点仍沿用旧权限逻辑,得手动重新挂载才生效。
怎么在 /etc/exports 里开关 root_squash
默认所有共享都启用 root_squash,要禁用它(即让客户端 root 保持权限),必须显式加 no_root_squash;反之,若想强制启用(比如覆盖某条误配的 no_root_squash),就删掉它,不写就是默认开启。
-
/shared 192.168.1.0/24(rw,sync)→ 默认启用root_squash,客户端 root 被映射为nobody -
/shared 192.168.1.0/24(rw,sync,no_root_squash)→ 客户端 root 在服务端也拥有 root 权限 -
/shared *(rw,sync,all_squash,anonuid=1001,anongid=1001)→ 所有用户(含 root)都被映射为 UID/GID 1001,和root_squash效果不同
改完配置后必须执行 exportfs -ra
只改文件不生效。常见错误是改完 /etc/exports 就去客户端测试,结果权限没变——因为内核导出表没刷新。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
exportfs -ra:重读全部导出规则并应用(推荐) -
exportfs -v:查看当前已生效的导出列表,确认目标目录是否带no_root_squash - 不用重启
nfs-kernel-server或rpcbind,除非你同时改了服务监听参数
客户端挂载后权限不更新?重新挂载是唯一办法
服务端改了 no_root_squash 并重载,但客户端已挂载的目录仍按旧规则校验 UID/GID。这不是缓存问题,是 NFS 协议层面的会话绑定行为。
- 先
umount /mnt/nfs,再mount -t nfs server:/shared /mnt/nfs - 如果挂载时用了
-o nolock或其他选项,重挂时需保持一致,否则可能报Stale file handle - 检查是否真被挂载成功:
findmnt -t nfs | grep /mnt/nfs,避免因路径错位导致你以为挂上了其实没动
最易忽略的一点:no_root_squash 是服务端配置,但它只影响“谁能在服务端以什么身份操作文件”,并不改变客户端本地的 root 身份或 umask。如果你发现文件创建后权限不对,大概率是客户端进程的 umask 或服务端目录本身的 setgid/ACL 在起作用,不是 no_root_squash 没生效。










