1、NFS介绍

       NFS是Network File System的缩写,主要功能是通过网络让不同的机器系统之间可以彼此共享文件或目录。NFS服务器可以允许NFS客户端将远端NFS服务端的共享目录挂载到本地的NFS客户端中,在本地NFS客户端的机器看来,NFS服务器端共享的目录就好像是自己的磁盘分区或者目录一样。

NFS一般是用来存储共享视频,图片等静态数据,是当前互联网系统架构中最常用的服务之一;

NFS挂载原理:

       当我们在NFS服务器端设置好一个共享存储目录/video后,其它的有权限访问NFS服务器端的NFS客户端可以将这个/video共享目录,挂载到NFS客户端本地系统上的某个挂载点(其实就是一个目录,这个目录可以自己随意指定)

       当正确挂载完后,进入到nfs客户端挂载后的目录,就可以看到NFS服务器端/video目录下的所有数据,看起来NFS服务端的/video目录就相当于nfs客户端本地的磁盘分区或目录一样,根据NFS服务端授予的NFS共享权限,在NFS客户端操作所挂载的目录,就可以将数据轻松存取到NFS SERVER上的/veideo目录中

 

提示:NFS是通过网络来进行数据的传输的,所以会提供一些端口,但端口是随机小于1024产生的,不固定这是NFS的特殊之处。那既然如此,客户端又是怎么知道服务端使用哪些端口?

答案就是通过远程过程调用(Remote Procedure Call简称RPC)协议/服务来实现的。

 

RPC:NFS功能非常多,每个功能都会启用某个程序,所以端口不固定;

RPC最主要的功能就是记录每个NFS功能所对应的端口号,并且将该信息传递给NFS客户端,让客户端可以连接到正确的端口上去;

那RPC又是如何知道每个NFS功能的端口号呢?这是因为当NFS服务启动时会随机取用数个端口,并主动向RPC服务注册取用的相关端口信息,这样,RPC服务就可以知道每个端口对应的NFS功能了,然后RPC服务使用固定的port 111来监听NFS客户端的请求,并将正确的NFS端口应答给NFS客户端,这样一来,就可以让NFS服务端和客户端进行数据传输了。

提示:在启动NFS SERVER之前 ,首先要启动RPC服务(即portmap服务),否则NFS SERVER就无法向RPC服务注册。另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会丢失,因此,此时RPC服务管理 的NFS程序也需要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文件后,是不需要重启NFS的,直接在命令行执行/etc/init.d/nfs reloadexportfs -rv即可使修改的/etc/exports生效

2 、当客户端有NFS文件要存取请求时,它如何向服务器端要求数据?

  (1)客户端会向服务器端的RPC(port 111)发出NFS文件存取功能的询问请求。

  (2)服务器端找到对应的已注册的NFS daemon端口后会回报给客户端。

  (3)客户端了解正确的端口后,就可以直接与NFS守护进程来联机。

  由于NFS的各项功能都必须要向RPC注册,因此RPC才能了解NFS服务的各项功能的port number、PID和NFS在主机所监听的IP等,而客户端才能够通过RPC的询问找到正确对应的端口。即NFS必须要有RPC存在时才能成功地提供服务,因此我们称NFS为RPC Server的一种。事实上,有很多这样的服务器都向RPC注册。例如,NIS(Network Information Service)也是RPC Server的一种。所以如图1-3所示,不论是客户端还是服务器端,要使用NFS都需要启动RPC。

 

图1-3 NFS与RPC服务及操作系统的相关性

3、服务端的安装

1)RPC,NFS都要安装

# yum -y install  portmaprpcbind nfs-utils

# /etc/init/rpcbind start

# /etc/init/nfs start

# netstat -lnt |grep rpcbind                   ;查看111端口是否在监听

提示:如果portmap服务未启动,执行命令rpcinfo -p localhost 检查时,会报如下错误。

rpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused

解释为rpcinfo: 无法访问 ; 可通过/etc/init.d/rpcbind start启动再查看 。

#rpcinfo -p localhost              ;查看被注册的端口

2)配置开机自启动

              #chkconfig nfs on

              #chkconfig rpcbind on

              #chkconfig --list |grep nfs rpcbind

3)配置nfs服务

配置文件为/etc/exports默认是空的;exports文件配置格式如下:

NFS共享目录   客户端地址1(参1,参2...) 客户端地址(参1,参2...)

