nfs服务检测与自动恢复
2015-12-09 22:10
267 查看
场景分析
检测思路
测试用例验证
实现代码
使用系统定时任务实现,流程:尝试挂载》异常卸载目录并报错》下次检测继续挂载,超时放弃。
nfs存储目录里都会有.nfs标识文件,判断.nfs是否存在即可,当服务异常时则先卸载目录(针对服务无响应目录无法显示情形),下一次则尝试挂载恢复,超时则放弃。
尝试挂载部分,针对目录集合遍历循环开启多线程,每个线程检测.nfs文件是否存在。python不支持kill线程,但是有个setDaemon方法,其作用是只要主线程完成了,不管子线程是否完成,都要和主线程一起退出。在超时时间内,能挂载好的就都挂上了,挂不上的话只要主线程结束就停止挂载了。
本机对外提供存储,存储目录是否被挂载,存储自身重启
挂载好的目录掉线是否能够自动恢复挂载
服务端异常是否能够自动卸载并不影响ls目录
新增挂载目录是否会自动挂载(权限755并写入.nfs检测文件)
检测思路
测试用例验证
实现代码
场景分析
平台目前使用的存储为nfs和gluster网络文件系统,出现的问题一般是C/S端服务异常。nfs服务异常时会导致目录列表(df -h 或者cd)无法输出,主要是因为系统后台一直在尝试挂载,虽然nfs有retry尝试次数选项,但是服务端恢复就没法及时挂载上(目录依旧无法显示)。看来只能自己动手,丰衣足食了。检测思路
脚本主要包含两个方面,分别对应开机挂载和异常处理两种情形。思路如下:使用系统定时任务实现,流程:尝试挂载》异常卸载目录并报错》下次检测继续挂载,超时放弃。
nfs存储目录里都会有.nfs标识文件,判断.nfs是否存在即可,当服务异常时则先卸载目录(针对服务无响应目录无法显示情形),下一次则尝试挂载恢复,超时则放弃。
尝试挂载部分,针对目录集合遍历循环开启多线程,每个线程检测.nfs文件是否存在。python不支持kill线程,但是有个setDaemon方法,其作用是只要主线程完成了,不管子线程是否完成,都要和主线程一起退出。在超时时间内,能挂载好的就都挂上了,挂不上的话只要主线程结束就停止挂载了。
测试用例验证
开机启动是否能够自动挂载本机对外提供存储,存储目录是否被挂载,存储自身重启
挂载好的目录掉线是否能够自动恢复挂载
服务端异常是否能够自动卸载并不影响ls目录
新增挂载目录是否会自动挂载(权限755并写入.nfs检测文件)
实现代码
#!/usr/bin/env python # -*-coding:utf-8-*- #Tue Sep 17 15:50:00 CST 2015 import sys,os,time,threading,subprocess class Nfs(): def __init__(self): self.dirSet = ('11.11.11.200:/data/test') global dstList,allDst,errDst dstList = [] allDst = [] #生成正常目录list def excute(slef,mnt): dst = mnt.split(' ')[-1] '''创建挂载点''' if not os.path.exists(dst) : cmd = 'mkdir -p '+dst os.popen(cmd) '''检测是否挂载''' file = dst + '/.nfs' if os.path.exists(file): dstList.append(dst) else: print mnt os.popen(mnt) if os.path.exists(file): dstList.append(dst) #获取挂载执行命令list def mountCmd(self): tcpIp = os.popen("ifconfig |grep 'addr:192'|awk -F'[ :]+' 'NR==1{print $4}'").read().strip() cmdList = [] for dir in self.dirSet: #dir = self.dirIpReplace(dir) '''跳过本机是服务目录''' if tcpIp == dir.split(':')[0]: continue dst = dir.split(':')[-1] cmd = 'mount -t nfs -o vers=3 -o nolock '+dir+' '+dst cmdList.append(cmd) allDst.append(dst) return cmdList #检测入口 def check(self): '''尝试重新挂载''' for mnt in self.mountCmd(): t = threading.Thread(target=self.excute,args=(mnt,)) t.setDaemon(True) t.start() time.sleep(20) errDst = list(set(allDst)-set(dstList)) '''卸载有问题目录''' print errDst if len(errDst): for dir in errDst: cmd = 'umount -l ' + dir print cmd os.popen(cmd) Nfs().check()
相关文章推荐
- 拿到OK2440开发板之后——连接nfs服务器
- [游戏资讯]《极品飞车16:亡命狂飙》配置需求公布
- linux NFS 学习笔记
- linux系统之间通过nfs网络文件系统挂载设置方法
- Linux NFS服务器的安装与配置方法(图文详解)
- RHEL5下NFS服务器配置与应用
- starting NFS daemon failed
- drbd安装搭建可以解决双机NFS
- Linux NFS服务器的安装与配置
- 实现Kickstart + NFS + DHCP + PXE的全自动远程无人职守安装
- centos6下配置nfs
- 什么是NFS
- NFS在Centos 6.3下的安装
- NFS
- NFS安装
- NFS文件系统详解以及安全设置
- NFS服务器的安装和配置
- Xenserver 5.0双机共享NFS存储实践-----转自网络
- Linux NFS服务器的安装与配置
- NFS配置步骤和优化(转载)