NFS简介:


NFS(Network File System)即网络文件系统,最早是由Sun Microsystems在内部作为实验完成开发,是第一个构建于IP协议之上的网络文件系统,主要功能是通过TCP/IP在不同主机系统之间共享资源(文件或目录)。
NFS客户端可以通过挂载的方式将NFS服务器共享的数据目录挂载到本地,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
NFS网络文件系统有点类似Samba服务。samba主要用于在windows和unix之间共享资源,资源包括文件、打印机等等。而NFS一般用于Unix系统之间的资源共享,当然也可以共享到Windows。

为什么使用NFS:


硬件存储本身就很贵的,而随着公司业务的不断发展,网站并发继续加大时,硬件存储的扩展升级成本高,成几何倍的增长,这对于中小型企业来说是一笔不菲的开销。 
所以一般中小型网站就会选择NFS进行数据共享,如果大型网站很有可能会用到更复杂的分布式文件系统,例如:MFS(Moosefs)、GlusterFS、FastDFS 等
NFS系统经历了近30年的发展, 已经是一个非常稳定、可移植、可扩展、高性能 的企业级应用,所以在中小型企业中使用的比较广泛。

NFS的原理:

在NFS服务器上设置好一个共享目录/data/server后,具有访问权限的NFS客户端都可以将/data/server这个共享目录挂载到本地的某个挂载点,这个挂载点可以自己随意指定。
客户端正确挂载完成后,就可以通过NFS客户端挂载点所在的目录查看NFS服务器共享出来的/data/server目录下的所有数据。在客户端查看时,这个共享目录就相当于客户端本地磁盘上的目录,几乎感觉不到有何区别。
根据NFS服务器端设置的权限以及/data/server共享目录的本地系统权限,只要在指定的NFS客户端挂载共享目录, 就可以将数据轻松的存取到NFS服务器上的/data/server共享目录中。

CentOS7 搭建企业级NFS网络文件服务器_系统/运维


NFS是通过TCP/IP来进行服务端和客户端之间的数据传输,两者之间要传输数据就要有相对应的端口来进行传输。
但是这里有一个问题,就是NFS的端口是不固定的,因为NFS有很多的功能,而不同的功能都会使用不同的端口,NFS服务在启动时会随机选择端口,所以NFS服务器无法固定端口。

既然NFS服务器的端口不固定,NFS客户端又怎么知道服务器端使用的是那个端口呢 ?
所以就需要通过RPC服务来帮忙(Remote Procedure Call,远程过程调用)简称RPC
当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开起111端口,如果客户端有请求,那服务端的RPC就会将记录的NFS端口信息告知客户端。
也就是说RPC的主要功能就是记录NFS功能所对应的端口号,并且在NFS客户端请求时将对应的端口信息返给NFS客户端,从而确保客户端可以连接到正确的NFS端口,才能实现数据传输/数据交互的目的。

在启动NFS之前,首先要启动RPC服务,否则NFS就无法向RPC注册了。另外,如果RPC服务重新其从,原来注册好的NFS端口就会丢失,因此NFS服务也需要重启以重新向RPC注册端口信息。
要特别注意的是,修改了NFS的配置文件之后是不需要重启的,执行命令 /etc/init.d/nfs reload 或者 exportfs -rv 即可使NFS服务的配置文件/etc/exportfs生效。
无论是NFS客户端还是NFS服务器端,都需要先启动RPC服务。
NFS客户端无需启动NFS,但是需要启动RPC服务。


客户端NFS和服务端NFS通讯过程


1)首先服务器端启动RPC服务并开启111端口
2)启动NFS服务并向RPC注册端口信息
3)客户端向服务端的RPC请求服务端的NFS端口
4)服务端的RPC服务反馈NFS端口信息给客户端。
5)客户端通过获取到的NFS端口来建立和服务端的NFS连接并进行数据的传输。

CentOS7 搭建企业级NFS网络文件服务器_Linux_02




NFS服务器端部署

我这里服务器端系统是 CentOS7,客户端是CentOS6。

关闭防火墙
[root@localhost ~]# systemctl stop firewalld.service   #关闭防火墙
[root@localhost ~]# systemctl disable firewalld.service  #禁止防火墙开机启动

关闭SELinux

