2008年7月11日金曜日

SmartArray E200 の障害検知

HP ProLiant ML110 G5 に搭載した SmartArray E200 コントローラのステータスを監視するために HP Array Configuration Utility CLI (hpacucli) を入れてみました。


本当な HP 社製サーバの場合は System Management Homepage 等をインストールし設定すれば終わりなのですが、廉価なサーバである HP ProLiant ML110 G5 では SMH が利用できません。このため、 SMH を利用せずに、 CLI ベースでアレイの状態を確認できるツールを利用して定期的にアレイのステータスを確認する方針とします。


HP ProLiant ML110 G5 + CentOS 5.1 (x86版) + SmartArray E200 の構成で作業しました。


今回ダウンロードしたのは hpacucli-8.10-2.noarch.rpm (2.96 MB)です。


# wget ftp://ftp.hp.com/pub/softlib2/software1/pubsw-linux/p414707558/v47111/
  hpacucli-8.10-2.noarch.rpm
# rpm -i hpacucli-8.10-2.noarch.rpm


使い方1: システム上のコントローラ情報を取得する


# hpacucli ctrl all show

Smart Array E200 in Slot 4    (sn: xxxxxxxxxxxxx)


使い方2: コントローラ上の論理ボリューム情報を取得する


# hpacucli ctrl slot=4 array all show

Smart Array E200 in Slot 4

   array A (SAS, Unused Space: 0 MB)


使い方3: コントローラ上の物理ドライブ情報を取得する


# hpacucli ctrl slot=4 pd all show

Smart Array E200 in Slot 4

   array A

      physicaldrive 1I:0:1 (port 1I:box 0:bay 1, SAS, 300 GB, OK)
      physicaldrive 1I:0:2 (port 1I:box 0:bay 2, SAS, 300 GB, OK)
      physicaldrive 1I:0:3 (port 1I:box 0:bay 3, SAS, 300 GB, OK)
      physicaldrive 1I:0:4 (port 1I:box 0:bay 4, SAS, 300 GB, OK)


ただ、毎日ステータスを確認するわけにもいかないので、スクリプトで自動的に障害を検出できるようにしてみます。状態の判断は以下の2ポイントで行うことにしました。


  • OK の表示が正常なドライブの数が期待値と一致すること


  • failed の表示が存在しないこと


ふたつめの条件は、ドライブに障害が発生した場合に ??? GB, failed) などと出力されるようなので(ドキュメントを参照のこと)、障害を示す failed の文字列で引っかけています。ただし今回のサーバは実際にサービスを提供するため、万が一 failed で引っかからない場合のことを考え OK の表示が 4 行あることも併せて確認する方針としました。論理式では以下のとおりです。


障害 = OKの数がドライブ数と不一致 || failedの数がゼロ以上


上記判断を行い、異常が認められた場合にメールを送信するスクリプトを以下に示します。


#!/bin/sh
SUBJECT="XXX.example.jp RAID Array Status Alert"
MAILTO=hasegaw@exmaple.jp

PATH=/sbin:/bin:/usr/sbin:/usr/bin

OK_DRIVES=`( hpacucli ctrl slot=4 pd all show 2>&1 ) \
  | grep 'OK' | wc -l`
FAILED_DRIVES=`( hpacucli ctrl slot=4 pd all show 2>&1 ) \
  | grep 'failed' | wc -l`

FAILED=0

# 正常状態の物理ドライブ数をカウントする
if [ $OK_DRIVES -ne 4 ]; then
 FAILED=1
fi

# failed と表記された物理ドライブ数をカウントする
if [ $FAILED_DRIVES -ne 0 ]; then
 FAILED=1
fi


# ドライブの異常が確認できない場合
if [ $FAILED -eq 0 ]; then
 exit
fi

# メールを生成する
ACULOG=`( hpacucli ctrl slot=4 pd all show 2>&1 ) `
cat <<EOF | mail -s "$SUBJECT" $MAILTO

OK=$OK_DRIVES, FAILED=$FAILED_DRIVES
$ACULOG

EOF

プリンタを自動設定するバッチファイル

Windows のプリンタ設定って一台二台の世界ならよいですけど、情シス部門の立場で大量に設定しないといけない場合はメンドクサイですよね。 Active Directory があればそれでもまだマシなのですが、 AD がない場合は本当に全マシンにプリンタドライバを配布してまわったりしないといけませんし。

