美文网首页
2020-03-05 NFS客户端挂载深入讲解

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

作者: 阿丧小威 | 来源:发表于2020-03-05 15:41 被阅读0次

    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挂载参数说明。

    NFS Client mount挂载参数1 NFS Client mount挂载参数2 NFS Client mount挂载参数3 NFS Client mount挂载参数4

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

    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
    

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

    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<<EOF
    net.core.wmem_default = 8388608
    net.core.rmem_default = 8388608
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    EOF
    sysctl -p
    

    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<<EOF
    net.core.wmem_default = 8388608
    net.core.rmem_default = 8388608
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    EOF
    

    执行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里实现开机挂载。

    开机启动时fstab优先网卡启动图

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

    开机启动网卡启动后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客户端挂载深入讲解

          本文链接:https://www.haomeiwen.com/subject/broilhtx.html