[root@localhost ~]# setenforce 0  #临时关闭
#修改配置文件 vim /etc/selinux/config
SELINUX=disabled

服务端需要的软件包 nfs-utils rpcbind

nfs-utils  是NFS服务的主程序包

rpcbind 是RPC服务的程序包


centos6和centos7默认没有安装nfs(centos5已经默认安装了), 所以需要我们手动安装。可以使用  yum -y install nfs-utils rpcbind 命令安装。
采用yum方式安装, 只需要安装 nfs-utils,yum会自动安装rpcbind。

1.查看系统系信息


[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

2.检查系统是否安装了nfs


[root@localhost ~]# rpm -qa nfs-utils rpcbind

3.安装nfs


[root@localhost ~]# yum -y install nfs-utils rpcbind

[root@localhost ~]# rpm -qa nfs-utils rpcbind  #如果出现nfs和rpc开头的两个软件包,表示nfs已经安装好了
rpcbind-0.2.0-47.el7.x86_64
nfs-utils-1.3.0-0.61.el7.x86_64

4.启动rpc服务


在启动nfs服务前, 要先启动rpc
[root@localhost ~]# systemctl  start  rpcbind   #启动rpc
[root@localhost ~]# systemctl  enable  rpcbind  #将加入开机启动那个

查看是否启动成功
[root@localhost ~]# systemctl  status  rpcbind #查看rpc运行状态

[root@localhost ~]# systemctl  list-unit-files  | grep  rpcbind   # 查看rpc是否加入开机启动

CentOS7 搭建企业级NFS网络文件服务器_Linux_03


[root@localhost ~]# rpcinfo  -p  localhost    #查看nfs服务向rpc注册的端口信息,因为nfs还没启动,所以没有太多的端口。

[root@localhost ~]# 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

5.启动nfs服务


[root@localhost ~]# systemctl start  nfs  #启动nfs
[root@localhost ~]# systemctl  enable nfs  #将nfs加入开机启动

查看是否启动成功
[root@localhost ~]# systemctl  status nfs  #查看服务运行状态
[root@localhost ~]# systemctl list-unit-files | grep nfs.service  #查看是否将nfs服务加入开机运行

CentOS7 搭建企业级NFS网络文件服务器_系统/运维_04


[root@localhost ~]# rpcinfo  -p  localhost    #查看nfs服务向rpc注册的端口信息,和刚才没启动nfs的时相比较,现在监听了更多的端口。

[root@localhost ~]# 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  37652  status
     100024    1   tcp  45595  status
     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  58685  nlockmgr
     100021    3   udp  58685  nlockmgr
     100021    4   udp  58685  nlockmgr
     100021    1   tcp  41537  nlockmgr
     100021    3   tcp  41537  nlockmgr
     100021    4   tcp  41537  nlockmgr


NFS服务的主要任务是共享文件系统数据,而文件系统数据的共享离不开权限问题。

所以NFS服务器启动时最少需要两个不同的进程,一个是管理nfs客户端是否能够登入的rpc.nfsd主进程,另一个用于管理nfs客户端是否能够取得对应权限的rpc.mountd进程。
如果还需要管理磁盘配额,则nfs还需要加载rpc.rquotad进程。

[root@localhost ~]# ps -ef | grep rpc 
rpc       11095      1  0 02:26 ?        00:00:00 /sbin/rpcbind -w
rpcuser   11160      1  0 02:59 ?        00:00:00 /usr/sbin/rpc.statd
root      11170      2  0 02:59 ?        00:00:00 [rpciod]
root      11174      1  0 02:59 ?        00:00:00 /usr/sbin/rpc.idmapd
root      11180      1  0 02:59 ?        00:00:00 /usr/sbin/rpc.mountd
root      11812  10857  0 03:28 pts/2    00:00:00 grep --color=auto rpc
[root@localhost ~]# ps -ef | grep nfs
root      11185      2  0 02:59 ?        00:00:00 [nfsd4_callbacks]
root      11191      2  0 02:59 ?        00:00:00 [nfsd]
root      11192      2  0 02:59 ?        00:00:00 [nfsd]
root      11193      2  0 02:59 ?        00:00:00 [nfsd]
root      11194      2  0 02:59 ?        00:00:00 [nfsd]
root      11195      2  0 02:59 ?        00:00:00 [nfsd]
root      11196      2  0 02:59 ?        00:00:00 [nfsd]
root      11197      2  0 02:59 ?        00:00:00 [nfsd]
root      11198      2  0 02:59 ?        00:00:00 [nfsd]
root      11814  10857  0 03:30 pts/2    00:00:00 grep --color=auto nfs

NFS 服务的配置文件


NFS服务的默认配置文件路径 /etc/exportfs 并且默认是空的,需要用户自行配置。
/etc/exportfs 文件配置的格式:
NFS共享目录   NFS客户端地址1 (参数1,参数2,只读还是可写)   NFS客户端地址2 (参数1,参数2,......)

参数说明:
         NFS共享目录:是服务器端的本地目录,是我们想要共享给网络上其他主机使用的目录。假如我要共享的是/data/server目录,那么此选项可以就直接写/data/server
         NFS客户端地址:客户端地址能够设置一个网段,也可以设置为单个主机,
         参数:如读写权限(rw,同步更新sync,压缩来访账户all_squash,压缩后的匿名账号anonuid=uid,anongid=gid等等..)
        

生产环境常见配置实例:


配置实例1: /data/server  192.168.1.11(rw,sync) 
###括号前不能有空格 rw表示可读写,sync表示同步更新到磁盘,同步将内存内的文件写入到磁盘空间,保证数据不丢失,但会影响性能。

配置实例2:/data/server  192.168.1.11/24(rw,sync,all_squash,anonuid=65534,anongid=65534)
###生产环境中常用的一种配置,适合多客户端共享一个NFS目录。all_squash 也就是说不管客户端是以什么样的身份来进行访问的,都会被压缩成为all_squash后面所接的用户和群组身份。这边用anonuid、anongid编号来表示。

配置实例3:/data/server 192.168.1.11/24(ro) 
###表示只能读权限


NFS权限设置


NFS配置权限设置,即/etc/exports文件配置格式中小括号()里的参数集。
rw  表示可读写
ro  Read-only表示只能读权限
sync 写入数据时数据同步写入到NFS server的硬盘中后才会返回,数据安全不会丢失。
async 写入数据时先写到内存缓冲区,直到硬盘有空档时才会再写到磁盘,这样可以提升写入效率,但是如果服务器宕机,缓冲区的数据没来得及写入到磁盘,这些数据将会丢失。
no_root_squas 访问nfs server共享目录的用户如果是root的话,它对该目录具有root权限。这个配置原本为无盘用户准备的。(正常情况应避免使用!)
root_squash   对于访问NFS server共享目录的用户,如果是root的话会被压缩成为nobody用户身份。

all_squash  不管访问nfs server共享目录的用户身份如何包括root,它的权限都将被压缩成为匿名用户,同时他们的udi和gid都会变成nobody或nfsnobody账户的uid,gid。在多个nfs客户端同时读写nfs server数据时,这个参数很有用***可以确保大家写入的数据的权限是一样的。
但不同系统有可能匿名用户的uid,gid不同。因为此处我们需要服务端和客户端之间的用户是一样的。比如说:服务端指定匿名用户的UID为65534,那么客户端也一定要存在65534这个账号才可以

anonuid  anonuid就是匿名的uid和gid。说明客户端以什么权限来访问服务端,在默认情况下是nfsnobody。uid65534.
anongid  同anongid,就是把uid换成gid而已。

客户端来访问的用户
客户端访问服务端默认是使用nfsnobody这个用户来进行访问的。uid和gid为65534。服务器默认共享时,也是加上了all_squash这个参数。
并制定anonuid为65534(也就是nfsnobayd用户)。当然如果系统中nfsnobody是其他的uid,那么就有可能造成访问权限出现问题。
所以最好我们可以通过一设置一个用户来访问,统一UID、GID。


查看客户端挂载情况
有两个重要的文件/var/lib/nfs/etab、/var/lib/nfs/rmtab这两个文件就能够查看服务器上共享了什么目录,到底有多少客户端挂载了共享,能查看到客户端挂载的具体信息。
1、/var/lib/nfs/etab这个文件能看到服务器上共享了哪些目录,执行哪些人可以使用,并且设定的参数为何。
2、/var/lib/nfs/rmtab这个文件就是能够查看到共享目录被挂载的情况。


NFS配置实例


实例:共享/data/server目录给192.168.1.11

[root@localhost ~]# mkdir -p  /data/server   #创建共享目录
[root@localhost ~]# ll -d  /data/server
drwxr-xr-x 2 root root 6 Mar 13 15:12 /data/server/   #注意现在共享的目录的权限为只有root才有写权限。
[root@localhost ~]# chown nfsnobody.nfsnobody /data/server/ #更改目录所属主和所属组。
[root@localhost ~]# ll -d /data/server
drwxr-xr-x 2 nfsnobody nfsnobody 6 Mar 13 15:12 /data/server/  #现在nfsnobody用户有读写权限了。

添加NFS配置文件

[root@localhost ~]# cat /etc/exports
# Shared /data/server directory to 192.168.1.11 
/data/server 192.168.1.11(rw,sync)
[root@localhost ~]# systemctl  reload nfs  #重新加载nfs
[root@localhost ~]# showmount -e localhost  #服务器本地确认是否共享正常
Export list for localhost:
/data/server 192.168.1.11

权限说明:在配置文件中设置了权限rw。只表明了网络端的主机能够有权限去服务器端去写文件,但还需要通过服务器端的本地目录的权限。
并且客户端往服务端去写文件的用户身份是nfsnobody、nfsnobody UID=65534。那么也就是说客户端需要通过两层的权限来控制的。NFS配置文件—>共享目录文件的权限。



查看NFS服务的版本

服务器端 nfsstat  -s | grep Server

[root@localhost server]# nfsstat  -s | grep Server
Server rpc stats:
Server nfs v4:
Server nfs v4 operations:



现在就是让客户端来进行挂载就可以了。

--------------------------------------------------------

NFS客户端

我这里客户端是CentOS6
NFS客户端只需要启动rpc服务即可。

关闭防火墙
[root@localhost ~]# /etc/init.d/iptables  stop  #关闭防火墙
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]

