GPFS文件系统能够横跨在所有主机上,分布在所有磁盘上,条带化读写,高性能。信令管理机制,并发性好。可配置fail组,可用性高。下面是GPFS集群的自动安装部署Python代码......

注:该脚本只能自动识别到系统盘之外的物理磁盘,不会识别到分区。

1、gpfs文件包目录结构

脚本中都按照这个目录结构进行安装

2、脚本执行方法

输入的是拥有存储磁盘的主机名。按回车完成

[root@vuestor01 scripts]# python auto.py

Input node's info. Usage:hosta/192.168.0.101. Press Enter is complete.

Please input Node info:  stor01/192.168.2.67

check ip address success!

Input node's info. Usage:hosta/192.168.0.101. Press Enter is complete.

Please input Node info:  stor02/192.168.2.85

执行成功后,自动挂载到/vol_data目录下。

[root@vuestor01 scripts]# df -hT

Filesystem    Type  Size  Used Avail Use% Mounted on

/dev/sda2    ext4  197G  1.6G  185G  1% /

tmpfs      tmpfs    1.9G    0 1.9G  0% /dev/shm

/dev/sda1    ext4  504M  46M  433M 10% /boot

/dev/vol_data gpfs    1.2T 918M  1.2T  1% /vol_data

[root@stor02 ~]# df -hT

Filesystem    Type  Size  Used Avail Use% Mounted on

/dev/sda2    ext4  197G  1.6G  185G  1% /

tmpfs      tmpfs    1.9G    0 1.9G  0% /dev/shm

/dev/sda1    ext4  504M  46M  433M 10% /boot

/dev/vol_data gpfs    1.2T 918M  1.2T  1% /vol_data

3、gpfs自动安装python代码分析

#!/usr/bin/python

import datetime

import os,sys,time

import commands

def output_log():  #定义输出log函数

time=datetime.datetime.now()

with open('loginfo.txt','wb') as f:

f.write('%s \n'%time)

def check_ip(ipaddr):  #校验IP有效性函数

import sys

addr=ipaddr.strip().split('.')

#print addr

if len(addr) != 4:

print "check ip address failed!"

sys.exit()

for i in range(4):

try:

addr[i]=int(addr[i])

except:

sys.exit()

if addr[i]<=255 and addr[i]>=0:

pass

else:

print "check ip address failed!"

sys.exit()

i+=1

else:

print "check ip address success!"

def install_rpm():#定义安装gpfs相关软件包函数

print "Install rpm packages..."

