1. NFS客户端挂载命令
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挂载参数说明。
以下是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
如果是本地文件系统,使用如下命令优化挂载:
根据前面的测试我们知道,默认情况下,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里实现开机挂载。
但是,如果在开机自启动服务里设置并启动了NetFS服务(CentOS6),放入fstab里也是可以开机挂载的,如下图所示。
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