NFS详解
NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。
NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利;
基本上NFS这个服务器的端口开在2049,但由于文件系统非常复杂。因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据的端口是随机选择的,
是小于1024的端口;既然是随机的那么客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现了!
RPC与NFS如何通讯 因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,
客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,
如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,记客户端可以连接到正常端口上去。 RPC又是如何知道每个NFS功能的端口 首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求
如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。 提示:在启动NFS SERVER之前,首先要启动RPC服务(即portmap服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失
因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。
特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。
1)首先服务器端启动RPC服务,并开启111端口 2)服务器端启动NFS服务,并向RPC注册端口信息 3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口 4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。 5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
主要配置文件:/etc/exports 这个档案就是 NFS 的主要配置文件了!不过,系统并没有默认值,所以这个档案『 不一定会存在』,你可能必须要使用 vim 主动的建立起这个档案喔!我们等一下要谈的设定也仅只是这个档案而已吶! NFS 文件系统维护指令:/usr/sbin/exportfs 这个是维护 NFS 分享资源的指令,我们可以利用这个指令重新分享 /etc/exports 变更的目录资源、将 NFS Server 分享的目录卸除或重新分享等等,这个指令是 NFS 系统里面相当重要的一个喔!至于指令的用法我们在底下会介绍。 分享资源的登录档:/var/lib/nfs/*tab 在 NFS 服务器的登录文件都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登录档, 一个是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 则记录曾经链接到此 NFS 服务器的相关客户端数据。 客户端查询服务器分享资源的指令:/usr/sbin/showmount 这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client 端。这个 showmount 可以用来察看 NFS 分享出来的目录资源喔
服务端操作 [root@#quan#Better ~]$rpm -qa | grep nfs #查看是否安装了nfs nfs-utils-1.2.3-78.el6_10.1.x86_64 nfs-utils-lib-1.1.5-13.el6.x86_64 nfs4-acl-tools-0.3.3-8.el6.x86_64 nfs-utils-lib-devel-1.1.5-13.el6.x86_64 [root@#quan#Better ~]$rpm -qa | grep rpcbind #查看是否安装了nfs rpcbind-0.2.0-13.el6.x86_64 [root@#quan#Better ~]$yum -y install nfs-utils rpcbind #安装nfs Loaded plugins: fastestmirror, refresh-packagekit, security Setting up Install Process Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: centos.ustc.edu.cn * updates: mirrors.aliyun.com base | 3.7 kB 00:00 extras | 3.4 kB 00:00 updates | 3.4 kB 00:00 Package 1:nfs-utils-1.2.3-78.el6_10.1.x86_64 already installed and latest version Resolving Dependencies --> Running transaction check ---> Package rpcbind.x86_64 0:0.2.0-13.el6 will be updated ---> Package rpcbind.x86_64 0:0.2.0-16.el6 will be an update --> Finished Dependency Resolution Dependencies Resolved ======================================================================================================= Package Arch Version Repository Size ======================================================================================================= Updating: rpcbind x86_64 0.2.0-16.el6 base 51 k Transaction Summary ======================================================================================================= Upgrade 1 Package(s) Total download size: 51 k Downloading Packages: rpcbind-0.2.0-16.el6.x86_64.rpm | 51 kB 00:00 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Updating : rpcbind-0.2.0-16.el6.x86_64 1/2 Cleanup : rpcbind-0.2.0-13.el6.x86_64 2/2 Verifying : rpcbind-0.2.0-16.el6.x86_64 1/2 Verifying : rpcbind-0.2.0-13.el6.x86_64 2/2 Updated: rpcbind.x86_64 0:0.2.0-16.el6 Complete! [root@#quan#Better ~]$mkdir /quan #建立共享目录 [root@#quan#Better ~]$ll -d /quan drwxr-xr-x 2 root root 4096 Sep 17 16:30 /quan [root@#quan#Better ~]$chmod 666 /quan #修改共享目录的权限 [root@#quan#Better ~]$ll -d /quan drw-rw-rw- 2 root root 4096 Sep 17 16:30 /quan [root@#quan#Better ~]$vim /etc/exports #修改nfs 的配置文件
[root@#quan#Better quan]$cat /etc/exports
/quan *(rw,no_root_squash,no_all_squash,sync)
[root@#quan#Better ~]$export export exportfs [root@#quan#Better ~]$exportfs -r #平滑生效 [root@#quan#Better ~]$service nfs start #启动nfs [root@#quan#Better ~]$service rpcbind start #启动rpcbind [root@#quan#Better ~]$rpcinfo -p localhost #查看 RPC 服务的注册状况 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 35929 status 100024 1 tcp 56297 status 100011 1 udp 875 rquotad 100011 2 udp 875 rquotad 100011 1 tcp 875 rquotad 100011 2 tcp 875 rquotad 100005 1 udp 41810 mountd 100005 1 tcp 47423 mountd 100005 2 udp 33792 mountd 100005 2 tcp 57060 mountd 100005 3 udp 33529 mountd 100005 3 tcp 34835 mountd 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 52934 nlockmgr 100021 3 udp 52934 nlockmgr 100021 4 udp 52934 nlockmgr 100021 1 tcp 45172 nlockmgr 100021 3 tcp 45172 nlockmgr 100021 4 tcp 45172 nlockmgr
选项与参数:
-p :针对某 IP (未写则预设为本机) 显示出所有的 port 与 porgram 的信息;
-t :针对某主机的某支程序检查其 TCP 封包所在的软件版本;
-u :针对某主机的某支程序检查其 UDP 封包所在的软件版本;
#server 端先自我测试一下是否可以联机,利用 showmount 这个指令来查阅!
[root@#quan#Better ~]$showmount -e localhost
Export list for localhost:
/quan *
-a :显示目前主机与客户端的 NFS 联机分享的状态;
-e :显示某部主机的 /etc/exports 所分享的目录数据。
[root@#quan#Better ~]$cd /quan/
[root@#quan#Better quan]$ls
[root@#quan#Better quan]$echo "quan >" test quan > test
[root@#quan#Better quan]$echo "quan " >> test
[root@#quan#Better quan]$ls test
[root@#quan#Better quan]$cat /etc/exports /quan *(rw,no_root_squash,no_all_squash,sync)
NFS配置文件权限参数说明(/etc/exports)
1、rw:表示可读写权限。
2、ro:表示只读权限。
3、sync:请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回。(优点:数据安全不会丢。缺点:性能比启用该参数要差)。
4、async:写入时数据会先写到内存缓冲区,只到硬盘有空档才会再写入磁盘,这样可以提升写入效率!风险:若服务器宕机或不正常关机,会损失
缓冲区中未写入磁盘的数据(解决办法:服务器主板电池或加UPS不间断电源)。
5、no_root_squash:访问NFS Server共享目录的用户如果是root的话,它对该共享目录具有root权限,这个配置原本是为无盘客户端准备的。用户应避免使用。
6、root_squash:如果访问NFS Server共享目录的用户是root,则它的权限将压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody账号身份。
7、all_squash:不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody账号身份。在
早期多个NFS客户端同时读写NFS Server数据时,这个参数很有用。
在生产中配置NFS的重要技巧:
生产环境中常用的一种配置,适合多客户端共享一个NFS目录。All_squash 也就是说不管客户端是以什么样的身份来进行访问的,都会被压缩成为all_squash后面所接的用户和群组身份。这边用anonuid、anongid编号来标示。=
1、确保所有客户端服务器对NFS共享目录具备相同的用户访问权限
a、all_squash把所有客户端都压缩成固定的匿名用户(UID相同)。
b、就是anonuid,anongid指定的UID和GID的用户。
2、所有的客户端和服务端都需要有一个相同的GID和UID用户,即nfsnobody(UID必须相同)。
anonuid:参数以anon*开头即指anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然也可以自行设置这个UID值。
但是UID必须存在于/etc/passwd中。在多NFS Clients时,如果Web Server共享一个NFS目录,通过这个参数可以使得不同的NFS
Clients写入的数据对所有NFS Clients保持统一的用户权限,即为配置的匿名UID对应的用户权限,这个参数很有用,一般默认即可。
anongid:同anonuid,区别就是把uid(用户id)换成gid(组id)。
#客户端设置 [root@MiWiFi-R1CM-srv ~]# yum -y install nfs-utils #安装客户端 Loaded plugins: fastestmirror, refresh-packagekit, security Setting up Install Process Loading mirror speeds from cached hostfile * base: ap.stykers.moe * extras: mirrors.aliyun.com * updates: ap.stykers.moe base | 3.7 kB 00:00 extras | 3.4 kB 00:00 updates | 3.4 kB 00:00 Package 1:nfs-utils-1.2.3-78.el6_10.1.x86_64 already installed and latest version Nothing to do [root@MiWiFi-R1CM-srv ~]# mkdir /lys #建立挂载目录 [root@MiWiFi-R1CM-srv ~]# showmount -e 192.168.31.66 #查看服务器抛出的共享目录信息 Export list for 192.168.31.66: /quan * [root@MiWiFi-R1CM-srv ~]# mount -t nfs 192.168.31.66:/quan /lys -o proto=tcp -o nolock #挂载目录 [root@MiWiFi-R1CM-srv ~]# df -h #查看挂载信息 Filesystem Size Used Avail Use% Mounted on /dev/sda5 21G 3.9G 16G 20% / tmpfs 491M 80K 491M 1% /dev/shm /dev/sda1 2.0G 36M 1.8G 2% /boot /dev/sda2 4.8G 10M 4.6G 1% /data_for_quan 192.168.31.66:/quan 21G 6.2G 14G 32% /lys [root@MiWiFi-R1CM-srv ~]# ls anaconda-ks.cfg Downloads keepalived-1.2.1 nginx-1.12.0 Public Desktop install.log keepalived-1.2.1.tar.gz nginx-1.12.0.tar.gz Templates Documents install.log.syslog Music Pictures Videos [root@MiWiFi-R1CM-srv ~]# cd /l lib/ lib64/ lost+found/ lys/ [root@MiWiFi-R1CM-srv ~]# cd /lys/ [root@MiWiFi-R1CM-srv lys]# ls test [root@MiWiFi-R1CM-srv lys]# cat test quan [root@MiWiFi-R1CM-srv lys]# umount /l lib/ lib64/ lost+found/ lys/ [root@MiWiFi-R1CM-srv lys]# umount /lys/ #卸载挂载目录 umount.nfs: /lys: device is busy umount.nfs: /lys: device is busy #一定将现在位置移除挂载目录才能卸载成功 [root@MiWiFi-R1CM-srv lys]# cd .. [root@MiWiFi-R1CM-srv /]# umount /lys/ [root@MiWiFi-R1CM-srv /]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda5 21G 3.9G 16G 20% / tmpfs 491M 80K 491M 1% /dev/shm /dev/sda1 2.0G 36M 1.8G 2% /boot /dev/sda2 4.8G 10M 4.6G 1% /data_for_quan [root@MiWiFi-R1CM-srv /]#
为了方便配置防火墙,需要固定nfs服务端口
NFS启动时会随机启动多个端口并向RPC注册,这样如果使用iptables对NFS端口进行限制就会有点麻烦,可以更改配置文件固定NFS服务相关端口。
[root@#quan#Better quan]$vim /etc/sysconfig/nfs
RQUOTAD_PORT=30001 LOCKD_TCPPORT=30002 LOCKD_UDPPORT=30002 MOUNTD_PORT=30003 STATD_PORT=30004
重启服务即可,这样随机端口就改为固定端口了