os.system("rpm -ivh ../dependency/nss-softokn-freebl*.rpm >>/loginfo.txt;\

rpm -ivh ../dependency/rsh*.rpm >>/root/loginfo.txt;\

rpm -ivh ../dependency/glibc*.rpm >>/root/loginfo.txt;\

rpm -ivh ../dependency/libgcc*.rpm >>/root/loginfo.txt;\

rpm -ivh ../dependency/ksh*.rpm >>/root/loginfo.txt;\

rpm -ivh ../dependency/compat-libstdc++*.rpm >>/root/loginfo.txt;")

os.system("rpm -ivh ../base/gpfs.base*.rpm >>/root/loginfo.txt")

os.system("rpm -ivh ../base/*noarch.rpm >>/root/loginfo.txt")

os.system("rpm -Uvh ../update/*.rpm >>/root/loginfo.txt")

#判断内核版本,安装相应版本的源码编译包

a,b=commands.getstatusoutput("uname -r|grep 220")

c,d=commands.getstatusoutput("uname -r|grep 358")

if (a == 0):

commands.getstatusoutput("rpm -ivh ../rpm/gpfs.gplbin-2.6.32-220.el6.x86_64-3.4.0-21.x86_64.rpm")

elif (c==0):

commands.getstatusoutput("rpm -ivh ../rpm/gpfs.gplbin-2.6.32-358.el6.x86_64-3.4.0-21.x86_64.rpm")

else:

print "can't support this kernel!"

sys.exit()

#判断是否安装成功

num_status,num_result=commands.getstatusoutput("rpm -qa |grep gpfs|wc -l")

if (num_result<5):

print "RPM packages check failed!"

sys.exit()

print "Done."

#获取节点信息,该处需用户输入

node_dict={}

host_all=[]

def get_nodes():

while True:

node=raw_input("""Input node's info. Usage: hosta/192.168.0.101. Press Enter is complete.

Please input Node info:  """)

if len(node)==0:

return 2

node_result=node.strip().split('/')

#print node_result

#获得信息后判断IP,主机名合法性

if len(node_result[0])==0:

print "Hostname is failed!"

sys.exit()

check_ip(node_result[1])

#node_dict[node_result[0]]=[node_result[1]]

host_all.append(node_result[0])

#print node_dict

local_ip_status,local_ip_result=commands.getstatusoutput("""ifconfig |grep 'inet addr'|awk -F '[: ]+' '{print $4}' """)

local_ip=local_ip_result.split('\n')

#print host_all

#指定第一个输入的IP必须为本地IP

if len(host_all)==1:

if node_result[1] in local_ip:

pass

else:

print "The first IP must be native IP."

sys.exit()

#获得磁盘信息

avail_disk={}

def get_disks():

import os,commands

print "Getting  avail disks... ... list as fllow:"

#循环主机列表

for host in host_all:

#把对方的分区信息,系统盘信息输出文件并拷贝到本机

os.system("""ssh %s " cat /proc/partitions >/tmp/part_%s;scp /tmp/part_%s %s:/root/" """%(host,host,host,host_all[0]))

os.system("""ssh %s " df -h >/tmp/osdisk_%s;scp /tmp/osdisk_%s %s:/root/" """%(host,host,host,host_all[0]))

disk_status,disk_result=commands.getstatusoutput("cat /root/part_%s |awk '{print $4}'|grep -v name \

|grep -v [0-9]|grep -v ^$"%host)

disk_a=disk_result.split('\n')

#从所有磁盘列表中移除系统盘

os_status,os_result=commands.getstatusoutput("cat /root/osdisk_%s |grep '/$'|awk  '{print $1}' \

|awk -F '/' '{print $3}'|awk -F [0-9] '{print $1}'"%host)

#print '111',disk_a,'1111'

disk_a.remove(os_result)

avail_disk[host]=disk_a

#输出除系统盘外的所有空闲磁盘

print avail_disk.items()

for a,b in avail_disk.items():

print '''On the host %s's disk:'''%a

for i in b:

print '/dev/%s'%i

#配置nsd文件

def config_file():

print 'Configuring diskef....'

with open('/root/diskef','w') as f:

num=[]

#如果只有一台主机,则把这台主机的所有磁盘分成两个fail组,通过磁盘数取余来配置

if len(avail_disk.keys())==1:

for n,m in avail_disk.items():

for i in range(len(m)):

num.append(i)

if len(num)%2 ==1:

f.write("/dev/%s:%s:::01:\n"%(m[i],n))

elif len(num)%2 ==0:

f.write("/dev/%s:%s:::02:\n"%(m[i],n))

time.sleep(1)

#如果主机数大于等于2台,则按��机分组两个fail组,通过主机数取余来配置。

elif len(avail_disk.keys())>=2:

n_num=[]

for n in range(0,len(host_all)):

n_num.append(n)

for m in avail_disk[host_all[n]]:

if len(n_num)%2 ==1:

f.write("/dev/%s:%s:::01:\n"%(m,host_all[n]))

elif len(n_num)%2==0:

f.write("/dev/%s:%s:::02:\n"%(m,host_all[n]))

#for n,m in avail_disk.items():

#  n_num.append(n)

#  for i in range(len(m)):

#      #num.append(i)

#      if len(n_num)%2 ==1:

#          f.write("/dev/%s:%s:::01:\n"%(m[i],n))

#      elif len(n_num)%2==0:

#          f.write("/dev/%s:%s:::02:\n"%(m[i],n))

#      time.sleep(1)

print 'Done.'

#def sel_tiebreakerD():

#配置gpfs集群

def config_gpfs():

print 'Configuring gpfs:\n'

#avail_disk.keys():

print 'Check crcluster...'

#print host_all,'host_all'

#校验主机数,一台时无从服务器。

if len(host_all)==1:

print ''"mmcrcluster -N %s:quorum -p %s -r /usr/bin/ssh -R /usr/b\

in/scp "%(host_all[0],host_all[0])

crcluster_status,crcluster_result=commands.getstatusoutput("mmcrcluster -N %s:quorum -p %s -r /usr/bin/ssh -R /usr/bin/scp "%(host_all[0],host_all[0]))

#主机数有多台时指定一台从服务器。

elif len(host_all)>=2:

print "mmcrcluster -N %s:quorum,%s -p %s -s %s -r /usr/bin/ssh -R /usr/bin/scp "%(host_all[0],','.join(host_all[1:]),host_all[0],host_all[1])

crcluster_status,crcluster_result=commands.getstatusoutput("mmcrcluster -N %s:quorum,%s -p %s -s %s -r /usr/bin/ssh -R /usr/bin/scp "%(host_all[0],','.join(host_all[1:]),host_all[0],host_all[1]))

#如果主机名为空,则退出

else:

print "Host list is empty. exit..."

sys.exit()

#if crcluster_status!=0:

#        print 'Fail.'

#        sys.exit()

#else:

#  print 'Done.'

#校验集群配置

print 'Check cluster configuration...'

cluster_status,cluster_NAME=commands.getstatusoutput('''mmlscluster|grep 'GPFS cluster name'|awk '{print $4}' ''')

cluster_name=cluster_NAME.split('\n')

#如果集群里的主机数,和用户输入的不致,则退出

if cluster_name[len(cluster_name)-1].strip()==host_all[0]:

print 'Done.'

else:

print 'Check cluster fail...'

sys.exit()

#配置gpfs授权,配置所有输入的主机都有权进行配置与挂载。

if len(avail_disk.keys())==1:

os.system('mmchlicense server --accept -N %s'%(host_all[0]))

elif len(avail_disk.keys())>=2:

os.system('mmchlicense server --accept -N %s'%(','.join(host_all)))

print 'mmchlicense server --accept -N %s'%(','.join(host_all))

#校验nsd的配置,如果配置文件中的磁盘数,与成功添加进集群的磁盘数不致,则退出

print 'Checking NSD configuration... ...'

os.system('mmcrnsd -F /root/diskef -v no ')

nsd_status,nsd_result=commands.getstatusoutput('mmlsnsd |grep nsd|wc -l')

nsd_split=nsd_result.split('\n')

nsd_num=nsd_split[len(nsd_split)-1]

nsdfile_status,nsdfile_num=commands.getstatusoutput("cat /root/diskef |grep -v 'gpfs'|wc -l")

#print '2',nsd_num,'22',nsdfile_num

if int(nsd_num)==int(nsdfile_num):

print 'Done.'

else:

print 'Checking NSD Failed.'

sys.exit()

#启动gpfs服务

print 'Starting gpfs service, needs about 20 seconds...'

os.system('mmstartup -a')

#import time

time.sleep(20)

#如果所有的主机不是active状态,则退出。

node,node_state=commands.getstatusoutput('mmgetstate -a|grep active|wc -l')

if len(avail_disk.keys())==int(node_state):

print 'Done.'

else:

print 'fail... mmgetstate -a have down/unknown...'

sys.exit()

#创建集群文件系统,如果创建失败则退出。

crfs_status,crfs_result=commands.getstatusoutput('mmcrfs vol_data -F /root/diskef -B 256k -r 2 -m 2 -j cluster -T /vol_data -v no ')

if crfs_status==0:

print 'Done.'

else:

print 'mmcrfs is failed.'

sys.exit()

#挂载文件系统,如果挂载失败,则退出。

os.system('mmmount vol_data -a')

print 'Checking mounting state......'

mount_status,mount_result=commands.getstatusoutput('df -h |grep vol_data')

if mount_status!=0:

print 'Fail.'

sys.exit()

else:

print 'Done.'

#设置环境变量,如果存在路径不执行,不存在则添加。

def set_profile():

for host in host_all:

print 'Check mmfs profile... ...'

path_status,path_result=commands.getstatusoutput(""" scp %s "echo $PATH|grep '/usr/lpp/mmfs/bin'"  """)

if path_status==0:

print 'Done.'

else:

print "Auto set PATH profile..."

with open("/etc/profile",'ab') as f:

f.write("PATH=$PATH:/usr/lpp/mmfs/bin")

os.system("source /etc/profile")

#配置所有节点的gpfs软件包安装

def set_another_node():

uname_status,uname_result=commands.getstatusoutput('uname -r')

print 'Checking the another node state...'

if len(host_all)==1:

print "Don't have another host... Done."

return

#node_host=node_dict.keys()

#把当前服务器的gpfs的安装包拷贝到其它主机上,只要内核版本一致,就能自动安装其它节点

for i in range(0,len(host_all)):

os.system('scp -r ../* %s:/tmp'%host_all[i])

os.system('''ssh %s 'sleep 1; sh -c " rpm -ivh /tmp/dependency/nss-softokn-freebl*.rpm; \

rpm -ivh /tmp/dependency/rsh*.rpm; \

rpm -ivh /tmp/dependency/glibc*.rpm; \

rpm -ivh /tmp/dependency/libgcc*.rpm; \

rpm -ivh /tmp/dependency/ksh*.rpm; \

rpm -ivh /tmp/dependency/compat-libstdc++*.rpm;"  ' '''%host_all[i])

os.system('''ssh %s 'sh -c "sleep 1;rpm -ivh /tmp/base/gpfs.base*.rpm;rpm -ivh /tmp/base/*noarch.rpm;rpm -Uvh /tmp/update/*.rpm"  ' '''%host_all[i])

os.system('''ssh %s 'sh -c "sleep 1;rpm -ivh /tmp/rpm/gpfs.gplbin-%s-3.4.0-21.x86_64.rpm" >>/root/loginfo.txt' '''%(host_all[i],uname_result))

#                rpm_status,rpm_result=commands.getstatusoutput('ssh %s "rpm -qa|grep gpfs|wc -l"'%host_all[i])

#                if rpm_result<5:

#                        print "The %s's  rpm check failed!"%host_all[i]

#                        sys.exit()

#                else:

#                        print 'rpm check complete.'

#

#

#

#

#执行上面的函数,并捕获异常,让错误更友好。

try:

#install_rpm()

get_nodes()  #获得节点

get_disks()  #获得空闲磁盘

set_profile()  #设置环境变量

config_file()  #磁盘文件配置

#print avail_disk

set_another_node()  #安装所有节点的gpfs包

config_gpfs()    #集群配置

except:

print '\n bye bye...'  #如果中间有异常,则捕获退出

gpfs集群linux编译环境,GPFS通用并行文件系统之Python自动部署GPFS集群相关推荐

  1. linux编译环境下,华为LiteOS初体验(STM32F407)

    linux编译环境下,华为LiteOS初体验(STM32F407) 1.概述 系统:Ubuntu22.04,linux版本号如下 Linux linux 5.15.0-40-generic #43-U ...

  2. 嵌入式linux编译环境搭建,嵌入式Linux开发环境搭建

    整理下嵌入式Linux开发环境搭建过程笔记. 一.制作u-boot.bin文件: tar xjf u-boot-1.1.6.tar.bz2 cd u-boot-1.1.6 patch -p1 < ...

  3. 嵌入式linux编译环境搭建,嵌入式Linux之旅——环境搭建篇之交叉编译工具的安装...

    在正式开始学习裸机程序的编写之前,我们还需要安装一下交叉编译工具.何为交叉编译工具?其实就是在x86的ubuntu主机上编译程序,并且可以运行在arm环境的编译工具.而gcc是本地编译工具,这个在我们 ...

  4. linux 编译环境包,linux上war包编译环境搭建(示例代码)

    一.检查linux机器上是否有自带的jdk Java -version检查下就可以,如果有与编译需要的版本不同,先卸载,再安装编译需要的版本 jdk安装与配置. (1)jdk安装 解压缩包: #tar ...

  5. linux 编译环境包,linux上war包编译环境搭建

    一.检查linux机器上是否有自带的jdk Java -version检查下就可以,如果有与编译需要的版本不同,先卸载,再安装编译需要的版本 jdk安装与配置. (1)jdk安装 解压缩包: #tar ...

  6. ubuntu linux编译环境搭建,Ubuntu14.04开发环境搭建

    Ubuntu14.04开发环境搭建 嵌入式开发过程中很重要的一环节就是开发环境的搭建,开发环境搭建的好可以很好的提高开发效率.其中关键的一部就是挂载运行程序,对于程序的挂载运行需要借助NFS服务器,下 ...

  7. 高通9xxx系列4G模块modem linux编译环境安装及配置详细说明

    1.安装包: Perl, DS500-PA-00003-r5p0-05rel0(RVDS),Hexagon,Python,Llvm, Zlib 2,1:以上安装包除Zlib需默认安装外,其余可以指定安 ...

  8. 瑞萨linux编译环境,瑞萨RZ/A2M Linux4.19系统构建与驱动移植纪实之一:BSP环境搭建...

    瑞萨RZ/A2M Linux4.19系统构建与驱动移植纪实之一:BSP环境搭建 我的系统信息 下载RZ/A Linux-4.19 BSP 编译安装带有SSL模块的Python 2.7 我的系统信息 下 ...

  9. 跟着老陈学嵌入式-C语言入门之类Linux编译环境搭建

    1.安装notepad(敲代码的地方) 2.安装gcc工具包mwind(代码编辑工具) 安装后解压,但是用命令提示符不能使用 解决办法:此电脑-属性-高级系统设置-环境变量-双击path-新建-注册( ...

最新文章

  1. Python 之 matplotlib (九)contours等高线
  2. Python时间戳转时间
  3. java irowset行数,Java CloneableRecord.put方法代码示例
  4. IOS-组件化架构漫谈
  5. java中有哪几种注释方式_在 Java 中, 有多种注释方法,其中 __________ 适用于单行注释。...
  6. 计算机主机磁盘怎么开,电脑bios怎么设置硬盘启动
  7. etl数据抽取工具_数据同步工具ETL、ELT傻傻分不清楚?3分钟看懂两者区别
  8. 在ASP.NET 3.5中使用新的ListView控件(2)
  9. matlab程序里nbus=x的意思,MATLAB潮流程序(IEEE14 直角坐标 牛拉法)
  10. json_encode
  11. LINUX C# 加载本地库的范例代码
  12. 家里还装摄像头?看完B站直播毛骨悚然!
  13. 麦克斯韦电磁场理论基础
  14. Android平台快速集成当下流行平台分享
  15. 【csdn学习-Python】CSDN技能树-Python语言学习笔记
  16. day03 数据预处理
  17. 论如何写好一篇需求报告(或者说产品报告)
  18. 论文会议推荐到计算机研究与发展,计算机研究与发展类论文参考文献 计算机研究与发展核心期刊参考文献有哪些...
  19. java spu sku_SPU与SKU区别小结
  20. RHEL6 或CentOS 6配置共享存储--使用iSCSI

热门文章

  1. 基于 Kubernetes 的 Jenkins 主从通信异常解决
  2. “绿色低碳+数字孪生“双轮驱动,解码油气管道站升级难点 | 图扑软件
  3. linux运维 职友集,为你介绍一下Linux运维到底是干啥的?
  4. 信息系统监理与审计 我国实践与美国的经验
  5. 何为高度塌陷,如何解决?
  6. C语言编写学生籍贯信息记录簿
  7. 海联金汇巨亏24亿,30亿收购的联动优势商誉减值20亿、背后现大量现金贷口子
  8. $(@:_config=)什么意思?
  9. 闭环频率特性与时域性能指标之间的关系
  10. 三星笔记本如何重装win10系统?分享重装win10系统操作方法