[root@localhost ~]# chkconfig  iptables off   #禁止防火墙开机启动


关闭SELinu
[root@localhost ~]# setenforce 0  #临时关闭
#修改配置文件 vim /etc/selinux/config
SELINUX=disabled

1.查看系统系信息


[root@localhost ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)

[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

2.检查系统是否安装了rpc


[root@localhost ~]# rpm -qa nfs-utils rpcbind

3.安装rpc

[root@localhost ~]# yum -y install nfs-utils rpcbind
[root@localhost ~]# rpm -qa nfs-utils rpcbind  #如果出现nfs和rpc开头的两个软件包,表示nfs已经安装好了
nfs-utils-1.2.3-78.el6_10.1.x86_64
rpcbind-0.2.0-16.el6.x86_64

4.启动rpc服务


在启动nfs服务前, 要先启动rpc

[root@localhost ~]# /etc/init.d/rpcbind  start    #启动rpc
Starting rpcbind:             [  OK  ]

[root@localhost ~]# chkconfig rpcbind on              #将rpc加入开机启动那个

[root@localhost ~]# chkconfig  --list | grep rpcbind  #查看rpc是否加入开机启动
rpcbind            0:off    1:off    2:on    3:on    4:on    5:on    6:off

查看是否启动成功 

[root@localhost ~]# /etc/init.d/rpcbind  status 
rpcbind (pid  2310) is running...
[root@localhost ~]# netstat  -anput | grep rpc
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      2310/rpcbind        
tcp        0      0 :::111                      :::*                        LISTEN      2310/rpcbind        
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               2310/rpcbind        
udp        0      0 0.0.0.0:789                 0.0.0.0:*                               2310/rpcbind        
udp        0      0 :::111                      :::*                                    2310/rpcbind        
udp        0      0 :::789                      :::*                                    2310/rpcbind

 

[root@localhost ~]# rpcinfo  -p  localhost  #查看nfs服务想rpc注册的端口信息,客户端只启动rpc服务即可。

[root@localhost ~]# 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
NFS客户端挂载

查看服务器端的共享信息

[root@localhost ~]# showmount  -e 192.168.1.21
Export list for 192.168.1.21:
/data/server 192.168.1.11

挂载服务器共享出来的目录

[root@localhost ~]# mkdir   /data/client  # 要先创建挂载点
[root@localhost ~]# mount -t nfs  192.168.1.21:/data/server  /data/client  #把共享目录挂载到本地

#mount 命令格式如下:
mount -t  类型   device   localedir(本地目录)
以上这个命令device=192.168.1.21:/data/server   类型为nfs

查看磁盘情况

[root@localhost ~]# df -TH
Filesystem           Type   Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                      ext4    19G  831M   17G   5% /
tmpfs                tmpfs  523M     0  523M   0% /dev/shm
/dev/sda1            ext4   500M   29M  445M   7% /boot
192.168.1.21:/data/server
                      nfs     19G  1.2G   18G   7% /data/client

查看挂载情况

[root@localhost client]# mount -l
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
192.168.1.21:/data/server on /data/client type nfs (rw,vers=4,addr=192.168.1.21,clientaddr=192.168.1.11)

查看更详细的挂载信息 cat /proc/mounts

[root@localhost client]# cat /proc/mounts  
rootfs / rootfs rw 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
devtmpfs /dev devtmpfs rw,relatime,size=499224k,nr_inodes=124806,mode=755 0 0
devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /dev/shm tmpfs rw,relatime 0 0
/dev/mapper/VolGroup-lv_root / ext4 rw,relatime,barrier=1,data=ordered 0 0
/proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0
/dev/sda1 /boot ext4 rw,relatime,barrier=1,data=ordered 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0
192.168.1.21:/data/server /data/client nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.11,minorversion=0,local_lock=none,addr=192.168.1.21 0 0


测试
1.在nfs服务器端, 进入/data/server共享目录, 创建test-nfs.txt文件

[root@localhost server]# pwd
/data/server
[root@localhost server]#  touch test-nfs.txt

2.在nfs客户端,进入/data/client挂载目录,创建test-nfs222.txt文件

[root@localhost client]# pwd
/data/client
[root@localhost client]# touch test-nfs222.txt
[root@localhost client]# ls 
test-nfs222.txt  test-nfs.txt
[root@localhost client]# ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 14  2019 test-nfs222.txt
-rw-r--r-- 1 root      root      0 Mar 14  2019 test-nfs.txt

test-nfs.txt 是在服务器端以root创建的,所以权限是root。
test-nfs222.txt 是在客户端以root创建的,但是文件的权限被压缩成nfsnobody用户了。

[root@localhost server]# cat /etc/exports
# Shared /data/server directory to 192.168.1.11 
/data/server 192.168.1.11(rw,sync)
[root@localhost server]# showmount  -e localhost
Export list for localhost:
/data/server 192.168.1.11
[root@localhost server]# cat /var/lib/nfs/etab 
/data/server    192.168.1.11(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)

从/var/lib/nfs/etab 这个文件中我们可以看到, 在共享的时候即使我们只指定了rw和rsync这两参数, nfs也会默认有很多参数。其中就有all_squash,这个参数在客户端的作用就是不管你用什么用户创建的文件,都会被强制压缩成nfsnobody。



客户端NFS挂载参数


    
我们客户端挂载NFS也可以设置很多参数的,-o 后面的参数。
客户端挂载可以设置:不可执行、读写权限、断开后RPC呼叫方式、读写区块大小等。
一般来说当nfs服务器提供的只是普通数据(图片html,css,jss,视频等)应该不需要执行suid,exec等权限,
由于是共享目录不存在设备所以也不存在挂载设备dev,因此在客户端挂载的时候,可以加上给你这几个命令挂载。

mount -t  nfs -o  nosuid,noexec,nodev,rw 192.168.1.21:/data/server  /data/client

可使用挂载参数:


suid  允许设置suid
nosuid  不允许在共享文件系统中设置suid ,默认是suid

rw  读写权限
ro  只读

dev   保留设备文件的特殊功能
nodev  不保留(一般来说只有/dev才会有特殊的设备文件,因此可以选在nodev),默认是dev

exec    允许执行任何二进制文件
noexec  不允许在共享文件系统中直接执行任何二进制文件,默认是exec

user  允许用户拥有文件的挂载与卸载的功能
nouser  不允许用户拥有文件的挂载与卸载功能(如果要保护文件系统,最好不要为用户提供挂载与卸载的功能),默认是nouser

auto   这个auto指的是"mount -a"时会不会自动挂载的项目,
noauto  不自动挂载,默认是auto


针对一些高并发的情况,还有一些可以进行优化的参数:


fg
bg   
当执行挂载时,该挂载行为是在前台(fg)还是在后台(bg)执行。若在前台执行,则mount会持续尝试链接,直到成功或time  out为止。
若为在后台执行,则mount会在后台持续多次进行mount,而不会影响到前台的程序操作。
如果网络联机不稳定,或是服务器常常需要开关机。建议使用bg比较妥当。默认为fg


soft
hard
使用挂载时会使用RPC呼叫。如果是hard的情况,那么当两者之间有任何一台主机离线,那RPC会持续呼叫,直到对方恢复联机为止。
而soft,只是在RPC time out后重复呼叫。而非持续呼叫。因此系统的延迟会不这么明显,如果服务器经常开开关关的话,建议使用soft。
在生产环境中推荐使用hard,intr这样的方式来挂载。默认为hard

intr
当使用hard方式挂载时,若加上intr参数,则RPC的持续呼叫是可以被中断的

rsize
wsize
读出(rsize)和写入(wsize)的区块大小。这个设置值可以影响客户端与服务器端传输数据的缓冲存储容量。
一般来说,如果在局域网内(LAN),并且客户端与服务器都具有足够的内存,这个值可以设置大一点,比如说32768,提升缓冲区块将可提升NFS文件系统的传输能力。
但设置的值也不要太大,最好是实现网络能够传输的最大值为限。默认rsize=1024,wsize=1024

proto=udp
使用UDP协议来传输数据,在内网中会有较好的性能,但是在Internet的话,使用proto=tpc传输的数据会有较好的纠错能力。默认是proto=tcp



NFS客户端如何挂载才最佳


命令格式如下:

mount –t nfs –o nosuid,noexec,nodev,rw,hard,intr,rsize=32768,wsize=32768  192.168.1.21:/data/server   /data/client

1)  noexec,nosuid,nodev,因为共享存放的是简单资料,不需要suid位不需要执行,没有设备文件。

