2020-03-05 NFS客户端挂载深入讲解

1. NFS客户端挂载命令

2020-03-05 NFS客户端挂载深入讲解_第1张图片
客户端挂载的命令格式

2. NFS客户端挂载命令参数说明

在NFS服务器端可以通过cat /var/lib/nfs/etab查看NFS服务器端配置参数的细节。在NFS客户端可以通过cat /proc/mounts查看mount的挂载参数细节。

2.1 mount挂载参数说明

通过如下命令在NFS客户端测试挂载获取的默认挂载参数:

[root@web01 ~]# grep mnt /proc/mounts 
192.168.9.6:/data /mnt nfs4 rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.9.7,local_lock=none,addr=192.168.9.6 0 0

以下是NFS Client mount挂载参数说明。

2020-03-05 NFS客户端挂载深入讲解_第2张图片
NFS Client mount挂载参数1
2020-03-05 NFS客户端挂载深入讲解_第3张图片
NFS Client mount挂载参数2
2020-03-05 NFS客户端挂载深入讲解_第4张图片
NFS Client mount挂载参数3
2020-03-05 NFS客户端挂载深入讲解_第5张图片
NFS Client mount挂载参数4

以下是mount -o参数对应的选项列表。

2020-03-05 NFS客户端挂载深入讲解_第6张图片
mount -o参数对应的选项

2.2 man mount后的-o参数说明

下面是mount命令的-o选项后面可以接的参数,注意有些选项只有出现在/etc/fstab里才有效,下面这些选项可以应用在绝大多数文件系统上,但是sync仅适合ext2、ext3、fat、vfat和ufs等文件系统。

  • async:涉及文件系统I/O的操作都是异步处理,即不会同步写入磁盘,此参数会提高性能,但会降低数据安全性。一般情况下,生产环境不推荐使用。除非是在对性能要求很高,对数据可靠性不要求的场合。*
  • sync:该参数和async相反。有I/O操作时都会同步处理I/O,即把数据同步写入硬盘。此参数会牺牲一点I/O性能,但是,换来的是断电后数据的安全性。
  • atime:在每一次数据访问时,会同步更新访问文件的inode时间戳,是默认选项。
  • ro:以只读的方式挂载一个文件系统。
  • rw:以可写的方式挂载一个文件系统。*
  • auto:能够被自动挂载通过-a选项。
  • noauto:不会自动挂载文件系统。
  • defaults:这是fstab第4列挂载参数的默认值,包括rw、suid、dev、exec、auto、nouser、async,默认情况下大部分参数都是默认值。
  • exec:允许文件系统执行二进制文件,取消这个参数,可以提升系统安全性。
  • noexec:在挂载的文件系统中不允许直接执行任何二进制的程序,注意,仅对二进制程序有效,即时设置了noexec、shell,php程序还是可以执行的。*
  • noatime:访问文件时不更新文件的inode时间戳,高并发环境下推荐显式应用该选项,可以提高系统I/O性能。*
  • nodiratime:不更新文件系统上的directory inode时间戳,高并发环境下推荐显式应用该选项,可以提高系统I/O性能。*
  • nosuid:不允许特殊权限suid和sgid位生效,以提升安全性。*
  • suid:允许suid和sgid位生效。
  • nouser:禁止一个普通用户挂载该文件系统,这是默认挂载时的默认选项。
  • remount:尝试重新挂载一个已经挂载了的文件系统,通常被用来改变一个文件系统的挂载标志,使得一个只读文件系统变得可写,这个动作不会改变设备或者挂载点。当系统故障进入single或rescue模式修复系统时,会发现根文件系统经常会变成只读文件系统,不允许修改,此时该命令就派上用场了。具体命令为:mount -o remount,rw /,表示将根文件系统重新挂载使其可写。single或rescue模式修复系统时这个命令十分重要。*
  • dirsync:目录更新时间同步写入磁盘。

其中,标有*的为性能优化重要选项,一般情况下,安全参数和性能参数是对立的,即越安全,性能越差。

3. NFS客户端挂载优化

在企业生产环境中,NFS客户端挂载有没有必须加的参数,比如,加noexec、nosuid、nodev、bg、soft、rsize、wsize等参数,有的书上说建议加,rsize、wsize这两个是缓存参数,是否也建议加呢?
这个问题属于mount挂载优化问题(有些参数也适合其他文件系统),一般来说要适当加挂载参数,但是,最好先做好测试,用数据来说话,才能更好地确定倒地是挂载还是不挂载。

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

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

mount -t nfs -o nosuid,noexec,nodev,rw 192.168.9.6:/data /mnt

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

3.2 挂载性能优化参数选项

下面介绍几个在企业生产环境下NFS性能优化挂载的例子。
1)禁止更新目录及文件时间戳挂载,命令如下:

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

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

mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 192.168.9.6:/data /mnt

3)默认的挂载方式如下:

mount -t nfs 192.168.9.6:/data /mnt

如果是本地文件系统,使用如下命令优化挂载:

2020-03-05 NFS客户端挂载深入讲解_第7张图片
image.png