私は仕事でクライアントPCに5~6個のプリンタを設定してまわったりすること等があるのですが、そのときには以下のようなバッチファイルを流して楽をしてます。処理の自動化によりプリンタの設定漏れを防げますし、プリンタ名なども標準化が楽でよいです。

set PRNPORT_CMD=cscript %SystemRoot%\System32\prnport.vbs

%PRNPORT_CMD% -a -o raw -n 9100 -h mpc6000.example.jp -r IP_TOKYO_mpc6000

rundll32 printui.dll,PrintUIEntry /if /m "RICOH imagio MP C6000 RPCS" \
/f "DRV_MPC6000\RC92D12K.INF" /b "mpc6000(東京)" /r "IP_TOKYO_mpc6000"

prnport.vbs の場所については適宜適切な場所を設定してください。なおこの例は Windows XP Professional を想定しています。 Windows XP Home だとこのスクリプトが存在しないかもしれませんが、その場合はどこかの Windows XP Professional マシンからコ(ピー)してこれば一応大丈夫です。

Vista の動作は未確認です。



2008年7月9日水曜日

CentOS5 + mdraid + mondorescue → 復元失敗

最近、 mondorescue でのディザスタリカバリを研究しています。

VMware や ML115 G1 の SATA インターフェイス、その他 Hewlett Packard 製の SmartArray コントローラとの組み合わせでテストを行っていますが、Linux の md raid ドライバと組み合わせても nuke だけで復旧できるか検証してみました。N700系新幹線万歳。

結果は...

080709a

orz

まぁ Linux 2.4 系なら大丈夫だとか、何か条件があるのかもしれません。


2008年7月6日日曜日

RHEL/CentOS インストール時のパーティーション作成小技(3)ネットワークを通してファイルをダウンロードする

fdisk等のコマンドラインツールでパーティーションを作成するsfdiskを使ってパーティーション構成をコピーすると小技シリーズを続けてきましたが、今回はネットワークを通してファイルをダウンロードする方法を紹介します。


PXEブートによるキックスタートを行う場合などでは、RHEL/CentOS のインストーラ実行中は NIC に IP アドレスが割り当てられた状態となっています。また、この際、実は wget などのアプリケーションを利用できます。


このため、たとえば sfdisk で使用するための part.txt を Web サーバ上に置いておけば、以下のようなアクションが可能です。


# wget http://192.168.100.1/~osinstall/part.txt | sfdisk /dev/sda


このコマンドでは、指定された URL にある part.txt の内容を使って /dev/sda の上にパーティーションを作成しています。多数のノード上に同じパーティーション構成を展開したい場合には、この方法は非常に有効です。


ネットワーク キックスタートを使わない場合は、 NIC には IP アドレスが割り当てられていません。この場合には wget などのコマンドを利用する前に NIC を立ち上げる必要があります。 Web サーバが同じセグメント上にいて、利用できる仮アドレスが明確であれば、以下の要領で立ち上げることが可能です。


# ifconfig eth0 192.168.100.3 netmask 255.255.255.0 192.168.100.254


指定しているIPアドレスは順に、(1)ノードに割り当てるIPアドレス (2)サブネットマスクの値 (3)デフォルトゲートウェイ です。その他名前解決で Web サーバを指定したい場合は /etc/resolv.conf の設定も必要となるでしょう。


RHEL/CentOS インストール時のパーティーション作成小技(2) sfdiskを使ってパーティーション構成をコピーする

fdisk等のコマンドラインツールでパーティーションを作成する では、 RHEL/CentOS のインストーラ動作中に fdisk を使ってパーティーショニングする方法について解説しました。今回は、 fdisk ではなく sfdisk を使ったパーティーショニングが可能です。


以下に sfdisk の簡単な使い方の例を示します。


# sfdisk -d /dev/sda > part.txt
    … (1)/dev/sda のパーティーション情報を part.txt に出力
# cat part.txt | sfdisk /dev/sda
    … (2)/dev/sda に part.txt のパーティーション情報を書き込み
# sfdisk -d /dev/sda | sfdisk /dev/sda
    … (3)/dev/sda のパーティーショテーブルを /dev/sdb にコピー


