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个守护进程:
3、NFS配置
首先必须配置Linux内核支持NFS文件系统,即使能CONFIG_EXPORTFS和CONFIG_NFS_FS配置选项
3.2、根文件系统集成nfs-utils和rpcbind服务组件
通过buildroot搭建根文件系统时,在buildroot配置选项中选中nfs-utils和rpcbind
通过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对端
在系统启动脚本中执行以下命令挂载NFS Server共享目录
sm-notify
rpc.statd
mount -t nfs 192.168.100.1:/mnt/share /mnt/share -o nfsvers=3 –v
[共享的目录] [主机名或IP(参数,参数)]
其中参数是可选的,当不指定参数时,nfs将使用默认选项。默认的共享选项是sync,ro,root_squash,no_delay。
当主机名或IP地址为空时,则代表共享给任意客户机提供服务。
当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样:
[共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]
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