一、nfs客户端服务端部署
省略
二、nfs工作原理
1、
NFS:Network File System 网络文件系统,基于内核的文件系统。通过使用
NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,基于RPC(Remote Procedure Call Protocol
远程过程调用)实现
2、
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port
number,并且通知客户端,记客户端可以连接到正常端口上去。在启动NFS SERVER之前,首先要启动RPC服务(即portmap或rpcbind服务,下同)否则NFS
SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs
reload或exportfs –rv即可使修改的/etc/exports生效。
三、常见参数
ro:默认选项,以只读的方式共享。
rw:以读写的方式共享。
root_squash:将客户端使用的是root用户时,则映射到NFS服务器的用户为NFS的匿名用户(nfsnobody)。
no_root_squash:将客户端使用的是root用户时,则映射到NFS服务器的用户依然为root用户。
all_squash:默认选项,将所有访问NFS服务器的客户端的用户都映射为匿名用户,不管客户端使用的是什么用户。
anonuid:设置映射到本地的匿名用户的UID
anongid:设置映射到本地的匿名用户的GID
sync:默认选项,保持数据同步,数据同步写入到内存和硬盘。
async:异步,先将数据写入到内存,在将数据写入到硬盘。
secure: 限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
insecure:允许客户端从大于1024的tcp/ip端口连接服务器
subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
wdelay 如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
Hide 在NFS共享目录中不共享其子目录
no_hide 共享NFS目录的子目录
四、常见命令
1、检查共享目录信息
showmount -e nfs服务端IP地址
2、查看挂载目录
df -h
3、nfs服务端查看端口映射情况
rpcinfo -p localhost
4、开机自动挂载写法
[root@web01 test]$ cat /etc/fstab
# 添加如下信息
10.0.0.1:/data /mnt nfs defaults 0 0
5、手动挂载命令
mount -t nfs ip:/data /data
6、重新加载配置文件
systemctl reload nfs-server
或者
exportfs -avr
7、查看挂载是报错的具体信息
mount -t nfs -vvvv server.example.com:/share /mnt
五、常见故障分析
1、排查nfs和客户端防火墙安全组配置
ufw ipables firewalld
2、看nfs服务端的ip能否ping通长长访问
3、查看客户端是否正常启动
4、showmount -e nfs服务端ip查看是否能够查看nfs服务端信息
5、使用mount -t nfs -vvvv server.example.com:/share /mnt查看挂载报错的具体问题
5、nfs服务端未开放相关服务组件访问端口
查看服务端rpc状态信息,其中mountd 和nlockmgr
服务启动端口不固定(可通过重启rpcbind和nfs-server服务前后对比打印信息)
[root@iZ8vb1o2lqhuz4bjn2ton6Z ~]# rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 40286 nlockmgr
100021 3 udp 40286 nlockmgr
100021 4 udp 40286 nlockmgr
100021 1 tcp 33983 nlockmgr
100021 3 tcp 33983 nlockmgr
100021 4 tcp 33983 nlockmgr
对比nfs的端口使用情况
服务名 端口号 协议 说明
nfs 2049 tcp/udp 固定端口
portmapper 111 tcp/udp 固定端口
mountd 20048 tcp/udp 端口可以修改
nlockmgr 42315 tcp/udp 端口可以修改
更改相关端口为固定端口mountd和nlockmgr
更改mountd 服务端口为20048
echo “mountd 20048/tcp” >> /etc/services
echo “mountd 20048/udp” >> /etc/services更改nlockmgr 服务端口为42315
echo “fs.nfs.nlm_udpport=42315” >> /etc/sysctl.conf
echo “fs.nfs.nlm_tcpport=42315” >> /etc/sysctl.conf
sysctl -p
方通端口2049 、111 、20048 、42315
6、案例:在云上部署nfs服务端然后使用云上的服务端可以正常访问;但是使用idc线下服务器挂载云上的nfs服务端却始终失败,nfs服务端已放开所有端口ip访问
具体报错如下:
[root@node-01 ~]# mount -t nfs -vvvv 112.43.5.67:/data /data
mount.nfs: timeout set for Sat May 7 22:52:28 2020
mount.nfs: trying text-based options 'vers=4.1,addr=112.43.5.67,clientaddr=10.0.0.94'
mount.nfs: mount(2): Operation not permitted
mount.nfs: trying text-based options 'addr=112.43.5.67'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 8.142.149.27 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 8.142.149.27 prog 100005 vers 3 prot UDP port 20048
mount.nfs: mount(2): Permission denied
mount.nfs: Operation not permitted
分析原因:
由于nfs默认的客户端访问是secure只能允许客户端通过小于1024的特权端口连接服务端导致的权限拒绝
解决办法:
在服务端配置文件/etc/exports中配置insecure
允许客户端使用大于1024端口访问服务端
测试可以正常访问