2)  hard,intr,bg 当NFS链接断了之后会一直去监测服务端的NFS服务直到恢复之后重新连接。

3)  rsize=32768 wsize=32768 调优NFS传输的区块大小。

4)  基本参数:rw 读写权限。


如何设置开机自动挂载


1.通过把 mount –t  nfs 192.168.1.21:/data/server   /data/client 这条命令写到/etc/rc.local中,让它开机就执行。

2.在/etc/fstab(系统开机启动分区加载项)添加我们的NFS配置:
192.168.1.21:/data/serve      /data/client   nfs  defaults  1  1

但在生产环境中,对于共享的NFS目录,一般不会配置到/etc/fstab里。
因为在客户端主机重启时如果由于网络等原因连接不上nfs server时,就会导致客户机无法启动的厄运发生。
有两种方式实现开机自动挂载,但这里建议采用第一种,如果因为网络原因没有连接到NFSserver那么第二中有可能会导致系统无法启动的故障。


如果卸载时提示:"umount.nfs: /data/client: device is busy",需要退出挂载目录再进行卸载,如果NFS 服务器宕机了,则需要强制卸载,可执行命令:umount -lf /data/client
强制卸载:umount –lf  /data/client

NFS客户端挂载优化:

1.有关系统安全挂载参数选项


