NFS网络文件共享存储服务器
什么是NFS
NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
在企业集群架构的工作场景中,NFS网络文件系统一般被用来共享存储视频、图片、附件等静态资源文件,通常网站用户上的文件都会存放到NFS共享里。例如bbs产品的图片、附件头像等。然后前段所有的节点访问这些静态资源时都会读取NFS存储上的资源。
企业生成集群中为什么要部署NFS存储服务
1)在没有NFS文件共享存储时的原理解释:
当A用户上传图片到web1服务器时,然后B用户访问这张图片,结果B用户访问图片的请求到了负载均衡器的时候,被分发到web2服务器上,因为web2没有A用户上传的图片,所以B用户就无法看到A用户上传的图片。
实例:淘宝卖家将新出的产品资料上传到淘宝服务器。如果没有存储服务器,那么当大量的用户访问到这个淘宝卖家店里的时候,分发器将用户的请求都分发给淘宝的其他服务器,那么用户就无法看到卖家新出的产品了,这就导致了降低了用户体验。这样对一个户门网站来说是一个很大的错误。
2)在有NFS文件共享存储时的原理解释:
当A用户上传一张图片到web服务器中,分发器不论是转发到那一台web服务器,其内容最后都会被存放到NFS共享文件存储中。而当B用户访问A用户上传的图片时,无论请求被分发器分发web1还是web2上,最终都会到共享存储上找,都可以找到A用户上传的图片。
NFS的工作原理
服务端设置一个专门用来共享的目录(/test)。设置好共享目录的权限,IP等内容。然后具有权限的客户端访问NFS服务器端,将这个共享目录挂载到客户端的某个目录下。客户端在正确挂载完之后,就可以通过NFS客户端的挂载点所在的目录中查看到NFS服务端共享目录/test下的所有数据。客户端查看时,NFS服务端的/test目录就相当于客户端本地的磁盘分区或目录。
什么RPC服务
RPC指远程过程调用。
因为NFS支持的功能比较多,而不同的功能都会使用不同的程序来启动,为启动一个功能就会启用一些未被使用的端口来作为传输只用,因为端口的不固定,这样一来就会造成NFS客户端与NFS服务器端的通信障碍没因为NFS客户端必须要知道NFS服务器端的数据传输端口才能进行通信,才能交互数据。
为了解决上述的问题,就需要RPC服务,NFS服务的RPC服务最主要的功能就是记录每个NFS功能所对饮的端口号,并且NFS客户端请求时将该端口和功能对应的信息传输给请求数据的NFS客户端,从而保证客户端可以连接到正确的NFS端口上去,达到实现数据交互的目的。
服务端的RPC服务如何知道每个NFS的端口的:
当NFS读取端启动服务时会随机取用若干端口,并主动向RPC服务注册相关端口的对应的功能,然后RPC服务使用固定的111端口来监听NFS客户端提交的请求,并将正确的NFS端口信息回复给请求的NFS客户端。
NFS的挂载基本使用过程
请求数据的流程:
1)首先用户访问网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这是NFS客户端的RPC服务就不通过网络向NFS服务器端的RPC服务的111端口发出NFS文件存取功能的查询请求,包括要实现的什么功能。
2)NFS服务器端的RPC服务找到对饮的已注册的NFS端口,通知NFS客户端的RPC服务。
3)此时NFS客户端获取到正确的端口,并与NFS联机存取数据。
4)NFS客户端把数据存取成功后,返回给客户端程序,告知用户存取结果。
注意:
因为NFS的各项功能都需要向RPC服务注册端口,所以只有RPC服务才能获取到NFS服务的各项功能对应的端口号,PID、NFS在主机监听的Ip等信息,而客户端也只能通过向RPC服务询问才能找到正确 的端口,因此,无论是NFS服务端还是NFS客户端都需要RPC服务的协助才能完成对外服务及请求。
一:实验目标
1、完成NFS的文件共享
二:实验环境
服务器系统 |
主机名 |
IP |
作用 |
软件 |
Rhel6.5 |
yu61 |
192.168.1.61 |
Nfs-server |
nfs-utils、rpcbind |
Rhel6.5 |
yu62 |
192.168.1.62 |
Nfs-client1 |
nfs-utils、rpcbind |
Rhel6.5 |
yu63 |
192.168.1.63 |
Nfs-client2 |
nfs-utils、rpcbind |
三:实验步骤
1、安装NFS服务端
[[email protected] ~]# yum install nfs-utils rpcbind -y
[[email protected] ~]#
[root[email protected] ~]# /etc/init.d/rpcbind status
rpcbind (pid 1615) is running...
[[email protected] ~]# lsof -i :111
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 1615 rpc 6u IPv4 11330 0t0 UDP *:sunrpc
rpcbind 1615 rpc 8u IPv4 11333 0t0 TCP *:sunrpc (LISTEN)
rpcbind 1615 rpc 9u IPv6 11335 0t0 UDP *:sunrpc
rpcbind 1615 rpc 11u IPv6 11338 0t0 TCP *:sunrpc (LISTEN)
2、查看NFS服务向RPC服务注册的端口信息
因为NFS服务还没有启动,一次没有太多注册端口映射信息。
[[email protected] ~]# rpcinfo -p localhost
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
100024 1 udp 43521 status
100024 1 tcp 60423 status
3、启动NFS服务
[[email protected] ~]# /etc/init.d/nfs start
rpc.rquotad (pid 49232) is running...
[[email protected] ~]# rpcinfo -p localhost
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
100024 1 udp 43521 status
100024 1 tcp 60423 status
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 38917 mountd
100005 1 tcp 44150 mountd
100005 2 udp 42858 mountd
100005 2 tcp 52228 mountd
100005 3 udp 41216 mountd
100005 3 tcp 60796 mountd
4、NFS服务常见的进程详解
[[email protected] ~]# ps -ef | egrep "rpc|nfs"
rpc 1615 1 0 11:00 ? 00:00:00 rpcbind
rpcuser 1755 1 0 11:00 ? 00:00:00 rpc.statd
root 49221 2 0 18:35 ? 00:00:00 [rpciod/0]
root 49222 2 0 18:35 ? 00:00:00 [rpciod/1]
root 49223 2 0 18:35 ? 00:00:00 [rpciod/2]
root 49224 2 0 18:35 ? 00:00:00 [rpciod/3]
root 49232 1 0 18:35 ? 00:00:00 rpc.rquotad
root 49236 1 0 18:35 ? 00:00:00 rpc.mountd
root 49242 2 0 18:35 ? 00:00:00 [nfsd4]
root 49243 2 0 18:35 ? 00:00:00 [nfsd4_callbacks]
root 49249 2 0 18:35 ? 00:00:00 [nfsd]
root 49250 2 0 18:35 ? 00:00:00 [nfsd]
root 49251 2 0 18:35 ? 00:00:00 [nfsd]
root 49274 1 0 18:35 ? 00:00:00 rpc.idmapd
root 49318 2821 0 18:36 pts/0 00:00:00 egrep rpc|nfs
(1)Nfs服务启动的进程说明
NFS服务的主要任务是共享文件刺痛的数据,而文件系统数据的共享离不开权限问题。所以NFS服务器启动后时掷筛需要两个不同的进程,一个是管理NFS客户端是否能够登入rpxc.nfsd主进程,另一个用于管理NFS客户端是否能够取得对应权限的rpc.mountd进程,如果还需要管理磁盘配额,则NFS还需要再加载rpc.rpuotad进程。
服务或进程 |
用途说明 |
nfsd (rpc.nfsd) |
Rpc.nfsd的主要功能是管理NFS服务器端主机 |
Mountd (rpc.mountd) |
rpc.mountd的主要功能则是管理NFS文件系统,当NFS客户端顺利通过rpc.nfsd登入NFS服务器端的主机时,在使用NFS服务器提供数据之前,他会去读NFS的配置文件/etc/exports来对比NFS客户端的权限,通过这一关之后,还要经过NFS服务器端本地文件系统使用权限的认证程序, |
rpc.locke |
可以用来锁定文件,用于多客户端同时写入 |
rpc.statd |
检查文件的一致性 |
rpc.idmapd |
名字映射后台进程 |
5、配置NFS服务器端的服务开机自启动
[[email protected] ~]# chkconfig rpcbind on
[[email protected] ~]# chkconfig nfs on
[[email protected] ~]# chkconfig --list | egrep "nfs\b|rpcbind"
nfs 0:off1:off2:on3:on4:on5:on6:off
rpcbind 0:off1:off2:on3:on4:on5:on6:off
[[email protected] ~]# tail -3 /etc/rc.local
tail: inotify cannot be used, reverting to polling
#start uo nfs
/etc/init.d/rpcbind start
/etc/init.d/nfs start
6、Nfs服务器端共享文件的配置文件路径
[[email protected] ~]# cat /etc/exports
格式:
Nfs共享目录 nfs客户端1地址(权限) nfs客户端2地址(权限)
例如:可以编辑/etc/exports为:
/tmp*(rw,no_root_squash)
/home/public192.168.0.*(rw)*(ro)
/home/test192.168.0.100(rw)
/home/linux*.the9.com(rw,all_squash,anonuid=40,anongid=40)
7、NFS配置权限设置常用参数说明
参数名称 |
参数用途 |
ro |
只读访问 |
rw |
读写访问 |
sync |
所有数据在请求时写入共享 |
async |
NFS在写入数据前可以相应请求 |
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用户一样的权限(默认) |
anonuid=xxx |
指定NFS服务器/etc/passwd文件中匿名用户的UID |
实战:NFS服务案例配置
1、创建需要共享的目录并授权
[[email protected] ~]# mkdir -p /data
[[email protected] ~]# touch /data/a.txt
[[email protected] ~]# cp /etc/shadow /data/
[[email protected] ~]# chown -R nfsnobody.nfsnobody /data
[[email protected] ~]# chmod 777 /data/
[[email protected] ~]# ls -ld /data/
drwxrwxrwx 3 nfsnobody nfsnobody 4096 May 20 19:16 /data/
[[email protected] ~]# grep nfsnobody /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
2、配置NFS服务的配置文件,并在本地查看挂在信息
[[email protected] ~]# vim /etc/exports
[[email protected] ~]# cat /etc/exports
/data 192.168.1.0/24 (rw,sync)
[[email protected] ~]# exportfs -rv
exporting 192.168.1.0/24:/data
exporting *:/data
[[email protected] ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sr0 3.6G 3.6G 0 100% /mnt
[[email protected] ~]# mount -t nfs 192.168.1.61:/data/ /mnt/
[[email protected] ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sr0 20G 4.6G 14G 26% /mnt
192.168.1.61:/data/ 20G 4.6G 14G 26% /mnt
3、客户端安装rpcbind
[[email protected] ~]# yum install rpcbind nfs-utils -y
[[email protected] ~]# /etc/init.d/rpcbind status
rpcbind (pid 1695) 正在运行...
[[email protected]3 ~]# echo "/etc/init.d/rpcbind start" >> /etc/rc.local
[[email protected]3 ~]# echo "/bin/mount -t nfs 192.168.1.61:/data /mnt " >> /etc/rc.local
[[email protected]3 ~]# tail -2 /etc/rc.local
tail: inotify cannot be used, reverting to polling
/etc/init.d/rpcbind start
/bin/mount -t nfs 192.168.1.61:/data /mnt
[[email protected] ~]# showmount -e 192.168.1.61
Export list for 192.168.1.61:
/data (everyone)
4、挂在服务端的共享文件
[[email protected] ~]# mount -t nfs 192.168.1.61:/data /mnt
[[email protected] ~]# df -h
Filesystem Size Used Avail Use% Mounted on
hm
/dev/sda1 4.9G 162M 4.5G 4% /boot
/dev/sr0 20G 4.6G 14G 26% /mnt
192.168.1.61:/data 20G 4.6G 14G 26% /mnt
[[email protected] ~]# mount
.........
192.168.1.61:/data on /mnt type nfs (rw,vers=4,addr=192.168.1.61,clientaddr=192.168.1.63)
5、测试读写数据
[[email protected]3 ~]# ls /mnt
a.txt shoadow
[[email protected]3 ~]# mkdir /mnt/test
[[email protected]3 ~]# ls /mnt
a.txt shoadow test
[[email protected]1 ~]# ls /mnt
a.txt shoadow test
附件:
NFS常用路径 |
说明 |
/etc/exports |
NFS服务的主配置文件。 |
/usr/sbin/exports |
NFS的管理命令,可以加载NFS配置生效等 |
/usr/sbin/showmount |
用来客户端查看NFS配置及挂在结果命令 |
/var/lib/nfs/etab |
NFS配置文件的完整参数设定文件 |
/pro/mounts |
客户端挂在参数 |
/vae/lib/nfs/rmtab |
客户端访问服务器exports的信息列表 |