根据前面的测试我们知道,默认情况下,NFS Server共享目录的参数默认配置为wsize和rsize,它们设定了NFS Server和NFS Client之间往来数据块的大小。
wsize和rsize的大小最好是1024的倍数,对于NFSv2来说,8192是rsize和wsize的最大倍数,如果使用的是NFSv3,则可以尝试设置32768,如果是NFSv4可以设置到65536或更大。
如果在客户端挂载时使用了这两个参数,可以让客户端在读取和写入数据时一次性读写更多的数据包,这样可以提升访问性能和效率。
除此之外,还有noatime、nodiratime性能优化选项,这两个选项是说在读写磁盘的时候,不更新文件和目录的时间戳(不更新文件系统中文件对应inode信息),这样就可以减少和磁盘系统的交互,提升读取和写入磁盘的效率,因为磁盘是机械的,每次读写都会消耗磁盘I/O,而更新文件时间戳对于工作数据必要性不大,最大的问题是增加了访问磁盘I/O的次数,以致拖慢系统性能。

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

mount -t nfs -o noatime,nodiratime,nosuid,noexec,nodev,rsize=131072,wsize=131072 192.168.9.6:/data /mnt

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

mount -t nfs 192.168.9.6:/data /mnt

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

3.3 NFS内核优化建议

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

上述文件对应的具体内核优化命令如下:

cat >>/etc/sysctl.conf<

3.4 企业生产场景下NFS共享存储优化小结

1)硬件:SAS/SSD硬盘,购买多个,硬件RAID,制作RAID5或RAID10.网卡吞吐量要大,至少千兆(多块Bond)。
2)NFS服务器端指定特定UID/GID配置:

/data 192.168.9.0/24(rw,sync,all_squash,anonuid=65534,anongid=65534)

3)NFS客户端挂载优化配置命令如下:

mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,rsize=131072,wsize=131072 192.168.9.6:/data/ /mnt

4)对NFS服务的所有服务器内核进行优化时,执行如下命令:

cat >>/etc/sysctl.conf<

执行sysctl -p生效。
5)如果卸载的时候提示“umount:/mnt:device is busy”,需要退出挂载目录再进行卸载,如果是NFS Server宕机了,则需要强制卸载,可执行umount -lf /mnt。
6)大型网站NFS网络文件系统的替代软件为分布式文件系统MooseFS、GlusterFS、FastDFS等。
7)阿里云对应的存储服务NAS服务、还有OSS对象存储。

4. NFS客户端自启动挂载

配置客户端mount挂载命令使挂载开机自动执行,这里有如下两种方法:
第一种方法,将挂载命令放在/etc/rc.local里。
把挂载的命令放入/etc/rc.local中,以实现开机自动挂载。命令如下:

[root@web01 ~]# chmod +x /etc/rc.local
[root@web01 ~]# echo "#mount by oldboy" >> /etc/rc.local
[root@web01 ~]# echo "/bin/mount -t nfs 192.168.9.6:/data /mnt" >> /etc/rc.local
[root@web01 ~]# tail -2 /etc/rc.local
#mount by oldboy
/bin/mount -t nfs 192.168.9.6:/data /mnt

缺点:可能偶尔开机挂载不上,工作中除了开机自启动配置,还要对是否挂载进行监控。
第二种方法,将挂载命令放在/etc/fstab里。
其实这个配置有一个误区,如下图所示,理论上开机启动过程中,fstab会优先于网络被Linux系统加载。网络没启动时执行fstab会导致连不上NFS服务器端,无法实现开机挂载。而且,即使是本地的文件系统,也要注意fstab中最后两列要设置00。否则有可能导致无法启动服务器的问题。
因此,NFS网络文件系统最好不要放到fstab里实现开机挂载。

2020-03-05 NFS客户端挂载深入讲解_第8张图片
开机启动时fstab优先网卡启动图

但是,如果在开机自启动服务里设置并启动了NetFS服务(CentOS6),放入fstab里也是可以开机挂载的,如下图所示。

2020-03-05 NFS客户端挂载深入讲解_第9张图片
开机启动网卡启动后NFS被挂载图

CentOS7环境下要实现NFS在fstab里实现开机自动化挂载,需要启动一个服务为remote-fs.target,前面的系统优化把该服务优化掉了,需要重新启动起来,下面是NFS在fstab里实现开机自动化挂载配置。

[root@web01 ~]# cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sun Feb 16 13:54:19 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=b96ce81a-662b-490c-a8db-f807893a32ca /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
192.168.9.6:/data   /data           nfs defaults,soft   0 0
#192.168.9.6:/data       /data                   nfs     defaults,intr   0 0
[root@web01 ~]# systemctl start remote-fs.target
[root@web01 ~]# systemctl enable remote-fs.target
Created symlink from /etc/systemd/system/multi-user.target.wants/remote-fs.target to /usr/lib/systemd/system/remote-fs.target.

经过以上操作后,开机即可实现自动挂载。

5. NFS服务端宕机后给NFS客户端带来的问题

多台客户机挂载一个NFS服务器时,连接管理维护麻烦(耦合度高)。尤其是NFS服务器端出问题后,所有NFS客户端都处于挂掉的状态(测试环境可使用autofs自动挂载解决,正式环境可修复NFS服务或强制卸载)。
NFS服务器宕机后,在客户端访问挂载点会处于挂掉状态,甚至早期系统执行Ctrl+C都无法退出,CentOS7客户端还可能无法重启,这个问题的解决方法有以下几种:
1)在cat /proc/mounts找到挂载点,然后执行umount -lf /data方式卸载即可。
2)在mount挂载时增加soft或者intr,不让客户端持续呼叫NFS服务器。
3)如果是fstab里实现的挂载即可在第4列defaults后面增加soft或者intr。

[root@web01 ~]# tail -2 /etc/fstab 
192.168.9.6:/data   /data           nfs defaults,soft   0 0
#192.168.9.6:/data       /data                   nfs     defaults,intr   0 0

你可能感兴趣的:(2020-03-05 NFS客户端挂载深入讲解)