指定客户端地址配置详细说明如下表:

              客户端地址                         具体地址例子                     说明

授权单一客户端访问NFS                   10.0.0.30                       一般情况,生产环境中很少用

授权整个网段可访问NFS                   10.0.0.0/24                          生产环境最常用,配置简单,维护方便

授权整个网段可访问NFS                   10.0.0.*                          指定网段的另外写法(需要验证)

授权某个域名客户端访问NFS         nfs.wang.cc                           此方法很少用,不稳定,不安全

注意:要先启动rpcbind服务,再启动nfs服务,再通过rpcinfo –p localhost 查看nfs服务是否注册端口。

4、常见配置实例

1.常用格式说明                ; 要共享的目录  客户端IP地址或IP段(参1,参2....)

配置例一                /root/wang    10.0.0.0/24(rw.sync)    

配置例二                /root/wang1     10.0.0.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000)

                                   产生环境常用的一种配置,适合多客户端共享一个NFS目录

配置例三                /root/wang3   10.0.0.15(ro)  ;只读共享

2.各参数含义:

sync   -->表示数据同步写入到内存和硬盘中,数据不丢失,但会影响一部分性能。

all_squash,anonuid=2000,anongid=2000   -->表示客户端不管用什么身份连入服务端,都以uid/gid设定好的用户登陆

3.实例配置:

eg:

       服务端配置

       #mkdir -p /root/wang

       #echo "/root/wang 192.168.26.0/24(rw,sync)"

       #/etc/init.d/nfs reload

       客户端配置

       #showmount -e 192.168.26.128               ;查看

       #mount -t nfs 192.168.26.128:/root/wang /mnt    ;-t指挂载nfs类型的系统文件

       #df -h

提示:umount命令卸载时,可能会遇到不多种原因不能卸掉,这时可通过umount -lf /mnt进行强卸载。

注意:挂载后可在客户端看到mnt目录下是服务端/root/wang目录下的内容,既然刚才给的权限是可读写,那么在客户端里创建和删除,发现不能删除,创建,这是为何?原因了虽然网络配置给了可读写,但本地的共享目录没有给其他用户读写权限,所以导致客户端这边不能写,因此只需在服务端里给共享的目录加入可写权限即可。

提示:客户端创建的文件目录,其所有者为nfsnobody              uid=65534      

5、NFS配置权限设置

           参数名称                                           参数用途

              rw                                            Read-write,表示可读写权限

              ro                                             Read-only,表示只读权限

              sync                                        请求或写入数据时,数据同步写入到NFS Server的硬盘后才会返回

              async                                      请求或写入数据时,先返回请求,再将数据写入到内存缓存和硬盘中,此参数可以提升NFS性能,但是会降低数据的安全,因此,一般情况下不用。

              no_root_squash                  访问NFS Server共享目录的用户如果是root的话,它对该共享目录具有root权限。这个配置原本为无盘客户端准备的,用户应避免使用!

              root_squash                         对于访问NFS Server共享目录的用户如果是root的话,则它的权限将被 压缩成匿名用户,同时它的UID和GID通常会变成nobody或nfsnobody账号身份

              all_squash                                   不管NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nobody或nfsnobody账号身份。在多个NFS客户端同时读写NFS Server数据时,这个参数很有用。

              anonuid                                参数以anon*开头即指anonymous匿名用户,这个用户的UID设置值通常为nobody或nfsnobody的UID值,当然我们也可以自行设置这个UID值,但是,UID必须存在于/etc/passwd中。在多NFS Client中,如多台web server共享一个NFS目录时,通过这个参数可以使得不同的NFS Client写入的数据对所有NFS Clinet保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用

              anongid                                  同anonuid,区别就是把UID(用户ID)换成GID(组ID)                                              

提示:1nfs默认参数的配置文件/var/lib/nfs/etab

         2)可查看哪些客户端挂载过服务端/var/lib/nfs/rmtab

6、自动挂载:/etc/fstab

eg:

#vim /etc/fstab

192.168.26.128:/root/wang    /mnt         nfs      defaults   1   1       

提示:在生产环境中,对于共享的NFS目录,一般不会配置到/etc/fstab里,因为,在客户端主机重起时如果网络等原因连接不上nfs server时就会导致客户端主机无法启动的情况,一般会通过把mount -t nfs 192.168.26.128:/root/wang /mnt 命令放在rc.local中来实现开机自动挂载NFS.不过这也会引起另外的问题,就是重起NFS客户端后,可能挂载NFS不成功,这种情况也要注意。

