嵌入式Linux之NFS配置

时间:2022-11-08 20:10:32

NFS(Network File System)

1、RPC和rpcbind

  RPC(Remote Procedure Call)即远程过程调用,是分布式应用的基础,即允许计算机远程调用网络上其他计算机的程序。RPC通常由提供RPC服务的服务端和使用RPC服务端的客户端组成。

  rpcbind(亦称rpc.portmap, port mapper, portmap)是一个运行在网络节点(提供其他RPC服务)上的RPC服务。rpcbind是RPC服务的管理者。当一个RPC服务端开启时,它会告诉rpcbind它提供的RPC服务的端口号、协议类型(TCP/UDP)、过程调用服务号和版本号键值对。当RPC客户端请求指定过程调用号和版本号的RPC服务时,首先必须通过rpcbind获取端口号和协议类型。rpcbind服务必须在其他RPC服务端之前开启。

  rpcbind协议的前身是portmap协议,从第三版开始更名为rpcbind。rpcbind协议占用TCP/UDP的111号端口。使用rpcinfo -p命令可以查询当前系统中提供的RPC服务的服务名称、端口号、协议类型、过程调用号和版本号等信息。

$rpcinfo -p
program vers proto port
tcp portmapper
udp portmapper
udp nfs
udp nfs
udp nfs
tcp nfs
tcp nfs
tcp nfs
udp status
udp nlockmgr
udp nlockmgr
udp nlockmgr
tcp status
tcp nlockmgr
tcp nlockmgr
tcp nlockmgr
udp mountd
tcp mountd
udp mountd
tcp mountd
udp mountd
tcp mountd

2、NFS介绍

  NFS(Network File System)是Sun公司开发的分布式文件系统,由提供NFS服务的NFS Server端和使用NFS服务的NFS Client端组成。

  NFS服务本质上是一个RPC服务,因此它必须依赖rpcbind服务“广播”自己的过程调用号、版本号、端口号、协议类型等信息。

  通过实现NFS服务,NFS Client端可以在本地文件系统的NFS挂载点对NFS Server端的文件系统进行直接读写操作。

  一般情况下,NFS服务通过2049号端口进行数据传输,用户也可以指定端口号。

  在Linux系统中部署NFS服务需要系统的支持,mount程序版本v2.10及以上版本,且需要Linuxn内核支持NFS文件系统。
  一般情况下,通过nfs-utils组件实现NFS服务端和客户端,它会在后台运行5个守护进程:

嵌入式Linux之NFS配置

 

3、NFS配置

3.1、Linux内核支持NFS文件系统
首先必须配置Linux内核支持NFS文件系统,即使能CONFIG_EXPORTFS和CONFIG_NFS_FS配置选项
嵌入式Linux之NFS配置
 
3.2、根文件系统集成nfs-utils和rpcbind服务组件
通过buildroot搭建根文件系统时,在buildroot配置选项中选中nfs-utils和rpcbind
嵌入式Linux之NFS配置
 
嵌入式Linux之NFS配置
 
3.3、mount命令支持NFS文件系统
通过busybox集成mount命令时,使能busybox配置选项的FEATURE_MOUNT_NFS选项
嵌入式Linux之NFS配置

3.4、NFS Server配置
首先配置/etc/exports文件,该配置文件提供给exportfs命令使用,主要是用来配置NFS共享目录及其属性。
/mnt/share 192.168.100.2(insecure,rw,sync,fsid=0,no_subtree_check,no_root_squash)
其中/mnt/share为共享目录路径,192.168.100.2为NFS Client端的IP地址,其他的为配置参数。
其次,在系统启动脚本中执行以下命令:
            exportfs –arv    //根据/etc/exports配置文件更新共享目录列表
            rpc.mountd -p 52400  //指定rpc服务数据报文端口号
            rpc.statd --no-notify  //该守护进程用于监听其他主机的重启消息,并管理本地主机重启时需要通知的主机列表。
            sm-notify     //在本地系统重启时通知NFS对端

 
3.5、NFS Client配置
 在系统启动脚本中执行以下命令挂载NFS Server共享目录
        sm-notify
        rpc.statd
        mount -t nfs 192.168.100.1:/mnt/share /mnt/share -o nfsvers=3 –v
其中,192.168.100.1:/mnt/nor为NFS Server的IP和共享目录路径,/mnt/share为挂载点。
 
 
4、NFS配置文件和常用命令
 
4.1、NFS共享目录配置文件
 
/etc/exports配置文件的格式为:
 [共享的目录] [主机名或IP(参数,参数)]
 其中参数是可选的,当不指定参数时,nfs将使用默认选项。默认的共享选项是sync,ro,root_squash,no_delay。
 当主机名或IP地址为空时,则代表共享给任意客户机提供服务。
 当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样:
 [共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]
 
下面是一些NFS共享的常用参数:
ro  只读访问
rw  读写访问
sync  同步写入资料到内存与硬盘中
async  资料会先暂存于内存中,而非直接写入硬盘
secure  NFS通过1024以下的安全TCP/IP端口发送
insecure  NFS通过1024以上的端口发送
wdelay  如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay  如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
hide  在NFS共享目录中不共享其子目录
no_hide  共享NFS目录的子目录
subtree_check  如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check  和上面相对,不检查父目录权限
all_squash  共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash  保留共享文件的UID和GID(默认)
root_squash  root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squash  root用户具有根目录的完全管理访问权限
anonuid=xxx  指定NFS服务器/etc/passwd文件中匿名用户的UID
anongid=xxx  指定NFS服务器/etc/passwd文件中匿名用户的GID
 
4.2、exportfs
当/etc/exports配置文件修改后,通过以下命令可以不重启NFS服务就刷新NFS共享目录列表:
exportfs -arv
 
4.3、showmount
nfs-utils组件提供showmount命令,NFS客户端可以利用showmount命令测试是否能连上NFS服务端。
命令格式:showmount -e [ hostname | ip ]
 
4.4、rpcinfo
查看当前主机RPC状态:
rpcinfo -p localhost
 
4.5、nfsstat
查看NFS状态
 
4.6、netstat
查看端口占用情况
 
4.7、sm-notify
发送系统重启通知给NFS对端,使用网络状态监控器NSM(Network Status Monitor)协议来通知NFS对端。NFS服务进程由两个独立的用户空间程序组成:
rpc.statd 该守护进程用于监听其他主机的重启消息,并管理本地主机重启时需要通知的主机列表;
sm-notify 辅助程序,用于在本地系统重启时通知NFS对端。
即sm-notify是重启信息的通知者,rpc.statd是重启信息的接收者。