portmap:端口映射器,主要功能是进行RPC程序的端口映射工作。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,portmap会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。
rpc.mountd:NFS挂载守护进程,主要功能是实现NFS MOUNT协议,负责挂载/卸载NFS文件系统和权限管理。它会读取NFS的配置文件/etc/exports来对比客户端访问权限。挂载成功后,客户获得服务器文件系统的一个文件句柄(fh)。
rpc.nfsd:NFS服务端守护进程,是NFS服务的用户态部分。需要提出的是,NFS服务的大部分功能都由nfsd内核模块处理。
可以看出NFS服务的大部分功能都是由内核模块实现的,除了图中所示的内核模块,内核还提供了2个内核守护进程:
nfsiod:主要作用是为NFS客户端提供高效的缓冲机制,如预读、延时写等,从而改善NFS文件系统的性能
rpciod:主要作用是作为RPC(远过程调用服务)的守护进程,用于从客户端启动I/O服务。
下图是一个NFS协议消息流图实例,包含了一些典型的网络文件系统操作场景,如:
服务注册过程
NFS挂载:mount 168.0.155.1:/datadisk0 /tmp
改变工作目录:cd /tmp
查看目录下文件:ls
读文件:more tail bootcfg.ini
Linux NFS调试 NFS应用程序调试打开应用程序调试功能:
/usr/sbin/portmap -d
/usr/sbin/rpc.mountd -d all
/usr/sbin/rpc.nfsd -d -s
查看NFS配置与记录日志:
cat /etc/exports
cat /var/lib/nfs/rmtab
cat /var/lib/nfs/etab
cat /var/lib/nfs/xtab
cat /var/lib/nfs/state
tail /var/log/messages
打开NFS模块调试功能:
sysctl -w sunrpc.nfs_debug=2147483647
sysctl -w sunrpc.nfsd_debug=2147483647
查看NFS相关统计和日志:
cat /proc/slabinfo | grep nfs
/proc/fs/nfsfs/
nfsstat
dmesg
打开RPC模块调试功能:
sysctl -w sunrpc.rpc_debug=2147483647
查看RPC相关统计和日志:
cat /var/run/portmap_mapping
cat /proc/net/rpc/nfs
cat /proc/net/rpc/nfsd
查看TCP/IP相关统计和配置:
ping // 查看网络情况
netstat -tpwn | grep 2049 // 查看NFS TCP链接
cat /proc/sys/net/ipv4/tcp_retries2 // 查看TCP配置
cat /proc/net/rpc/nfs
cat /proc/net/rpc/nfsd // deciles等字段
cat /proc/net/snmp // IP: ReasmFails等字段
网络抓包:
tcpdump -s 9000 -w /tmp/dump.out port 2049
其他 nfs-utils移植./configure \
CC=XX-gcc \
--build=$(./config.guess) \
--host=mips64-unknown-linux-gnu \
LDFLAGS="-L/usr/local/lib" \
CPPFLAGS="-I/usr/local/include" \
--disable-tirpc --disable-gss --disable-uuid --without-tcp-wrappers --with-gnu-ld
make
make install
导出文件系统规则由NFS导出的文件系统由配置文件/etc/exports配置,可以导出的文件系统需要满足如下2个条件:
文件系统必须有一个设备号(需要有FS_REQUIRES_DEV,即存储设备)或FSID号(需要有NFSEXP_FSID 或 ->uuid)。
文件系统必须支持s_export_op接口。而支持s_export_op接口的文件系统都是存储设备文件系统,如ext3/4、ubifs等。其他文件系统如rootfs、ramfs、sysfs等是不支持的。