嵌入式Linux之NFS配置
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配置
首先必须配置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