この方法はもちろんインストール後の OS 上でも利用できますが、 RHEL/CentOS のインストーラ上でソフトウェア RAID を構成した場合にも非常に便利です。以下に、 sfdisk と md を利用したソフトウェア RAID を使ってパーティーショニングする例を示します。


  • RHEL/CentOS のインストーラ GUI 上で Ctrl-Alt-F2 を押して仮想コンソール上のシェルに落ちる


  • 一台目のハードディスクのパーティーションテーブルを作成する
    fdisk /dev/sda


  • 二台目のハードディスクに、一台目のハードディスクのパーティーションテーブルをコピーする
    sfdisk -d /dev/sda | sfdisk /dev/sda


  • Ctrl-F6 を押して、 GUI インストーラに戻る。必要であればパーティーション構成画面にて「リセット」ボタンを押し、最新のパーティーションテーブルをリロードする


  • 一台目、二台目のハードディスクに同一サイズのパーティーションが同一構成で作成されているので、RAID 設定を行い RAID-1 で論理保護されたパーティーションを作成する


RHEL/CentOS インストール時のパーティーション作成小技(1) fdisk等のコマンドラインツールでパーティーションを作成する

RHEL/CentOSでパーティーションを作成する場合は基本的にインストーラのGUI画面でパーティーション構成を設定するかと思いますが、パラメータシートなどを基にパーティーションを構成したい場合には、このGUIが厄介なモノとなることがあります。


具体的には、GUI画面では、パーティーション番号を指定してパーティーションを作ることができません。/bootは第1パーティーション、swapは第2パーティーション、ルートは第三パーティーション、…などと決めていても、GUIツールでは「このパーティーションはプライマリパーティーションにすべきかどうか」しか指定できず、インストーラによりパーティーション番号を入れ替えられてしまったりすることがあります。


これを回避する方法として、インストーラではパーティーションを作成せずに、他のツールでパーティーションテーブルを作成しておき、インストーラからは各パーティーションの使い方(マウントポイント、ファイルシステムの種類)だけを指定する方法があります。


もちろん knoppix のような 1CD Linux を利用してもよいのですが、 CentOS/RHEL のインストーラでは Ctrl-Alt-F2 で仮想コンソールのシェルに落ちることができますので、このシェル上から fdisk コマンドを利用してパーティーションすることができます。ファイルシステムタイプ(83 = Linux, 82=Linux swap, 7e=Linux LVM, fd=Linux RAID)まではfdisk上で済ませておくと後がラクチンです。


fdisk でパーティーショニングを済ませたら Alt-F6 でインストーラの GUI 画面に戻り、作業を続行します。インストーラが fdisk 前の古いパーティーションテーブルを認識している場合は、「リセット」ボタンを押すと、その時点のパーティーション構成が GUI 上に表示されます。fdiskで作成したパーティーション構成が画面上に表示されたら、各パーティーションに対してマウントポイントやファイルシステムの種類について設定を行ってください。


2008年7月5日土曜日

ホスト間のRPMパッケージのインストール差異を知る

Linuxで2台以上のRPMパッケージの差分を調べるときは、以下のコマンドが便利です。


 rpm -qa --qf "%{NAME}\n"


このコマンドではRPMバージョンを含まない、RPMのパッケージ名のみが標準出力に出力されます。



■ rpm -qa --qf "%{NAME}\n" | sort の出力例
4Suite
Canna
Canna-libs
FreeWnn
FreeWnn-libs
GConf2
MAKEDEV
NetworkManager
ORBit2
Omni

■ rpm -qa | sort の出力例
4Suite-1.0-3
Canna-3.7p3-7.EL4
Canna-libs-3.7p3-7.EL4
FreeWnn-1.10pl020-5
FreeWnn-libs-1.10pl020-5
GConf2-2.8.1-1.el4
MAKEDEV-3.15.2-3
NetworkManager-0.3.1-4.el4
ORBit2-2.12.0-3
Omni-0.9.1-7.1

2ホスト間のパッケージ差異を、RPMバージョンを無視して比較したい場合は、例えばSSHを使って以下のように作業します。

node1$ rpm -qa --qf "%{NAME}\n" | sort > rpms.node1
node1$ ssh node2 'rpm -qa --qf "%{NAME}\n" | sort' > rpms.node2
node1$ diff -u rpms.node[12]

node2には入っているけどnode1に入っていないパッケージをyumで追加する場合は

diff -u rpms.node2 rpms.node1 | grep '+' | grep -v ' ' | echo xargs yum install

としてコマンドラインを生成し、確認後 echo を外すと yum でパッケージをまとめて install できます。