NFS客户端mount挂载参数:

#mount -t nfs -o nosuid,noexec,nodev,rw,hard,intr,rsize=32768,wsize=32768 192.168.10.26:/root/wang

7、NFS优缺点

1.优点

              1)简单-->容易上手掌握

              2)方便-->部署快捷,维护简单

              3)可靠-->从软件层面上看,数据可靠性高,经久耐用。

2.缺点

              1)局限性是存在单点故障,如果nfs server宕机了,所有客户端都不能访问共享目录。不过可通过负载均衡及高可用方案解决。

              2)在高并发的场合,NFS效率性能有限(一般几千万以下PV的网站不是瓶颈,除非网站架构太差)

              3)客户端认证时基于IP和主机名,安全性一般(用于内网安全不大)

              4)NFS数据明文,对数据完整性不做验证。

              5)多机器挂载服务器时,连接管理维护麻烦,尤其NFS服务端出问题后有客户端都挂掉状态(可使用autofs自动挂载解决)

生产应用场景:

中小型网站(2000万PV以下)线上应用,都有用武之地。

 

============#####################========================                  

8、exportfs命令的应用

可不通过配置文件来对客户端进行配置

注:只是临时生效

#exportfs -o rw,sync,all_squash 192.168.26.0/24:/root/wang

#exportfs -rv     ;此命令相当于/etc/init.d/nfs reload;通过这个命令后临时生效的将不起作用。

提示:当将服务器的共享目录取消后,已经连接的客户端将不能再访问共享目录,当服务器共享目录恢复正常时,客户端将也将自动恢复正常。           

9、通过进程查看服务          

[root@baigui ~]# ps -ef |grep -E "rpc|nfs"

rpcuser   1088     1  0 10:59 ?        00:00:00 rpc.statd              à检查文件一致性

root      5089     2  0 13:27 ?        00:00:00 [rpciod/0]

rpc      13486     1  0 13:59 ?        00:00:00 rpcbind               àRPC服务

root     13579     1  0 13:59 ?        00:00:00 rpc.rquotad         à磁盘配额进程

root     13583     1  0 13:59 ?        00:00:00 rpc.mountd         à权限验证等

root     13589     2  0 13:59 ?        00:00:00 [nfsd4]

root     13590     2  0 13:59 ?        00:00:00 [nfsd4_callbacks]

root     13591     2  0 13:59 ?        00:00:00 [nfsd]                àNFS主进程

root     13592     2  0 13:59 ?        00:00:00 [nfsd]

root     13593     2  0 13:59 ?        00:00:00 [nfsd]

root     13594     2  0 13:59 ?        00:00:00 [nfsd]             àNFS主进程

root     13595     2  0 13:59 ?        00:00:00 [nfsd]

root     13596     2  0 13:59 ?        00:00:00 [nfsd]

root     13597     2  0 13:59 ?        00:00:00 [nfsd]

root     13598     2  0 13:59 ?        00:00:00 [nfsd]             àNFS主进程

root     13621     1  0 13:59 ?        00:00:00 rpc.idmapd

root     27681  1473  0 17:11 pts/0    00:00:00 grep --color=auto -E rpc|nfs

提示,如果这些进程不知道,可通过man rpc.statd查询

 

 

10、客户端解决重启后自动挂载NFS服务器

1)在rc.local文件中添加(偶尔挂载不上,所以要对挂载点进行监控。)

2)在/etc/fstab文件中添加(不能挂载)             

注:放在fstab文件中,系统启动后会不能加载,因为NFS是通过网络挂载的,而fstab是磁盘优先加载,所以不能连入网络,自然不能挂载NFS,所以不能挂载。

查看mount挂载默认参数

[root@localhost ~]# 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=507044k,nr_inodes=126761,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/vg_wang-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

nfsd /proc/fs/nfsd nfsd rw,relatime 0 0

192.168.26.132:/date/ /mnt 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.26.132,minorversion=0,local_lock=none,addr=192.168.26.132 0 0

11、客户端NFS挂载参数详解

1)NFS客户端mount挂载-o参数的应用注意区别服务端配置的参数;有些参数对本地挂载也有效