在企业工作场景,一般来说,NFS服务器共享的只是普通静态数据(图片、附件、视烦),不需要执行suid、exec等权限,
挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性,例如:很多***篡改站点文件都是由上传入口上传的程序到存储目录,然后执行的。
因此在挂载的时候,用下面的命令很有必要

mount -t nfs -o nosuid, noexec ,node, rw 10.0.0.7:/data  /mnt


通过 mount -o 指定挂载参数与在 /etc/fstab里指定挂载参数的效果是一样的。网络文件系统和本地的文件系统效果也是一样的。

2.mount挂载性能优化参数选项


下面介绍几个在企业生产环境下,NFS性能优化挂载的例子

1)禁止更新目录及文件时间戳挂载,命令如下:

mount -t nfs -o noatime,nodiratime 10.0.0.7:/data  /mnt

2)安全加优化的挂载方式如下

mount -t nfs -o nosud,noexec,node,noatime,noduratime,intr,rsize=131072,wsize=131072  10.0.0.7:/data  /mnt

3)默认的挂载方式如下

mount -t nfs 10.0.0.7:/data  /mnt

WSIZE和RSIZE的大小最好是1024的倍数,对于NFSv2来说,8192是RSIZE和 WSIZE的最大数值,如果使用的是NFSv3,则可以尝试设置32768,如果是NFSv4可以到65536或更大。

