本文很长,听首歌,慢慢回味。固定了长度为2万字,估计要分三篇才能写完。
开篇为原理,中为优化及开机启动,下为碰到的各种问题解决方案。
1、 NFS产生的原因
NFS为network filesystem的缩写,为网络文件系统,主要用来存储一些共享的静态数据,例如图片,上传文件等。(通过网络让不同的主机共享目录)
在做负载均衡之后,如果用户上传文件等资源,放在本地webserver上,那么用户通过上传文件的时候,有可能分配到webserver1,那么就有可能下次访问的时候,分配到webserver2,从而无法获取到相关的文件资源,从而就有了共享存储NFS。
共享存储的主要目的是用来存储,从而每次用户在需要文件的时候,都是会进行读取共享存储NFS服务器上的文件,在上传文件的时候,也是将文件保存在共享存储NFS文件系统中。
2、 NFS的基本原理
NFS主要划分为客户端和服务器端,客户端只要挂载网络文件系统即可使用NFS服务,服务器端提供NFS服务即可,具体步骤如下:
① 服务端开启RPC服务
② 服务端开启NFS服务(向RPC注册相关的端口信息)
③ 客户端请求RPC服务
④ 服务端的RPC返回相关的端口信息
⑤ 客户端通过端口连接NFS传输数据
RPC服务:remote procedure call,远程调用服务,记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而可以确保客户端连接到正确的NFS端口上去,达到数据传输交换的目的。
NFS启动之后,端口是随机的,从而需要在RPC服务中进行注册相关的端口信息。
具体的过程如下所示:
3、 NFS服务的安装
3.1 NFS服务端的安装
在NFS服务端中,需要安装两个服务,一个是nfs-utils,提供nfs服务;一个是rpcbind,提供rpc服务,安装步骤如下所示(在启动服务的时候,先启动rpcbind服务,然后启动nfs服务):
[root@nfsserver~]# yum -y install rpcbind(安装rpcbind)
[root@nfsserver~]# yum -y install nfs-utils(安装nfs)
[root@nfsserver~]# rpm -qa nfs-utils rpcbind(检查是否安装成功)
rpcbind-0.2.0-8.el6.x86_64
nfs-utils-1.2.3-15.el6.x86_64
[root@nfsserver~]# chkconfig rpcbind on(将rpc服务加入到开机自启动中)
[root@nfsserver~]# chkconfig nfs on(将nfs服务加入到开机自启动中)
[root@nfsserver~]# chkconfig --list |grep nfs(检查服务是否添加成功)
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
nfslock 0:off 1:off 2:off 3:on 4:on 5:on 6:off
[root@nfsserver~]# /etc/init.d/rpcbind start(启动rpc服务)
Startingrpcbind: [ OK ]
[root@nfsserver~]# rpcinfo -p(查看rpc服务启用的端口,发现端口为111)
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
[root@nfsserver~]# /etc/init.d/nfs start(启动nfs服务)
Starting NFSservices: [ OK ]
Starting NFSquotas: [ OK ]
Starting NFSdaemon: [ OK ]
Starting NFSmountd: [ OK ]
Starting RPCidmapd: [ OK ]
[root@nfsserver~]# rpcinfo -p(查看NFS注册的端口信息,固定端口为875,2049,其他随机,在每次重启之后端口各不相同)
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
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 47100 nlockmgr
100021 3 udp 47100 nlockmgr
100021 4 udp 47100 nlockmgr
100021 1 tcp 58321 nlockmgr
100021 3 tcp 58321 nlockmgr
100021 4 tcp 58321 nlockmgr
100005 1 udp 47603 mountd
100005 1 tcp 46946 mountd
100005 2 udp 36259 mountd
100005 2 tcp 53345 mountd
100005 3 udp 44882 mountd
100005 3 tcp 36446 mountd
[root@nfsserver~]# ls -l /etc/exports(查看NFS的配置文件,默认为空)
-rw-r--r-- 1root root 0 Aug 20 02:50 /etc/exports
[root@nfsserver~]# echo "/kel
192.168.1.0/24(rw,sync,all_squash,anonuid=65534,anongid=65534">>/etc/exports(配置配置文件)
[root@nfsserver~]# tail -2 /etc/exports(检查配置文件)
#this is forshare download file by kel
/kel192.168.1.0/24(rw,sync,all_squash,anonuid=65534,anongid=65534
[root@nfsserver~]# showmount -e localhost(检查配置文件,显示共享的目录)
Export list forlocalhost:
/kel192.168.1.0/24
正常启动nfs的时候,在/var/log/messages中显示信息如下:
Aug 23 01:48:00KEL kernel: NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recoverydirectory
Aug 23 01:48:00KEL kernel: NFSD: starting 90-second grace period
Aug 23 01:48:00KEL rpc.mountd[8819]: Version 1.2.3 starting
启动rpcbind的时候,没有日志显示。
3.2 NFS客户端的安装
在NFS客户端中只需要安装rpcbind即可,提供RPC服务,但是最好也安装上nfs-utils,因为这个提供了showmount命令,如下所示:
[root@nfsclient~]#which showmount(查询showmount命令路径)
/usr/sbin/showmount
[root@nfsclient~]#rpm -qf /usr/sbin/showmount(查询命令提供的包名称)
nfs-utils-1.2.3-15.el6.x86_64
[root@nfsclient~]#which rpcinfo(查询rpcinfo命令路径)
/usr/sbin/rpcinfo
[root@nfsclient~]#rpm -qf /usr/sbin/rpcinfo(查询命令提供的包名称)
rpcbind-0.2.0-8.el6.x86_64
从而在客户端检查的时候,会使用shoumount命令,从而在客户端的安装和服务端相同,但是在客户端只启动rpcbind服务,并且开机自启动中也只添加rpcbind服务。
[root@nfsclient~]#yum -y install rpcbind(安装rpcbind)
[root@nfsclient~]#yum -y install nfs-utils(安装nfs)
[root@nfsclient~]#rpm -qa nfs-utils rpcbind(检查是否安装成功)
rpcbind-0.2.0-8.el6.x86_64
nfs-utils-1.2.3-15.el6.x86_64
[root@nfsclient~]#chkconfig rpcbind on(将rpc服务加入到开机自启动中)
[root@nfsclient~]#chkconfig --list |grep rpcbind(检查服务是否添加成功)
rpcbind 0:off 1:off 2:off 3:on 4:on 5:on 6:off
[root@nfsclient~]#/etc/init.d/rpcbind start(启动rpc服务)
Startingrpcbind: [ OK ]
[root@nfsclient~]# rpcinfo -p(查看rpc注册端口信息,可以看到rpc的端口为111)
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
[root@nfsclient~]# showmount -e 192.168.1.70(查看服务器端共享的目录)
Export list for192.168.1.70:
/kel192.168.1.0/24
[root@nfsclient~]# mount -t nfs 192.168.1.70:/kel /opt(挂载NFS文件系统)
[root@nfsclient~]# df -Ph(查看挂载之后的情况)
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 6.5G 4.1G 2.1G 67% /
tmpfs 67M 0 67M 0% /dev/shm
/dev/sda1 485M 31M 429M 7% /boot
192.168.1.70:/kel 9.9G 4.9G 4.5G 53% /opt
[root@nfsclient~]# cd /opt(进行测试读写)
[root@nfsclientopt]# ls -l
total 0
-rw-r--r--. 1nfsnobody nfsnobody 0 Aug 19 07:45 123
-rwxrwxr-x. 1nfsnobody nfsnobody 0 Aug 19 02:59 serverfile
-rw-r--r--. 1nfsnobody nfsnobody 0 Aug 19 04:10 some
[root@nfsclientopt]# touch 456
[root@nfsclientopt]# rm -f 123
[root@nfsclientopt]# ls -l
total 0
-rw-r--r--. 1nfsnobody nfsnobody 0 Aug 20 04:11 456
-rwxrwxr-x. 1nfsnobody nfsnobody 0 Aug 19 02:59 serverfile
-rw-r--r--. 1nfsnobody nfsnobody 0 Aug 19 04:10 some
(当不能写入文件的时候,注意共享目录的NFS服务器的父目录权限。)
3.3 部署NFS的时候的注意事项
在部署NFS的时候,需要注意如下信息:
① 在NFS服务端的时候,必须先启动rpcbind服务,然后启动NFS服务,如果是先启动NFS服务,那么会出现如下错误:
[root@nfsserver~]# /etc/init.d/nfs start(先启动nfs服务,会出现无法进行注册,无法连接RPC服务的111端口)
Starting NFSservices: [ OK ]
Starting NFSquotas: Cannot register service: RPC: Unable toreceive; errno = Connection refused
rpc.rquotad: unable to register(RQUOTAPROG, RQUOTAVERS, udp).
[FAILED]
Starting NFSdaemon: rpc.nfsd: writing fd to kernel failed:errno111 (Connection refused)
rpc.nfsd:writing fd to kernel failed: errno 111 (Connection refused)
rpc.nfsd: unableto set any sockets for nfsd
[FAILED]
[root@nfsserver~]# rpcinfo -p(使用rpcinfo查看rpc信息的时候,报错无法连接rpc服务)
rpcinfo: can't contact portmapper: RPC: Remote system error-No such file or directory
② 防火墙会阻挡连接,出现错误no route to host,那么表示到NFS服务器无法连接,出现如下的错误:
[root@nfsclient~]# telnet 192.168.1.70 111(测试连接NFS服务器的111端口)
Trying192.168.1.70...
telnet: connectto address 192.168.1.70: No route to host(表示无法连接111端口)
[root@nfsclient~]# showmount -e 192.168.1.70(查看NFS服务器共享的目录)
clnt_create:RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
在出现no route to host的时候,注意检查防火墙。/etc/init.d/iptables status
③ 当NFS服务端的rpcbind服务没有开启的时候,出现的错误也是no route to host,那么表示客户端的rpc服务无法连接到NFS服务端的rpc,从而需要检查NFS服务端的服务是否开启:
[root@nfsclient~]# telnet 192.168.1.70 111(测试连接NFS服务器的111端口)
Trying192.168.1.70...
telnet: connectto address 192.168.1.70: No route to host(表示无法连接111端口)
[root@nfsclient~]# showmount -e 192.168.1.70(查看NFS服务器共享的目录)
clnt_create:RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
[root@nfsserver~]# /etc/init.d/rpcbind status(检查NFS服务端的rpcbind服务)
rpcbindis stopped
[root@nfsserver~]# /etc/init.d/nfs status(检查NFS服务端的nfs服务)
rpc.svcgssd isstopped
rpc.mountd isstopped
nfsdis stopped
rpc.rquotad isstopped
将rpcbind服务先开启,然后开启nfs服务即可。
④ 当NFS服务端出现程序未进行注册的时候,那么表示启动顺序有误,错误内容如下:
[root@nfsserver~]# /etc/init.d/rpcbind start(后启动rpcbind服务)
Startingrpcbind: [ OK ]
[root@nfsserver~]# showmount -e(查看共享目录信息,出现程序未注册)
clnt_create:RPC: Program not registered
那么这个时候必须重启nfs服务,加载配置文件是不可以的。
[root@nfsserver~]# /etc/init.d/nfs restart(重启NFS服务)
⑤ 可以ping NFS服务端地址,检查网络情况
[root@nfsclient~]# ping 192.168.1.70(ping NFS服务端地址)
PING 192.168.1.70(192.168.1.70) 56(84) bytes of data.
64 bytes from192.168.1.70: icmp_seq=1 ttl=64 time=1.18 ms
64 bytes from192.168.1.70: icmp_seq=2 ttl=64 time=0.431 ms
如果能ping通,那么表示网络能够连接
⑥ 可以在NFS服务端自己进行挂载,查看NFS服务端是否存在问题
[root@nfsserver~]# mount 192.168.1.70:/kel /opt(在服务端自己进行挂载)
[root@nfsserver~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 9.9G 4.9G 4.5G 53% /
tmpfs 55M 0 55M 0% /dev/shm
/dev/sda1 485M 32M 428M 7% /boot
/dev/sda6 2.1G 36M 2.0G 2% /mnt
192.168.1.70:/kel 9.9G 4.9G 4.5G 53% /opt
如果能挂载,那么表示服务端没有问题。
⑦ 当查看df的时候,hang住,那么表示NFS链接出现问题,查看/proc/mounts查看挂载的目录,然后卸载即可,如下:
[root@nfsclient~]# tail -1 /proc/mounts(查看挂载的信息)
192.168.1.70:/kel//opt nfs4
rw,relatime,vers=4,rsize=16384,wsize=16384,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.63,minorversion=0,local_lock=none,addr=192.168.1.700 0
[root@nfsclient~]# umount /opt(普通卸载)
[root@nfsclient~]# cd /opt
[root@nfsclientopt]# umount -lf /opt(强制卸载)
4、 NFS相关文件
4.1 NFS服务端配置文件/etc/exports
NFS服务端主要的配置文件就是/etc/exports,默认为空,如下所示:
[root@nfsserver~]# ls -l /etc/exports(配置文件路径)
-rw-r--r-- 1root root 108 Aug 20 04:03 /etc/exports
[root@nfsserver~]# cat /etc/exports(配置文件内容)
#this is forshare download file by kel(注释)
/kel192.168.1.0/24(rw,sync,all_squash,anonuid=65534,anongid=65534)(共享目录)
主要格式如下所示:共享目录网段或主机及相关参数
在进行配置配置文件的时候,也可以使用命令exportfs,但是命令配置的,在重启之后会失效。
exportfs -rv相当于/etc/init.d/nfs reload
也可以使用下面的方式来写:
[root@nfsserver~]# cat /etc/exports(对同一个目录设置不同权限,也可以不同的主机名)
#this is forshare download file by kel
/kel192.168.1.64(rw,async) *(ro)
[root@nfsserver~]# showmount -e
Export list fornfsserver:
/kel (everyone)
4.2 NFS服务端完整参数的配置文件
查看所有配置文件的路径如下所示:
[root@nfsserver~]# ls -l /var/lib/nfs/etab
-rw-r--r-- 1root root 144 Aug 20 06:52 /var/lib/nfs/etab
[root@nfsserver~]# cat /var/lib/nfs/etab
/kel 192.168.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534
常用参数如下所示:参数含义
rw可读写
ro只读
sync同步写入磁盘(数据安全性高,但是会影响写入性能)
async异步写入磁盘(写入性能高,但是会影响安全性)
all_squash将所有用户压缩为anonuid和anongid用户
anonuid匿名用户的uid(默认用户为nsnobody,65534)
anongid匿名用户的gid(默认用户组为nsnobody,65534)
root_squash用root身份的时候还是为root用户
在进行设置匿名用户的时候,必须检查客户端和服务器的用户的id号和组号,必须完全一致,否则会出现无法显示用户名的情况。
默认参数如下所示:
/kel 192.168.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
[root@nfsserver~]# tail -1 /etc/passwd(检查服务器端匿名用户)
nfsnobody:x:65534:65534:AnonymousNFS User:/var/lib/nfs:/sbin/nologin
[root@nfsclient~]# tail -1 /etc/passwd(检查客户端匿名用户)
nfsnobody:x:65534:65534:AnonymousNFS User:/var/lib/nfs:/sbin/nologin
4.3 NFS客户端挂载参数
查看客户端挂载参数,主要查看文件为/proc/mounts,内容如下所示:
192.168.1.70:/kel//opt nfs4rw,relatime,vers=4,rsize=16384,wsize=16384,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.63,minorversion=0,local_lock=none,addr=192.168.1.700 0
常用参数解释如下:参数含义
nosuid可以设置suid但是不能不能执行(影响安全)
noexec不能直接执行脚本(影响安全)
rsize一次写入数据大小,bytes(性能)131072
wsize一次读出数据大小,bytes(性能)131072
noatime不更新文件access time(性能)
nodiratime不更新目录access time(性能)