- 论坛徽章:
- 0
|
这篇文章是作者在实际工作中的总结,他利用了DS 4000 磁盘支持CLI功能的特点(也就是支持命令行接口,批量的命令可以使用脚本来完成),使用UNIX 系统来生成可以运行在DS 4000上的脚本。比较有实用价值,类似的问题也可以使用相同的方法解决。还有就是作者使用SED来完成这个任务的,也是学习SED的一个好例子。
原文:http://www.ibm.com/developerwork ... a=dgr-cn-cu&amp
本文向您介绍了如何利用 UNIX 的脚本功能生成能够在 DS4000上使用的控制脚本。它是文章作者在实际工作中的总结,具有比较高的实用性,同时对于类似的问题的解决也是一个很有启发的例子。文中使用了著名的编辑器SED,对于这方面感兴趣的读者也是很有帮助的。 为什么使用 UNIX 脚本来管理 DS4000
作为一个测试工程师,在我的日常工作中我经常要花费大量的时间去完成一些很简单但是很耗时的工作。例如,一次我想在 DS4000 上创建 200个磁盘。但是由于 DS4000 没有能够批量创建磁盘的功能,我花费了 4个小时一个一个地去创建。这次的经历使我有一种想法去创建一个能够可以批量地创建磁盘的工具。经过我一段时间的研究,我发现 IBM StorageManager 支持 CLI(Command Line Interface)功能,这就意味着我可以利用 UNIX系统的脚本功能来创建一个可以被 IBM Storage Manager 使用的脚本。通过在 IBM Storage Manager运行这个被创建的脚本,可以在无需人机交互的情况下批量的创建磁盘。但是作者并不保证本方法在任何情况下总是可以成功,请读者在验证本文的例子时注意做好相应的备份,最好在实验环境上进行操作。
例子脚本介绍
那么如何创建 IBM Storage Manager 可使用的脚本呢?IBM Storage Manager有它自己的脚本格式。只有脚本的变量值改变而格式并不改变。所以,UNIX脚本需要能够让用户能够定制的输入自己的所对应的值,如需要创建磁盘的数量,HBA 卡的 WWPNs 值,来生成 IBM StorageManager 能够使用的脚本文件。可以设计一个配置文件来让用户输入自己对应的变量值。下面就是个配置文件的例子:
LunNumber:30 #30 个 LUNs
ArrayNumber:1 # 这些 LUNs 创建在 array 1 上
LunName:sunx325b # 这些 LUNs 的名字将为 sunx325b_0, sunx325b_1 ...
Capacity:0.5GB # 每个 LUNs 的容量是 0.5GB
HostGroupName:sunx325b_group # 这个主机组的名字为 sunx325b_group
HostName:sunx325b # 这个主机名为 sunx325b
Port0:210000e08b0e934d # 第一个 HBA 卡的 wwpn 值
Port1:210000e08b0e6e50 # 第二个 HBA 卡的 wwpn 值
HostType:8 # 主机类型
|
完成了对配置文件的定义以后,UNIX 脚本可以把配置文件中用户定义的值解析出来,并且组织成为 IBM Storage Manager可以使用的脚本。一个比较好的解析配置文件的工具是 SED 编辑器,这是一个流式的编辑器。SED编辑器将需要处理的文本作为输入,经过一系列操作以后,输出经过修改的文本。SED编辑器的典型应用就是通过模式的匹配来提取文件中的一部分内容或者是把文件中的多个相同的字符串进行替换。UNIX 脚本可以通过使用 SED编辑器从配置文件中得到需要的数值,并把这些值添加到能够被 IBM Storage Manager 使用的脚本中去。
例如,下面展示了如何使用 UNIX 脚本从配置文件中获取磁盘数量这个值。这个脚本从配置文件获取 LunNumber 这个值,然后把这个值赋给脚本中的对应变量 LunNumber。
sed -n '/LunNumber:/'p $ConfigFile >tmp
lunNumber=`sed 's/LunNumber://' tmp`
|
例子脚本的详细说明
下面的例子是展示如何使用 SED 编辑器生成一个 IBM Storage Manager 可以使用的脚本。这个例子中,脚本从配置文件中获得了ArrayNumber,LunName 和 Capacity 的值,用于生成 IBM Storage Manager使用的生成磁盘的命令,然后把这个命令添加到 IBM Storage Manager 的脚本(crtlun.cmd)文件。
x=0
while [ $x -lt $lunNumber ]
do
y=`expr $x % 2`
if [ $y -eq 0 ]
then
echo "create logicalDrive array=$arrayNumber userLabel=\"${lunName}_${x}\"
capacity=$capacity owner=a;" >> crtlun.cmd
else
echo "create logicalDrive array=$arrayNumber userLabel=\"${lunName}_${x}\"
capacity=$capacity owner=b;" >> crtlun.cmd
fi
x=`expr $x + 1`
done
|
这个UNIX 工具的内容是不是很简单?但是它却帮助了我把原来需要几个小时的工作减少为只需要几分钟就可以完成。下面让我对我的 UNIX脚本文件的内容做个比较详细的介绍。这个名字为 ds4kscript.sh 的脚本文件可以运行在 UNIX(AIX,Solaris,Linux 等)上,用于产生一个可以在 IBMStorage Manager 上运行的脚本。它可以用于在 DS4000 系列上创建和删除 Lun、host group、host、hostport,映射 Lun 等功能。
这个脚本的输入是配置文件:config。它保存这用户自定义的配置信息。这个脚本的输出是一系列的脚本(这个功能在后面会加以介绍):crtlun.cmd, crthost.cmd, maplun.cmd, delmap.cmd, delhost.cmd, dellun.cmd, setup.cmd, destroy.cmd支持的操作系统:AIX,Solaris 和 Linux
脚本使用说明
编辑 config 文件,设置参数为用户所需要的值。下面是一个例子,显示了 config 文件需要包含那些项以及一些说明:
LunNumber:30 #30 个 LUNs
ArrayNumber:1 # 这些 LUNs 创建在 array 1 上
LunName:sunx325b # 这些 LUNs 的名字将为 sunx325b_0, sunx325b_1 ...
Capacity:0.5GB # 每个 LUNs 的容量是 0.5GB
HostGroupName:sunx325b_group # 这个主机组的名字为 sunx325b_group
HostName:sunx325b # 这个主机名为 sunx325b
Port0:210000e08b0e934d # 第一个 HBA 卡的 wwpn 值
Port1:210000e08b0e6e50 # 第二个 HBA 卡的 wwpn 值
HostType:8 # 主机类型
|
复制 ds4kscript.sh 到和 config 相同的目录下,执行:
chmod +x ds4kscript.sh (使用户对 ds4kscript.sh 具有执行权限)
./ds4kscript.sh ( 执行 ds4kscript.sh)
|
在ds4kscript.sh 运行的目录下,一系列文件将会被创建出来:crtlun.cmd, crthost.cmd, maplun.cmd,delmap.cmd, delhost.cmd, dellun.cmd, setup.cmd,destroy.cmd。下面逐一对这些文件的功能进行描述:
- 创建 Lun、host group、host、host port,映射 Lun。它包括了 crtlun.cmd, crthost.cmd, maplun.cmd 的所有功能,算是一个功能集合的脚本。
- 创建 Luns;
- 创建 host group、host、host port;
- 映射端口到 host 上;
- 删除 Lun、host group、host、host port,映射 Lun。它包括了 delmap.cmd, delhost.cmd, dellun.cmd 的所有功能,算是一个功能集合的脚本;
- 删除 Lun 映射
- 删除 host group、host、host port
- 删除 Lun
复制 setup.cmd 的内容到 IBM Storage Manager 脚本编辑器中,然后运行它。或者用户也可以单独的复制crtlun.cmd, crthost.cmd, maplun.cmd 中的内容,来实现单独的一些功能。这时 Lun 已经在 DS4000上建立好了,同时也映射到了主机上。
当然,同时可以执行 destroy.cmd 内的内容来进行删除操作,或者单独地执行 delmap.cmd, delhost.cmd, dellun.cmd 内的内容来清除刚才执行的创建操作。
下面是 ds4kscript.sh 的详细内容,请注意其中的注解内容,会帮助您的理解:
下面是 ds4kscript.sh 的详细内容,请注意其中的注解内容,会帮助您的理解:
#
ConfigFile=./config
ProgramName=./ds4kscript.sh
if [ -f $ConfigFile ]
then
echo "OK" >> /dev/null
else
echo "$ConfigFile not exist!"
exit -1
fi
# 从配置文件中依次获取参数值
sed -n '/LunNumber:/'p $ConfigFile >tmp
lunNumber=`sed 's/LunNumber://' tmp`
echo lunNumber=$lunNumber
sed -n '/ArrayNumber:/'p $ConfigFile >tmp
arrayNumber=`sed 's/ArrayNumber://' tmp`
echo arrayNumber=$arrayNumber
sed -n '/LunName:/'p $ConfigFile >tmp
lunName=`sed 's/LunName://' tmp`
echo lunName=$lunName
sed -n '/Capacity:/'p $ConfigFile >tmp
capacity=`sed 's/Capacity://' tmp`
echo capacity=$capacity
sed -n '/HostGroupName:/'p $ConfigFile >tmp
hostGroupName=`sed 's/HostGroupName://' tmp`
echo hostGroupName=$hostGroupName
sed -n '/HostName:/'p $ConfigFile >tmp
hostName=`sed 's/HostName://' tmp`
echo hostName=$hostName
sed -n '/Port0:/'p $ConfigFile >tmp
port0=`sed 's/Port0://' tmp`
echo port0=$port0
sed -n '/Port1:/'p $ConfigFile >tmp
port1=`sed 's/Port1://' tmp`
echo port1=$port1
sed -n '/HostType:/'p $ConfigFile >tmp
hostType=`sed 's/HostType://' tmp`
echo hostType=$hostType
# 创建 IBM storage manager 使用的脚本中创建 Lun 的部分,并保存为 crtlun.cmd。
if [ -f crtlun.cmd ]
then
rm crtlun.cmd
else
echo "OK" >> /dev/null
fi
x=0
while [ $x -lt $lunNumber ]
do
y=`expr $x % 2`
if [ $y -eq 0 ]
then
echo "create logicalDrive array=$arrayNumber userLabel=\"${lunName}_${x}\"
capacity=$capacity owner=a;" >> crtlun.cmd
else
echo "create logicalDrive array=$arrayNumber userLabel=\"${lunName}_${x}\"
capacity=$capacity owner=b;" >> crtlun.cmd
fi
x=`expr $x + 1`
done
# 创建 IBM storage manager 使用的脚本中创建 host group,host 和 host port 的部分,并保存为 crthost.cmd。
if [ -f crthost.cmd ]
then
rm crthost.cmd
else
echo "OK" >> /dev/null
fi
echo "create hostGroup userLabel=\"$hostGroupName\";" >>crthost.cmd
echo "create host userLabel = \"$hostName\" hostGroup = \"$hostGroupName\";" >>crthost.cmd
echo "create hostPort identifier = \"$port0\" userLabel = \"${hostName}_hba0\"
host = \"$hostName\" hostType = $hostType;" >>crthost.cmd
echo "create hostPort identifier = \"$port1\" userLabel = \"${hostName}_hba1\"
host = \"$hostName\" hostType = $hostType;" >>crthost.cmd
# 创建 IBM storage manager 使用的脚本中映射 Lun 的部分,并保存为 maplun.cmd。
if [ -f maplun.cmd ]
then
rm maplun.cmd
else
echo "OK" >> /dev/null
fi
x=0
while [ $x -lt $lunNumber ]
do
echo "set logicalDrive [\"${lunName}_${x}\"] logicalUnitNumber=$x
hostGroup=\"$hostGroupName\";" >>maplun.cmd
x=`expr $x + 1`
done
# 创建 IBM storage manager 使用的脚本中删除 Lun 映射的部分,并保存为 delmap.cmd。
if [ -f delmap.cmd ]
then
rm delmap.cmd
else
echo "OK" >> /dev/null
fi
x=0
while [ $x -lt $lunNumber ]
do
echo "remove logicalDrive [\"${lunName}_${x}\"] lunMapping
hostGroup=\"$hostGroupName\";" >>delmap.cmd
x=`expr $x + 1`
done |
|