注意:有些选项只有出现在/etc/fstab里才有效

async      ; 所以涉及到文件系统I/O的操作都是异步处理,即不会同步写到磁盘,此参数会提高性能,但会降低数据安全,一般情况生产一半,老男孩不推荐使用。除非对性能要求很高,对数据可靠性不要求的场合。

atime     ; 在每一次数据访问时,同步更新每次访问的inode时间,是默认选项,在高并发的情况下,老男孩建议你通过明确加上noatime,来取消这个默认项,以达到提升IO性能,优化IO的目的。

auto      ; 能够被自动挂载通过-a选项

defaults   ; 这是个缺省值包括rw, suid, dev, exec, auto, nouser, and async   ; cat  /etc/fstab的结果默认情况大部分都是缺省值。

exec       ; 允许执行二进制文件,取消这个参数,可以提升系统安全。

noatime    ; 不更新文件系统上的inode访问时间,高并发环境,老男孩推荐使用该选项,可以提高系统IO性能。

nodiratime   ;不更新文件系统上的directory inode访问时间,高并发环境,同样推荐该选项。

noauto          ; 不会自动挂载文件系统

noexec      ; 即使设置了 noexec,shell,php等程序还是可以执行的

nosuid            ; 禁止一个普通用户挂载该文件系统,这是默认挂载时的默认选项。

remount           ; 尝试从新挂载一个已经挂载了的文件系统,这通常被用来改变一个文件系统的挂载标志,从而使得一个只读文件系统变的可写,这个动作不会改变设备或者挂载点。

提示:当系统故障时进入single或rescue模式修复系统时,会发现根文件系统经常会变成只读文件系统,不允许修改,此时该命令就派上用场了,具体命令为:mount –o remount,rw / 将根文件系统重新挂载使得可写,single或rescue模式修复系统时这个命令十分重要。可参考实战案例linux rescue模式修复/etc/fstab文档。

Ro      ; 挂载一个只读文件系统

Rw     ;挂载一个可写的文件系统

Sync    ; 该参数和async相反,即有I/O操作时,都会同步处理IO,即把数据同步 写入硬盘,此参数会牺牲一点I0性能,但是,换来的是掉电后数据的安全性。

Dirsync      ; 目录更新时同步写入磁盘

 

2)另外还有一些NFS挂载的额外参数可用。如果NFS是用在高速运行的环境中话,那么建议加上这些参数,

直到NFS服务器再度上线为止,这对于系统的持续操作还是很有帮助的

 

 

 

12、NFS客户端mount挂载优化测试

1. 安全优化参数应用(noexec,nosuid)

1)noexec参数优化应用(二进制文件不能执行)

root@wang:~# mount -t nfs -o soft,noexec 192.168.26.132:/date  /mnt

root@wang:~# echo "echo “hello world”" >/mnt/a.sh

root@wang:~# ll -ld /mnt/a.sh

-rwxr-xr-x 1 nobody nogroup 12 Aug 13 12:02 /mnt/a.sh*                                                       

root@wang:~# /mnt/a.sh

-su: /mnt/a.sh: Permission denied                      ; 不能执行相对文件本身

root@wang:~# sh /mnt/a.sh 

hello world                                                                                             ; 但调用解释器可以执行

二进制文件

root@wang:~# cp /bin/cat  /mnt/

root@wang:~# ls -ld /mnt/cat

-rwx------ 1 nobody nogroup 50820 Aug 13 12:08 /mnt/cat

root@wang:~# /mnt/cat /proc/mounts

-su: /mnt/cat: Permission denied                                                       ; 二进制不能执行

2)suid参数应用

root@wang:~# mount -t nfs -o nosuid 192.168.26.132:/date /mnt

root@wang:~# which chmod

/bin/chmod

root@wang:~# cp /bin/chmod /mnt/

root@wang:~# ls -ld /mnt/chmod

-rwxr-xr-x 1 nobody nogroup 50836 2014-08-13 12:27 /mnt/chmod

root@wang:~# /mnt/chmod 777 /mnt/a.sh                ; root用户还是可以使用

root@wang:~# su - wang

wang@wang:~$ /mnt/chmod 744 /mnt/a.sh              ; 普通用户不可使用,这就是nosuid的作用。

