homebrew nfs network for file shareing-爱代码爱编程
环境介绍
nfs server 优麒麟 OS作为NFS服务器:

nfs client, ubuntu 22.04 作为NFS 客户端:

网络拓扑结构,网关1安装在客厅,为了加强卧室信号,用一台小米路由器作为信号中继,拓扑结构如下:

NFS Server路由信息,可见前两跳分别是两个网关

NFS Client信息:

安装环境:
NFS Server端
sudo apt-get update
sudo apt-get install inetutils-traceroute traceroute
sudo apt-get install nfs-kernel-server
NFS Client端
sudo apt install nfs-common
内核配置:
如果使用自编译的内核,需要打开如下配置项:
Networking support ---> Networking options --->TCP/IP networking ---> IP: kernel level autoconfiguration
File systems ---> Network File Systems
Networking support ---> Networking options --->TCP/IP networking
File systems ---> Networking File Systems ---> NFS client support(子级都选上)
File systems ---> Networking File Systems ---> Root file system on NFS


服务器配置
默认情况下,nfs 服务器上定义了某个共享目录,则该目录及其子目录下的所有文件都可被访问。
出于对安全的考虑,客户端任何需要 超级用户 (即 root 用户,uid=0 & gid=0)权限的文件操作都默认映射到 uid=65534 和 gid=65534 的用户,即 ubuntu 系统中的 nobody:nogroup。
例如客户端使用 root 权限在挂载的共享目录中创建文件时,该文件的 属主 和 属组 自动变为 nobody:nogroup ,而非 root:root 。
1. 在服务器端创建共享目录
sudo mkdir -p /var/nfs/gernel
sudo mkdir -p /var/nfs/public
sudo chown nobody:nogroup /var/nfs/gernel
2. 修改 exports 文件
为了使 nfs 服务器定义的共享文件可被指定的客户端主机访问,需要在服务器端的 /etc/exports 文件中添加对应的记录。
/var/nfs/gernel *(rw,insecure,sync,no_subtree_check)
/var/nfs/public *(ro,insecure,sync,no_subtree_check)

第一条纪录表示 子网 中的所有主机都可挂载 var/nfs/gernel 目录并拥有读写( rw )权限
第二条纪录表示 所有 主机都可挂载 /var/nfs/public 目录且拥有 只读 ( ro )权限
insecure选项:允许通过任意端口的远程访问
sync选项:强制 nfs 服务器在响应请求之前将文件的改动写入磁盘(强调客户端和服务端文件内容的一致性,但会降低文件操作的效率)。
no_subtree_check选项:禁用 subtree_check 。subtree_check 用来设置服务器在收到请求时,检查该文件是否在指定目录结构中依旧可用(该选项会在某些情况下发生错误:重命名某文件的同时,该文件在客户端打开)。
启动NFS 服务
sudo systemctl stop nfs-kernel-server
sudo systemctl start nfs-kernel-server
sudo systemctl restart nfs-kernel-server
至此,服务器端配置完毕,接下来在客户端操作。
客户端查看服务端目录共享情况
客户端安装nfs-common工具后,可以通过showmount命令查看NFS Server端的共享目录,如下图所示:
sudo showmount -e 192.168.31.156

挂载
在客户端执行如下命令进行挂载:
sudo mount -t nfs 192.168.31.156:/var/nfs/gernel /mnt

nfs 的权限设定基于 linux 文件系统的权限管理,即客户端挂载远程共享目录后,会把它们当成本地磁盘目录一样对待,也是根据文件的属主(组)及其对应的权限设定来限制访问。
gernel 目录的属主(组)为 nobody:nogroup(65534:65534),所以虽然该目录为读写权限,非 root 用户无法执行新建操作。而 root 用户由于 nfs 默认的安全机制,会自动映射到 nobody:nogroup。

NFS Client端切换到ROOT对文件进行写入

NFS Server端看到了内容更新:

参考资料
https://www.bbsmax.com/A/o75N9xgDJW/
https://blog.csdn.net/yaoxinli/article/details/127613184
https://blog.csdn.net/ichen820/article/details/120365341