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

至此,服务器端配置完毕,接下来在客户端操作。

不重启服务,更新共享目录列表

sudo exportfs -arv

客户端查看服务端目录共享情况

客户端安装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

结束


版权声明:本文为tugouxp原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。