转自:http://www.ibm.com/developerworks/cn/linux/l-cn-firmupgrade/#ibm-pcon
刀片服务器已经在各行各业得到了大量应用,如何快速维护升级刀片服务器的高级管理模块(AMM)成为一个比较棘手的问题。现场工程师在客户现场经常会遇到,面对上百个 AMM 的固件升级工作,手头上没有一个非常方便的工具或者脚本,而不得不手动完成 AMM 固件的升级,耗费大量时间和人力。本文主要介绍一种可以实现同时升级大量 AMM 固件的方法和脚本程序。
0 评论:
IBM Bladecenter 高级管理模块简介
IBM Bladecenter 是一个集刀片服务器、网络、存储、I/O、管理一体化的计算平台。作为这个计算平台的管理部件——高级管理模块(Advanced Management Module)则负责整个 Bladecenter 硬件的集中管理,包括以下主要功能:
- 为机箱内所有的刀片服务器提供本地和远程 KVM(Keyboard,Video,Mouse)支持
- 具有一个 RJ45 的 10/100M 以太网管理端口,通过它可以进行对 Bladecenter 的远程管理
- 通过高级管理模块对 Bladecenter 机箱内所有的部件进行监控,配置和维护
图 1. 高级管理模块
![图 1. 高级管理模块](https://i-blog.csdnimg.cn/blog_migrate/e86acd7ace2db33e17a06b2aa46e66f4.png)
高级管理模块中的固件则是负责实现高级管理模块功能的应用程序,它是固化在高级管理模块的芯片上,加电会自动运行。随着 Bladecenter 中的硬件,例如服务器、各种各样的扩展子卡不断的推出新品和升级换代,高级管理模块的固件也必须随着这些硬件升级,才能做到对这些新的硬件的管理。此外,更为重要的一个方面是,新的固件会修复原固件中的一些 bug,这对于 Bladecenter 系统的稳定起到很重要的作用。因此,定期更新高级管理模块的固件是一项较为常规的维护工作。
高级管理模块的固件更新方式
高级管理模块提供给用户两种固件的更新方法,Web 方式或者命令行的方式。Web 方式相对比较直观,容易操作,比较适合于升级数量较少的高级管理模块;命令行的方式,首先需要使用 telnet 登录到高级管理模块,然后执行相应的固件升级命令。对于同时升级数量众多的高级管理模块,Web 的方式不大现实,如果采用命令行的方式,结合自己编写的脚本就可以做到。
通过 Telnet 到高级管理模块上之后,可以通过命令行从 TFTP 服务器上获取固件,进行升级;同时,只要网络里面的高级管理模块有 IP 地址,可以通过命令行发现所有网络环境里同一个子网下的高级管理模块,并显示出高级管理模块的 IP 地址和固件版本。高级管理模块的 IP 地址获取方式有两种,一种为通过 DHCP 动态获取,一种为手动静态获取,对于系统上线前的升级,我们可以使用 DHCP 让高级管理模块动态获取 IP 地址,免去更改静态 IP 地址的繁琐过程和时间。如果配置的静态 IP 地址,可创建一个文件,将这些 IP 写到文件上。
大规模升级高级管理模块固件的实现方法
首先需要构建如下一个网络,所有的高级管理模块应在同一个网络中,网络中有一台服务器提供 DHCP(可选)和 TFTP 服务,这台服务器运行的是 Linux 操作系统,作者在此使用的是 Redhat 4u6 64 位操作系统。
图 2. 方案网络拓扑
![图 2. 方案网络拓扑](https://i-blog.csdnimg.cn/blog_migrate/2574aabfd538fe32abe6b620cbc9876b.png)
将 AMM 和 LAN 网络连接起来。所有 AMM 的超级用户名和密码均为默认出厂值或者均相同。
基本思想为通过 telnet 到其中一个 AMM,执行 remotechassis 脚本,让其发现该网络内所有 AMM 的 IP 地址,并将这些 IP 地址以文件的形式记录下来;通过循环,telnet 到每个 AMM 上面,执行 update firmware 的命令完成 AMM 的升级。以下为程序脚本的基本流程:
图 3. 程序流程
![图 3. 程序流程](https://i-blog.csdnimg.cn/blog_migrate/b0de9a94bcf0583abd5d40d844aa89ac.png)
编写 Shell 和 Expect 脚本
关于 Expect 脚本
现代的 Shell 对程序提供了最小限度的控制 ( 开始,停止,等等 ),而把交互的特性留给了用户。这意味着有些程序,用户不能非交互的运行,比如说 passwd。Expect 恰恰填补了这个缺陷,解决了在 Unix 环境中长期存在着的一些问题。
Expect 使用 Tcl 作为语言核心。不仅如此,不管程序是交互和还是非交互的,Expect 都能运用。一个 Expect 程序员可以写一个脚本来描述程序和用户的对话。接着 Expect 程序可以非交互的运行“交互式”的程序。写交互式程序的脚本和写非交互式程序的脚本一样简单。
这样,像 telnet, su, rlogin, ftp 等应用如果没有一个用户接口交互式的提供输入,Shell 脚本根本无法自动执行下去。Expect 脚本则可以做到。
Expect 语言是基于 Tcl 的。Tcl 实际上是一个子程序库,这些子程序库可以嵌入到程序里从而提供语言服务。最终的语言有点象一个典型的 Shell 语言,并可以被嵌套在 Shell 脚本中使用。
Expect 脚本使用 spawn 命令激活一个 Unix 程序来进行交互式运行;使用 send 命令向进程发送字符串;使用 expect 命令等待进程的某些字符串;也可以像 Shell 脚本一样使用 set 命令给变量赋值;控制程序执行的 if, for, continue 等命令,还能进行普通的数学和字符串操作。
因此,可以使用 Expect 脚本来完成对 AMM 的 telnet 中的一些交互性操作。
准备工作
首选确认是否安装了如下 rpm 包,如果没有安装,请安装
rpm -q expect expect-5.42.1-1
根据上一章节的执行流程,需编写三个脚本,分别为:
run.sh 执行整个程序流程
remotechassis.tcl 发现网络里所有的 AMM 的 IP 地址
update.tcl AMM 固件的升级
编写 run.sh 的脚本
run.sh 用来执行整个程序过程,其中涉及到要使用 telnet 连接到 AMM 中执行相应的控制命令,因此我们使用两个 Expect 脚本来分别完成发现网络里所有的 AMM 的 IP 地址和让 AMM 执行固件升级的功能。
由于需要升级固件的 AMM 有多个,可以在 run.sh 中加入循环来自动完成多个 AMM 固件的升级,并将升级进程放入后台运行,这样可以同时执行多个升级进程。
为了保证所有 AMM 固件升级完成,设定延迟 1200 秒后,将所有升级进程 kill 掉。
下面是 run.sh 脚本的具体内容
清单 1. run.sh 代码
#!/bin/sh # 指 定 登 录 到 其 中 一 个 AMM 中 ,执 行 发 现 remotechassis.tcl 脚 本 , 发 # 现 网 络 中 所 有 的 AMM IP 地 址 ,并 格 式 化 记 录 到 IP.out 文 件 中 ./remotechassis.tcl 192.168.1.125 USERID PASSW0RD |grep IP: |cut -c17- >ip.out # 读 取 ip.out 文 件 中 的 每 一 行 AMM 的 IP 地 址, 然后执行 update.tcl 进 # 行 后 台 升 级 for eachline in `cat ip.out` ;do # 执行 update 升级脚本,并放入后台执行 ./update.tcl $eachline USERID PASSW0RD & done # 延 迟 20 分 钟 , 结 束 所 有 的 update.tcl 进 程 sleep 1200 killall update.tcl
编写 remotechassis.tcl 脚本:
要发现网络里面的 AMM,可以执行 AMM 中的
remotechassis – T mm[1]
命令来完成。给 telnet 中需要的 IP 地址、用户名和密码三个变量赋值,然后开始请求 telnet 访问,成功之后,执行 remotechassis – T mm[1] 命令让其发现网络里面 AMM 的 IP 地址。run.sh 会调用此脚本执行后的输出,格式化后记录到 ip.out 文件中。
remotechassis.tcl 脚本具体内容如下:
清单 2. remotechassis.tcl 代码
#!/usr/bin/expect # 设定 timeout 指为 -1,让 expect 永远等待输入 set timeout -1 # 设定输入提示 if { $argc != 3 } { puts "Usage $argv0 hostname userid password" exit 1 } # 设定 telnet AMM 的三个变量 set host [lindex $argv 0] set user [lindex $argv 1] set pass [lindex $argv 2] # 执行 telnet 命令,并将 ip 地址传递给 telent spawn telnet $host expect *name: # 等待用户名输入 send "$user\r" # 发送用户名字符串 expect *assword: # 等待密码输入 send "$pass\r" # 发送密码字符串 expect system> # 发送 remotechassis 命令 send " remotechassis -T mm\[1\]\r" expect system> # 发送 exit 命令退出 telent send "exit\r" expect eof
编写 update.tcl 脚本:
要让 AMM 执行固件升级命令,需要执行 AMM 中的
update – r – u tftp://tftp_ip/firmware_filename – T mm[1]
这样的命令来完成。给 telnet 中需要的 IP 地址、用户名和密码三个变量赋值,然后开始请求 telnet 访问,成功之后,执行上述升级命令。run.sh 会读取 ip.out 中每个 AMM 的 IP 地址,并循环调用此脚本来实现多个 AMM 并行升级。
update.tcl 脚本具体内容如下:
清单 3. update.tcl 代码
#!/usr/bin/expect # 设定 timeout 指为 -1,让 expect 永远等待输入 set timeout -1 if { $argc != 3 } { puts "Usage $argv0 hostname userid password" exit 1 } set host [lindex $argv 0] set user [lindex $argv 1] set pass [lindex $argv 2] spawn telnet $host expect *username send "$user\r" expect *assword: send "$pass\r" expect system> # 发送 update 命令开始升级 AMM 的固件 # 需 要 指 定 tftp 服 务 器 地 址 和 AMM 固 件 的 升 级 文 件 名 send "update -r -u tftp://192.168.19.3/CNETCMUS.pkt -T mm\[1\]\r" send "exit\r" expect eof
配置 DHCP 和 TFTP 服务
首先确认服务器上是否安装了 DHCP 和 TFTP 的 rpm 包:
rpm -q dhcp dhcp-3.0.1-59.EL4 rpm -q tftp tftp-0.39-2
配置 DHCP 服务
用 vi 编辑打开 /etc/dhcpd,更改如下:
清单 4. dhcp 内容
ddns-update-style interim; subnet 192.168.19.0 netmask 255.255.255.0 { range 192.168.19.10 192.168.19.254; default-lease-time 3600; max-lease-time 4800; option subnet-mask 255.255.255.0; next-server 192.168.19.1; }
配置 TFTP 服务
用 vi 编辑打开 /etc/xinetd.d/tftp,更改如下:
清单 4. tftp 内容
service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot disable = no per_source = 11 cps = 100 2 flags = IPv4 }
启动 DHCP 和 TFTP 服务
# service dhcpd restart # service xinetd restart
开始进行升级
从 IBM Support 网站下载最新的 AMM firmware,解压后将 CNETCMUS.pkt 文件放在 /tftpboot 目录下。将刀片机箱上电,让 AMM 通过 DHCP 获取 IP 地址。
注:AMM 默认状态下加电之后会从 DHCP 获取 IP 地址,此方法对于未配置的 AMM 状态有效;如果已经手动配置了静态 AMM 的 IP 地址,可无需 DHCP 服务器
修改脚本
用 vi 打开 run.sh,找到
./remotechassis.tcl 192.168.1.125 USERID PASSW0RD
和
./update.tcl $eachline USERID PASSW0RD
将 192.168.1.125 地址更改为网络中的任何一个 AMM 的管理 IP,USERID 和 PASSW0RD 为此 AMM 的用户名和密码(确保所有 AMM 的用户名和密码均相同)。
如果使用 DHCP 为 AMM 分配管理 IP,可查询 DHCP 服务器的 /var/lib/dhcp/dhcpd.leases 文件,确定一个分配给 AMM 的 IP 地址,并用此 IP 地址代替 192.168.1.125。
用 vi 打开 update.tcl,找到
send "update -r -u tftp://192.168.19.3/CNETCMUS.pkt
将 IP 地址更改为 TFTP 服务器的 IP 地址。
执行升级脚本
在 run.sh 当前目录下执行:
./run.sh
开始执行升级,执行 20 分钟后,此脚本会自动退出。
检查 AMM firmware 升级结果
运行:
./remotechassis.tcl AMM_IP USERID PASSW0RD |grep – E “IP:|Firmware:”> ammfwversion.out
然后查看 ammfwversion.out 文件,即可得知是否所有 AMM 的 firmware 已经升级到最新版。
ammfwversion.out
输出例子如下:
IP: 192.168.1.155 Firmware: BPET48N,CNETMNUS.PKT,06-19-09,72 IP: 192.168.22.180 Firmware: BPET48N,CNETMNUS.PKT,06-19-09,72 IP: 192.168.1.125
小结
本文介绍了 IBM 刀片服务器高级管理模块固件的升级方法,并重点介绍了如何通过 Shell 和 Expect 脚本在 Linux 环境搭建一个批量升级高级管理模块固件的方案,为客户提高了维护的效率。