环境介绍
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 rpcbind
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 service nfs-server status
至此,服务器端配置完毕,接下来在客户端操作。
不重启服务,更新共享目录列表
sudo exportfs -arv
![](https://i-blog.csdnimg.cn/blog_migrate/2ff3d0b9b8ddc262ce052e997cdf5a7f.png)
客户端查看服务端目录共享情况
客户端安装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端看到了内容更新:
network connection
挂载NFS后无法读写的问题
在服务端设置目录权限:
$ sudo chmod a+rw /var/nfs/gernel
$ sudo chmod a+rw /var/nfs/public
在客户端挂载时加入 -o nocal不进行权限检查
sudo mount -t nfs -o noacl 192.168.31.156:/var/nfs/gernel /mnt
应用
在虚拟化应用场景中,可以将虚拟机镜像放到公共的集群可访问的NFS目录中,客户机挂载到本地后,通过透明的QEMU命令方式启动虚拟机,经过验证,这种方式在第一次启动虚拟机时会比较慢,第二次启动则会快很多,原因可能是首次启动收到远程磁盘读写和网络带宽的影响,而第二次启动则是受益于第一次启动产生的本地缓存,加速的启动进程。
参考资料
https://www.bbsmax.com/A/o75N9xgDJW/