嵌入式Linux之NFS配置

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
   100000    2   tcp    111  portmapper
   100000    2   udp    111  portmapper
   100003    2   udp   2049  nfs
   100003    3   udp   2049  nfs
   100003    4   udp   2049  nfs
   100003    2   tcp   2049  nfs
   100003    3   tcp   2049  nfs
   100003    4   tcp   2049  nfs
   100024    1   udp  32770  status
   100021    1   udp  32770  nlockmgr
   100021    3   udp  32770  nlockmgr
   100021    4   udp  32770  nlockmgr
   100024    1   tcp  32769  status
   100021    1   tcp  32769  nlockmgr
   100021    3   tcp  32769  nlockmgr
   100021    4   tcp  32769  nlockmgr
   100005    1   udp    644  mountd
   100005    1   tcp    645  mountd
   100005    2   udp    644  mountd
   100005    2   tcp    645  mountd
   100005    3   udp    644  mountd
   100005    3   tcp    645  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个守护进程:

 

3、NFS配置

3.1、Linux内核支持NFS文件系统
首先必须配置Linux内核支持NFS文件系统,即使能CONFIG_EXPORTFS和CONFIG_NFS_FS配置选项

 
3.2、根文件系统集成nfs-utils和rpcbind服务组件
通过buildroot搭建根文件系统时,在buildroot配置选项中选中nfs-utils和rpcbind
 
 
3.3、mount命令支持NFS文件系统
通过busybox集成mount命令时,使能busybox配置选项的FEATURE_MOUNT_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是重启信息的接收者。
原文地址:https://www.cnblogs.com/justin-y-lin/p/10836721.html