ipmi_watchdogのipmitoolによる操作方法 こんにちは 増田博行と申します。どうぞよろしく。 IPMI BMCに実装されているIPMI WatchdogTimerはウオッチドッグ機能を停止 させない運用状態で、そのヘルスチェックのインターバル(タイムアウト時間)や 振る舞いを変更できるという優れもののハードウェアWatchdogです。 しかしながらインストールされたまんまの標準のLinuxの状態では ipmi_watchdog.koモジュールをinsmodする時にオプションで振る舞いやタイム アウト時間を設定するIFしか提供されていないのでもったいない限りです。 変更するためにはrmmodしなければならないのですが、カーネル構築する時に CONFIG_WATCHDOG_NOWAYOUT=y としているとrmmod出来ないので こういうとき、ipmi_watchdogの本来の使い方が出来ると嬉しいです。 OpenIPMIが提供しているAPI(C言語で書かれている)を使って実装することが 出来ますが、ちょっと使いたくても正直面倒くさいです。 そこで、OpenIPMIの実装を利用したSunマイクロシステムズが中心になって作成 したOSSのipmitoolを使って操作してみようと思いました。 ipmitoolはコマンドラインからIPMI IFのAPIを送受信してハードウェアを操作する ツールです。 これを用いてipmi_watchdogを操作する方法について実験した結果 を御報告いたします。 ipmitoolの本家サイトは http://ipmitool.sourceforge.net/ sourceforge.netからダウンロード出来ます。 http://sourceforge.net/projects/ipmitool 以前OSDLが発表しているCGL(Carrier Grade Linux)を見てみたら「IPMI Support」 がうたわれていて「OSDL CGLはIPMIのハードウェア制御/モニタリング仕様で指定 された低レベルのハードウェア制御を提供するべきである。」と書いてありました。 現在のLinuxカーネルにも標準でIPMIのドライバ等が提供されています。 IPMIは高価なサーバに実装されているという感がありますが、最近ではIPMIを実装 した自作用のマザーボードも販売されだしたようですし、 OpenSUSEで自宅や何かのコミュニティのサーバーを構築する人もいらっしゃると思 います。 そんなときOSが固まった時にもサービスを停止させない最後の砦となるのが WatchdogTimerなんだと思います。特にハードウェアWatchdogには信頼感が持てま す。 OpenSUSEはGUIが素晴らしく素敵でDeskTopLinuxとして親しみやすいのですが 本家のSUSE Linuxからサーバーとして使える性能はデフォルトで引き継いで 居ると思うので、そんなわけでOpenSUSEを高可用性的に使いたいときに IPMI WatchdogTimerを動かす動作検証 なんかをやってみて御報告してみようと思った次第です。 (実は自宅ではIPMI実装のマシンが無いため、後日機会を見てOpenSUSEをIPMI 付きマシンインストールしてその実験結果を御報告致します。 今回は使い方のみで。。。m(_ _)m) 長い前置きですみません。以下意味のある情報です。 ###################### "Set Watchdog Timer Command" を送信してipmi_watchdogの タイムアウトカウンタインターバルを変更する方法。. 以下のコマンドを送信するとWatchdogTimerの活動を止めないで タイムアウトカウンタインターバルを20秒に設定するには以下の コマンドを実行します。 # ipmitool -I open raw 0x06 0x24 0x44 0x01 0x00 0x10 0xc8 0x00 |-------| この値が 20000msec=20secを示します。 以下、"Set Watchdog Timer Command" 送信方法の詳細です。 # ipmitool -I open raw <netfn> <cmd> [data] netfn = 0x06 = "App Application Requests" (更に詳しくは IPMIv1_5rev1_1.pdfの "Page.33 Table 5-1, Network Function Codes"を参照してください。) 以下のURLにあります。 http://www.intel.com/design/servers/ipmi/IPMIv1_5rev1_1.pdf cmd = 0x24 = "Set Watchdog Timer" (詳しくはIPMIv1_5rev1_1.pdf Page.420 "Table G-1, Command Number Assignments and Privilege Levels" を参照してください。) data = [0x44 0x01 0x00 0x10 0xc8 0x00] (詳しくは IPMIv1_5rev1_1.pdf Page.268 "Table 21-3, Set Watchdog Timer Command" を参照してください。) 今回指定したデータ部の内容をBIT展開して以下にその意味(IPMI IFのAPI説明)を記述しました。 PByte 0x44 = 01000100 [7] 0 = log ( 1 = don't log ) このフラグが立っていたらBMCにWDTのログを残さない。 [6] 1 = don't stop timer on Set Watchdog Timer command (このフラグが立っているとWDTを止めない) [5] 0 = reserved [4] 0 = reserved [3] 0 = reserved [2:0] 100 = SMS/OS Example: timer use (logged on expiration when "don't log" bit = 0b) 000b = reserved 001b = BIOS FRB2 010b = BIOS/POST 011b = OS Load 100b = SMS/OS 101b = OEM 110b -111b = reserved 2Byte 0x01 = 00000001 [7] 0 = reserved [6:4] 000 = none (pre-timeout interrupt (logged on expiration when "don't log" bit = 0b)) Example: 000b = none 001b = SMI 010b = NMI / Diagnostic Interrupt 011b = Messaging Interrupt (this is the same interrupt as allocated to the messaging interface) 100b,111b = reserved [3] 0 = reserved [2:0] 001 = Hard Reset (timeout action) Example: タイムアウト時のアクションは以下の4つを選べます。 000b = no action 無しもしない 001b = Hard Reset ハードウェアリセット 010b = Power Down 電源OFF 011b = Power Cycle 電源OFFのあと電源ON(ハードウェアリセットより丁寧。ここがIPMIのいいとこ) 100b,111b = reserved 3Byte 0x00 = 00000000 = Pre-timeout interval in seconds. '1' based. (IPMI WDTにはプレタイムアウトといってタイムアウト直前にハンドラに 登録したアクションを実施するという機能があります。使ったこと無い ですが。。。使いたい場合は、そこでそのアクションを起したいタイム アウト前の秒数を設定します。 このPre-timeoutに関しては使ったこと無いので御質問頂いてもお答え が。。。。。) 4Byte 0x10 = 00010000 = SMS/OS Timer Use Expiration flags clear (0b = leave alone, 1b = clear timer use expiration bit) このタイマを仕掛けたユーザー を記録するところです。ユーザーとはBIOSとかブートマネージャーとかOSとかです。 BIOS起動で固まった時の保証のために大抵のIPMI付きサーバーで使われています。 今回はOSから操作しているのでOSとしています。 [7] 0 = reserved [6] 0 = reserved [5] 0 = OEM [4] 1 = SMS/OS [3] 0 = OS LOad [2] BIOS/POST [1] BIOS/FRB2 [0] 0 = reserved ここはインターバル時間を設定するところです。 5Byte 0xc8 = 11001000 = 128 + 64 + 8 = 200 (Initial countdown value, lsbyte (100 ms/count)) 6Byte 0x00 = 00000000 = (Initial countdown value, msbyte (100 ms/count)) 200*100ms = 20000ms = 20sec (これらのデータは IPMIv2_0rev1_0.pdf の仕様と同じでした。) このコマンド投入した結果ipmitoolがBMCの返事を出力したのは 以下。 " 44 01 00 10 c8 00 RAW REQ (netfn=0x6 cmd=0x24 data_len=6) RAW RSP (0 bytes) " ########## 以下は上記コマンドを実際に実験した結果です。(1ぐらい年前) 対象マシン:Intel TSRLT2 Server" (IPMIv1.5BIOS) OS:某Linux (その上でカーネルKernek-2.6.9を無理やり再構築したもの ) (またSUSEで実験しますね。) 1) # insmod ipmi_watchdog.ko timeout=360 action=reset カウントダウン値を6分に設定。 アクションはリセット。 2) # echo "" >/dev/watchdog この動作から初めてWDTが起動しだす。 . このまま再び/dev/watchdogに書き込みしなければ6分後にサーバーは リセット動作を行うはず。。。 3) # ipmitool -I open raw 0x06 0x24 0x44 0x01 0x00 0x10 0xc8 0x00 これでIPMI BMCに ・私はOSです。 ・タイムアウト値を6分から20秒にかえて下さい。 ・タイムアウト時の動作はハードリセット ・WDTの機能は止めずに変更してください。 というIFを投げます。 4) 6分後ではなく、20秒後にマシンがリセットして再起動してきました。 このBMCに書き込まれたデータはBIOSが書き換えてくれるため、心配ありません。 今度はBIT作成しやすいように、ShellコマンドのWrapper を書いて SUSEで実験して御報告致します。 Software WatchdogTimeに関してはWDTデバイスを2つに増やす改造を softdog.cに施して実施した結果等がありますので後日まとめて、また御報告致します。 ではでは。