- 論壇徽章:
- 0
|
這篇文章是作者在實(shí)際工作中的總結(jié),他利用了DS 4000 磁盤支持CLI功能的特點(diǎn)(也就是支持命令行接口,批量的命令可以使用腳本來(lái)完成),使用UNIX 系統(tǒng)來(lái)生成可以運(yùn)行在DS 4000上的腳本。比較有實(shí)用價(jià)值,類似的問(wèn)題也可以使用相同的方法解決。還有就是作者使用SED來(lái)完成這個(gè)任務(wù)的,也是學(xué)習(xí)SED的一個(gè)好例子。
原文:http://www.ibm.com/developerwork ... a=dgr-cn-cu&amp
本文向您介紹了如何利用 UNIX 的腳本功能生成能夠在 DS4000上使用的控制腳本。它是文章作者在實(shí)際工作中的總結(jié),具有比較高的實(shí)用性,同時(shí)對(duì)于類似的問(wèn)題的解決也是一個(gè)很有啟發(fā)的例子。文中使用了著名的編輯器SED,對(duì)于這方面感興趣的讀者也是很有幫助的。 為什么使用 UNIX 腳本來(lái)管理 DS4000
作為一個(gè)測(cè)試工程師,在我的日常工作中我經(jīng)常要花費(fèi)大量的時(shí)間去完成一些很簡(jiǎn)單但是很耗時(shí)的工作。例如,一次我想在 DS4000 上創(chuàng)建 200個(gè)磁盤。但是由于 DS4000 沒(méi)有能夠批量創(chuàng)建磁盤的功能,我花費(fèi)了 4個(gè)小時(shí)一個(gè)一個(gè)地去創(chuàng)建。這次的經(jīng)歷使我有一種想法去創(chuàng)建一個(gè)能夠可以批量地創(chuàng)建磁盤的工具。經(jīng)過(guò)我一段時(shí)間的研究,我發(fā)現(xiàn) IBM StorageManager 支持 CLI(Command Line Interface)功能,這就意味著我可以利用 UNIX系統(tǒng)的腳本功能來(lái)創(chuàng)建一個(gè)可以被 IBM Storage Manager 使用的腳本。通過(guò)在 IBM Storage Manager運(yùn)行這個(gè)被創(chuàng)建的腳本,可以在無(wú)需人機(jī)交互的情況下批量的創(chuàng)建磁盤。但是作者并不保證本方法在任何情況下總是可以成功,請(qǐng)讀者在驗(yàn)證本文的例子時(shí)注意做好相應(yīng)的備份,最好在實(shí)驗(yàn)環(huán)境上進(jìn)行操作。
例子腳本介紹
那么如何創(chuàng)建 IBM Storage Manager 可使用的腳本呢?IBM Storage Manager有它自己的腳本格式。只有腳本的變量值改變而格式并不改變。所以,UNIX腳本需要能夠讓用戶能夠定制的輸入自己的所對(duì)應(yīng)的值,如需要?jiǎng)?chuàng)建磁盤的數(shù)量,HBA 卡的 WWPNs 值,來(lái)生成 IBM StorageManager 能夠使用的腳本文件?梢栽O(shè)計(jì)一個(gè)配置文件來(lái)讓用戶輸入自己對(duì)應(yīng)的變量值。下面就是個(gè)配置文件的例子:
LunNumber:30 #30 個(gè) LUNs
ArrayNumber:1 # 這些 LUNs 創(chuàng)建在 array 1 上
LunName:sunx325b # 這些 LUNs 的名字將為 sunx325b_0, sunx325b_1 ...
Capacity:0.5GB # 每個(gè) LUNs 的容量是 0.5GB
HostGroupName:sunx325b_group # 這個(gè)主機(jī)組的名字為 sunx325b_group
HostName:sunx325b # 這個(gè)主機(jī)名為 sunx325b
Port0:210000e08b0e934d # 第一個(gè) HBA 卡的 wwpn 值
Port1:210000e08b0e6e50 # 第二個(gè) HBA 卡的 wwpn 值
HostType:8 # 主機(jī)類型
|
完成了對(duì)配置文件的定義以后,UNIX 腳本可以把配置文件中用戶定義的值解析出來(lái),并且組織成為 IBM Storage Manager可以使用的腳本。一個(gè)比較好的解析配置文件的工具是 SED 編輯器,這是一個(gè)流式的編輯器。SED編輯器將需要處理的文本作為輸入,經(jīng)過(guò)一系列操作以后,輸出經(jīng)過(guò)修改的文本。SED編輯器的典型應(yīng)用就是通過(guò)模式的匹配來(lái)提取文件中的一部分內(nèi)容或者是把文件中的多個(gè)相同的字符串進(jìn)行替換。UNIX 腳本可以通過(guò)使用 SED編輯器從配置文件中得到需要的數(shù)值,并把這些值添加到能夠被 IBM Storage Manager 使用的腳本中去。
例如,下面展示了如何使用 UNIX 腳本從配置文件中獲取磁盤數(shù)量這個(gè)值。這個(gè)腳本從配置文件獲取 LunNumber 這個(gè)值,然后把這個(gè)值賦給腳本中的對(duì)應(yīng)變量 LunNumber。
sed -n '/LunNumber:/'p $ConfigFile >tmp
lunNumber=`sed 's/LunNumber://' tmp`
|
例子腳本的詳細(xì)說(shuō)明
下面的例子是展示如何使用 SED 編輯器生成一個(gè) IBM Storage Manager 可以使用的腳本。這個(gè)例子中,腳本從配置文件中獲得了ArrayNumber,LunName 和 Capacity 的值,用于生成 IBM Storage Manager使用的生成磁盤的命令,然后把這個(gè)命令添加到 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
|
這個(gè)UNIX 工具的內(nèi)容是不是很簡(jiǎn)單?但是它卻幫助了我把原來(lái)需要幾個(gè)小時(shí)的工作減少為只需要幾分鐘就可以完成。下面讓我對(duì)我的 UNIX腳本文件的內(nèi)容做個(gè)比較詳細(xì)的介紹。這個(gè)名字為 ds4kscript.sh 的腳本文件可以運(yùn)行在 UNIX(AIX,Solaris,Linux 等)上,用于產(chǎn)生一個(gè)可以在 IBMStorage Manager 上運(yùn)行的腳本。它可以用于在 DS4000 系列上創(chuàng)建和刪除 Lun、host group、host、hostport,映射 Lun 等功能。
這個(gè)腳本的輸入是配置文件:config。它保存這用戶自定義的配置信息。這個(gè)腳本的輸出是一系列的腳本(這個(gè)功能在后面會(huì)加以介紹):crtlun.cmd, crthost.cmd, maplun.cmd, delmap.cmd, delhost.cmd, dellun.cmd, setup.cmd, destroy.cmd支持的操作系統(tǒng):AIX,Solaris 和 Linux
腳本使用說(shuō)明
編輯 config 文件,設(shè)置參數(shù)為用戶所需要的值。下面是一個(gè)例子,顯示了 config 文件需要包含那些項(xiàng)以及一些說(shuō)明:
LunNumber:30 #30 個(gè) LUNs
ArrayNumber:1 # 這些 LUNs 創(chuàng)建在 array 1 上
LunName:sunx325b # 這些 LUNs 的名字將為 sunx325b_0, sunx325b_1 ...
Capacity:0.5GB # 每個(gè) LUNs 的容量是 0.5GB
HostGroupName:sunx325b_group # 這個(gè)主機(jī)組的名字為 sunx325b_group
HostName:sunx325b # 這個(gè)主機(jī)名為 sunx325b
Port0:210000e08b0e934d # 第一個(gè) HBA 卡的 wwpn 值
Port1:210000e08b0e6e50 # 第二個(gè) HBA 卡的 wwpn 值
HostType:8 # 主機(jī)類型
|
復(fù)制 ds4kscript.sh 到和 config 相同的目錄下,執(zhí)行:
chmod +x ds4kscript.sh (使用戶對(duì) ds4kscript.sh 具有執(zhí)行權(quán)限)
./ds4kscript.sh ( 執(zhí)行 ds4kscript.sh)
|
在ds4kscript.sh 運(yùn)行的目錄下,一系列文件將會(huì)被創(chuàng)建出來(lái):crtlun.cmd, crthost.cmd, maplun.cmd,delmap.cmd, delhost.cmd, dellun.cmd, setup.cmd,destroy.cmd。下面逐一對(duì)這些文件的功能進(jìn)行描述:
- 創(chuàng)建 Lun、host group、host、host port,映射 Lun。它包括了 crtlun.cmd, crthost.cmd, maplun.cmd 的所有功能,算是一個(gè)功能集合的腳本。
- 創(chuàng)建 Luns;
- 創(chuàng)建 host group、host、host port;
- 映射端口到 host 上;
- 刪除 Lun、host group、host、host port,映射 Lun。它包括了 delmap.cmd, delhost.cmd, dellun.cmd 的所有功能,算是一個(gè)功能集合的腳本;
- 刪除 Lun 映射
- 刪除 host group、host、host port
- 刪除 Lun
復(fù)制 setup.cmd 的內(nèi)容到 IBM Storage Manager 腳本編輯器中,然后運(yùn)行它;蛘哂脩粢部梢詥为(dú)的復(fù)制crtlun.cmd, crthost.cmd, maplun.cmd 中的內(nèi)容,來(lái)實(shí)現(xiàn)單獨(dú)的一些功能。這時(shí) Lun 已經(jīng)在 DS4000上建立好了,同時(shí)也映射到了主機(jī)上。
當(dāng)然,同時(shí)可以執(zhí)行 destroy.cmd 內(nèi)的內(nèi)容來(lái)進(jìn)行刪除操作,或者單獨(dú)地執(zhí)行 delmap.cmd, delhost.cmd, dellun.cmd 內(nèi)的內(nèi)容來(lái)清除剛才執(zhí)行的創(chuàng)建操作。
下面是 ds4kscript.sh 的詳細(xì)內(nèi)容,請(qǐng)注意其中的注解內(nèi)容,會(huì)幫助您的理解:
下面是 ds4kscript.sh 的詳細(xì)內(nèi)容,請(qǐng)注意其中的注解內(nèi)容,會(huì)幫助您的理解:
#
ConfigFile=./config
ProgramName=./ds4kscript.sh
if [ -f $ConfigFile ]
then
echo "OK" >> /dev/null
else
echo "$ConfigFile not exist!"
exit -1
fi
# 從配置文件中依次獲取參數(shù)值
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
# 創(chuàng)建 IBM storage manager 使用的腳本中創(chuàng)建 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
# 創(chuàng)建 IBM storage manager 使用的腳本中創(chuàng)建 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
# 創(chuàng)建 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
# 創(chuàng)建 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 |
|