如果在客户端挂载时使用了这两个参数,可以让客户端在读取和写入数据时,一次性读写更多的数据包,这可以提升访问性能和效率。
除此之外,还有 noatime,mxtiratimc 性能优化选项,
这两个选项是说在读写磁盘的时候不更新文件和目录的时间戮(即不更新文件系统中文件对应 inode 信息),这样就可以减少和磁盘系统的交互,提升读取和写入磁盘的效率,
因为磁盘是机械的,每次读写都会消耗磁盘I/O,而更新文件时间戳对于工作数据必要性不大,最大问题是增加了访问磁I/O的次数,拖慢系统性能。

以下是NFS网络文件系统优化挂载的参数建议:
在CentOS6 x86_64服努器端和客户端环境下,可使用如下命令参数:
m

mount-t nf -o noatimc,nodiratime,nosuid,noexec,nodev,rsize=131072,wsize=131072  10.0.0.7:/data  /mnt

经过实际测试,CentOS6 x86_64默认的挂载参数性能还是不错的。

 mount -t nfs 10.0.0.7:/data  /mnt

注意:非性能的参数越多,速度可能会越慢。根据具体的业务需要以及实际测试效果选择挂载参数。

3.NFS内核优化建议


/proc/sys/net/core/rmem_default:该文件指定了接收套接宇缓冲区大小的默认值(以宇节为单位),默认设置:124928,
/proc/sys/net/core/rmem_max:该文件指定了接收套接字缓冲区大小的最大值(以宇节为单位),默认设置:124928,

