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 

重启服务即可,这样随机端口就改为固定端口了

 

 

 

posted @ 2019-11-20 08:46  linux——quan  阅读(2528)  评论(0编辑  收藏  举报