/mnt/chmod: changing permissions of `/mnt/a.sh': Operation not permitted  

 

2. 性能优化参数(rsize,wsize,notime)

1)查看mounts的默认参数

root@wang:~# grep /mnt /proc/mounts              ; 关键是这两个参数

192.168.26.132:/date/ mnt nfs rw,nosuid,relatime,vers=3,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,

retrans=2,sec=sys,mountaddr=192.168.26.132,mountvers=3,mountproto=tcp,addr=192.168.26.132 0 0

2)测试开始,对rsize和wsize两参数分别进行设定值。

root@wang:~# mount -t nfs -o nosuid,noexec,rsize=1024,wsize=1024 192.168.26.132:/date /mnt

3)通过time命令查看将文件写入到mnt,并查看所使用的时间。

root@wang:~# time dd if=/dev/zero of=/mnt/testfile bs=9k count=2000

2000+0 records in

2000+0 records out

18432000 bytes (18 MB) copied, 1.47891 s, 12.5 MB/s

real    0m1.482s

user    0m0.000s

sys     0m0.164s

4)卸载挂载点,并挂载默认参数。

root@wang:~# umount /mnt

root@wang:~# mount -t nfs -o nosuid,noexec 192.168.26.132:/date /mnt

5)删除原来的文件,并同样通过time命令查看写入文件所花销时间。

root@wang:~# rm -f /mnt/testfile

root@wang:~# time dd if=/dev/zero of=/mnt/testfile bs=9k count=2000

2000+0 records in

2000+0 records out

18432000 bytes (18 MB) copied, 0.649831 s, 28.4 MB/s

real    0m0.656s

user    0m0.000s

sys     0m0.048s

结论:可对比两次的结果,所用时间明显不同,所以rsizewsize两参数对于性能的优越性,并注意time命令的用法。

====================================

1)默认不加noatime参数

root@wang:~# mount -t nfs -o nosuid,noexec 192.168.26.132:/date /mnt           

root@wang:~# time for ((i=1;i<50000;i++));do cat /mnt/testfile &>/dev/null ;done

real    2m53.506s

user    1m6.324s

sys     2m24.861s

2)卸载并添加noatime参数

root@wang:~# umount /mnt

root@wang:~# mount -t nfs -o nosuid,noexec,notime 192.168.26.132:/date /mnt

root@wang:~# cp /mnt/testfile /mnt/testfile1  

root@wang:~# time for ((i=1;i<50000;i++));do cat /mnt/testfile1 &>/dev/null ;done

real    2m20.894s

user    1m35.538s

sys     1m54.359s

 

3. NFS网络文件系统优化挂载的参数建议:

Centos5.8 x86_64 服务器端和客户端环境

命令:

Mount –t nfs –o noatime,nodiratime,nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 192.168.26.132:/date /mnt

Centos6.5 x86_64 服务器端和客户端环境

命名:

Mount –t nfs –o noatime,nodiratime, rsize=131072,wsize=131072 192.168.26.132:/date /mnt

注意:非性能的参数越多,速度会越慢。

4. NFS官方内核优化,官方的建议。

root@wang:~# cat /proc/sys/net/core/rmem_default   ; 该文件指定了接收套接字缓冲区大小的缺省值(以字节为单位)

112640

root@wang:~# cat /proc/sys/net/core/rmem_max   ; 该文件指定了接收套接字缓冲区大小的最大值(。。。)

112640

root@wang:~# cat /proc/sys/net/core/wmem_default  ;该文件指定了发送套接字缓冲区大小的缺省值(。。)

112640

root@wang:~# cat /proc/sys/net/core/wmem_max  ;该文件指定了发送套接字缓冲区大小的缺省值(。。。)

112640

操作命令:

root@wang:~# cat >>/etc/sysctl.conf <<EOF

> net.core.wmem_default = 8388608

> net.core.rmem_default = 8388608

> net.core.rmem_max = 16777216

> net.core.wmem_default = 16777216

> EOF

root@wang:~# sysctl -p

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_default = 16777216

13、生产NFS共享存储优化小结

1.硬件:sas/ssd磁盘,买多块,raid0/raid10,网卡好。

2.服务器参数:all_squash, async,

3.客户端挂载参数:rsize, wsize, noatime, nodirtime, nosuid, noexec, soft(hard,intr)

4.内核的优化

 posted on 2014-04-07 11:34  阿~贵  阅读(496)  评论(0编辑  收藏  举报