/proc/sys/net/core/wmem_default:该文件指定了发送套接字绶冲区大小的默认值(以字节单位),默认设置:124928
/proc/sys/net/core/wmem_max:该文件指定了发送套接字簧沖区大小的最大值(以字节单位),默认设置:124928

4.企业生产场景NFS共享存储优化小结


硬件:sas/ssd磁盘,买多块, raid0/raid10。网卡吞吐量要大,至少干兆(多块bond)。

NFS服务端配置:/data 10.0.0.7(rw,sync,all_squash,anonuid=65534,anongid=65534)

NFS客户端挂载优化配置命令:

mount -t nfs -o nosuid,noexec,nodev,noatmme,nodiratime,rsize=131072,wsize=131072 10.0.0.7:/data /mnt   #兼顾安全性能



大型网站NFS网络文件系统的替代软件为 分布式文件系统Moosefs(mfs)、GlusterFS、FastDFS。


NFS优缺点

NFS优点:


1、简单容易掌握
2、方便快速部署简单维护容易
3、从软件层面上看,数据可靠性高,稳定性强。

NFS局限:


1、局限性是存在单点故障,如果NFSserver宕机了所有客户端都不能访问共享目录,#####我们可以通过rsync来进行数据的同步。或者是通过负载均衡的高可用方案。######
2、在高并发的场合,NFS效率性能有限(一般几千万以下pv的网站不是瓶颈,除非网站架构太差。)
3、服务器共享文件的客户端认证是基于IP和主机名的安全性一般(但用于内网则问题不大)
4、NFS数据是明文的,对数据完整性不做验证(一般是存放于内网,提供内网的服务器使用。所以安全性相对不是一个问题)
5、多机器挂载服务器时,连接管理维护麻烦。尤其NFS服务端出问题后,所有客户端都挂掉状态(可使用autofs自动挂载解决。)

生产应用场景


    中小型网站(2000万pv以下)线上应用,都有用武之地。门户网站也会有其他方面的应用,
    因为门户网站的并发量是超级的大。所以有更加会用专业的存储来做这件事情。


-------------------------------完结-----------------------------------

参考书籍:《跟老男孩学linux运维 Web集群实战》

参考博文:https://blog.51cto.com/atong/1343950