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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!