NFS自动挂载

承载业务的一台服务器不稳定偶尔会重启,重启后需要手动将应用服务、数据库一一启动。启动操作只需要将指令加入到开机自启中就可以应对,但是这台服务器还需要挂载一个NFS磁盘,网上开机自动挂载NFS的资料有不少,但在虚拟机验证过程中能起到作用的不多。本文就是探究自动挂载NFS那些事。

方法一、在/etc/fstab中配置

 

/etc/fstab中一般配置的是包括挂载点在内的本地磁盘或者swap文件系统信息,部分资料会把NFS配置到这个文件里。但是如此配置有一个弊端,就是如果服务端没有启动NFS服务,那么开机进程在尝试挂载NFS失败后会终止NFS挂载,即使服务端重新开启NFS服务客户端也不会再次挂载

 

 

方法二、经过上面讨论,我们会想到仅仅将NFS配置到/etc/fstab/是不会满足业务需求的,为了减少只是NFS没有挂载成功就半夜被叫到现场的情况,我们需要更加“智能”一点的方法。但是首先需要了解开机启动完成引导后执行的加载文件/etc/rc.local(这里暂时忽略rc.d和init.d等加载文件的执行顺序),先来看一下文件注释部分

 

 

 

其中明确写道,此文件以兼容性为目的,并且建议创建系统守护进程和udev设备管理等方式代替使用rc.local文件。最重要的是,文件中的配置是在启动中并行执行而不是其他服务启动后最后执行,这也就意味着可能执行挂载NFS操作时网络服务还未启动,这也就是建议以系统守护进程和udev方式配置的原因——可以处理启动优先级。不过根据boot.log启动日志来分析,即使首次挂载操作没有成功,系统也会多次尝试挂载。

 

 (注意在2145行尝试首次挂载NFS)

 

 (在2552行再次尝试挂载NFS)

甚至rc.local中启动任务没有执行成功,启动进程也不会一直阻塞下去

 

那么启动过程中挂载NFS失败, 启动完成进入系统也就不会再执行挂载操作了。这样不仅没有解决原来的问题,甚至还影响了系统启动速度。

方法三、虽然NFS挂载指令配置到/etc/rc.local问题多多,但是让我们的需求更加明确了:1.NFS客户机的启动不应该被NFS服务端影响、2.客户机什么时候挂载NFS并不重要,重要的是只要服务端提供NFS服务,客户端才应该执行挂载操作。根据此需求我写了个脚本简单实现了一下这个功能。

 1 #!/bin/bash
 2 #version:1.0
 3 #date:20220713
 4 #author:HMY
 5 
 6 addr=10.0.0.10
 7 ping -c1 -q ${addr}
 8 while (( $? != 0  ))
 9   do
10     sleep 1
11 #    echo "not connect"
12     ping -c1 -q ${addr}
13   done
14 mount -t nfs 10.0.0.10:/public_dir /mnt/10_0_0_10/

然后把脚本用后台运行的方式配置到rc.local中,注意shell脚本和rc.local要加入可执行权限

 

 这里需要说明一点,用ping的返回值来判断是否挂载nfs并不合理。因为若NFS服务器网络畅通但尚未开启NFS服务,ping的返回值也是0,进而脚本开始尝试挂载NFS,但最终会超时失败。建议的做法是用telnet、nc、ss、nmap等指令确认NFS服务端端口正常再执行挂载指令。

此外,其他具有依赖关系的用户程序也可以配置到脚本中,在此就不做赘述了。

参考:

https://blog.csdn.net/ymeng9527/article/details/102677254 

https://blog.51cto.com/u_12574283/5014843

 

posted @ 2022-07-13 16:02  拖鞋拍小强  阅读(2294)  评论(0编辑  收藏  举报