vSphere 上の仮想マシンを IPMI で操作する: VirtualBMC for vSphere (vbmc4vsphere)

ざっくり紹介

いろいろあって作りました。

これを使うと、vSphere 環境上の仮想マシンを、IPMI (ipmitool など)で制御できます。

物理サーバとまったく同じプロトコルが(もちろん全部ではないですが)仮想マシンに対して使えるようになるため、単に ipmitool による手動操作だけでなく、バックエンドで IPMI を必要とする、または IPMI があれば動かせる物理サーバ向け機能も仮想環境で動作させられる 可能性がある点が大きなメリットです。

具体的には、

  • ipmitool での手動操作(電源制御、起動デバイスの変更)
  • vCenter Server からの ESXi のパワーオン
  • vSphere DPM(Distributed Power Management)による自動電源制御
  • oVirt など他の仮想環境管理ツールの自動電源制御
  • OpenShift の Baremetal IPI など、物理サーバに対する自動プロビジョニング機構

が、vSphere の仮想環境内で実際に動作させられる可能性があります。

もちろん、物理環境を完全にエミュレートできるわけではないため、完全な代替とは言えず種々の注意は要しますが、前述のものはいずれも動作確認済みです。

本エントリでは、仕組みと簡単な使い方を紹介します。

仕組み

OpenStack 傘下のプロジェクトで、IPMI で libvirt 管理下の KVM 仮想マシンを制御できる VirtualBMC というものがあり、今回の VirtualBMC for vSphere は、それの libvirt 部分を vSphere 向けに修正したうえで機能追加したものです。

よって、仕組みは前身の VirtualBMC に準拠したものですが、とはいえごく単純(というかこれ以外にないともいう)で、IPMI コマンドを外部から受け付けるデーモンが、受け付けたコマンドと同等の処理を vCenter Server に API でリクエストしなおすだけです。

なお、IPMI の世界では、コマンドを受け付けた BMC と操作対象の物理サーバは一対一である前提なので、プロトコルレベルでは操作対象を指定する仕組みをそもそも持っていません。すなわち、操作対象の仮想マシンは、物理サーバの IPMI 操作と同様に、IPMI の投げ先の IP アドレスとポート番号で厳密に指定できる必要があります。

このため、VirtualBMC では、操作対象の仮想マシンごとに別の仮想 BMC インスタンスを同時に起動できるようになっていて、かつそのインスタンスはインスタンスごとにホストの任意の IP アドレスや任意のポートにバインドできるようになっています。

簡単な使い方

詳しくは別で書いてあるので併せてどうぞ。

セットアップ

Python 3.x と pip が動く環境で pip install vbmc4vsphere するとインストールできます。

$ python -m pip install vbmc4vsphere

インストールしたら、まずはデーモンを起動します。バックグラウンドで起動させる場合はオプション無し、フォアグラウンドで動かして出力(ログ)を見たい場合は --foreground を付けます。

$ vsbmcd --foreground

その後、vsbmc add で新しい仮想 BMC を作成します。この時に、仮想マシン名や待ち受ける IP アドレス(--address)とポート番号(--port)、vCenter Server の認証情報などを突っ込みます。

$ vsbmc add lab-vesxi01 --port 6230 --viserver 192.168.0.1 --viserver-username vsbmc@vsphere.local --viserver-password my-secure-password

制御したい仮想マシンの数だけこれを繰り返します。上記の例ではポート番号だけを指定していて、その場合はホストのすべての IP アドレス(0.0.0.0)で待ち受けるように設定されます。

なお、ポート番号として 1024 以下を指定したときは、デーモンを管理者権限(sudo するか root ユーザ)で起動していないと、この後の起動でコケるので注意です。

作成できたら、仮想 BMC を起動させます。

$ vsbmc start lab-vesxi01

登録情報や状態は、vsbmc listvsbmc show で確認できます。

$ vsbmc list
+-------------+---------+---------+------+
| VM name     | Status  | Address | Port |
+-------------+---------+---------+------+
| lab-vesxi01 | running | ::      | 6230 |
+-------------+---------+---------+------+

$ vsbmc show lab-vesxi01
+-------------------+---------------------+
| Property          | Value               |
+-------------------+---------------------+
| active            | False               |
| address           | ::                  |
| password          | ***                 |
| port              | 6230                |
| status            | running             |
| username          | admin               |
| viserver          | 192.168.0.1         |
| viserver_password | ***                 |
| viserver_username | vsbmc@vsphere.local |
| vm_name           | lab-vesxi01         |
+-------------------+---------------------+

止めるときは vsbmc stop です。

$ vsbmc stop lab-vesxi01

動作確認

vsbmc start して状態が running になったら、IPMI コマンドでの操作ができるようになるはずです。

ユーザ名とパスワードはデフォルトでは adminpassword です。変更したい場合は、先の vsbmc add するときの引数で指定できます(vsbmc add --help でヘルプ参照)。

$ ipmitool -I lanplus -H 192.168.0.100 -p 6230 -U admin -P password chassis power on
Chassis Power Control: Up/On

$ ipmitool -I lanplus -H 192.168.0.100 -p 6230 -U admin -P password chassis power status
Chassis Power is on

$ ipmitool -I lanplus -H 192.168.0.100 -p 6230 -U admin -P password chassis power soft
Chassis Power Control: Soft

$ ipmitool -I lanplus -H 192.168.0.100 -p 6231 -U admin -P password chassis power reset
Chassis Power Control: Reset

$ ipmitool -I lanplus -H 192.168.0.100 -p 6231 -U admin -P password chassis bootdev pxe
Set Boot Device to pxe

$ ipmitool -I lanplus -H 192.168.0.100 -p 6231 -U admin -P password chassis bootparam get 5
Boot parameter version: 1
Boot parameter 5 is valid/unlocked
Boot parameter data: 8004000000
 Boot Flags :
   - Boot Flag Valid
   - Options apply to only next boot
   - BIOS PC Compatible (legacy) boot
   - Boot Device Selector : Force PXE
   - Console Redirection control : System Default
   - BIOS verbosity : Console redirection occurs per BIOS configuration setting (default)
   - BIOS Mux Control Override : BIOS uses recommended setting of the mux at the end of POST

コンテナ環境で動作させる場合

コンテナでも動作することは確認できていて、使い方は Wiki に書いてあります。

コンテナイメージも Docker Compose 用のファイルも用意済みなので、慣れている方はこちらの方が環境を汚さないし良いでしょう。ポートのバインドがデーモンレベルとコンテナレベルの二か所で必要になってちょっと複雑なので、そこだけ注意です。

利用上の注意

根本的には、本番利用は当然想定していないので、テストとか遊びとか、そういう感じで使ってください。

また、vsbmc add で指定したときの情報は、~/.vsbmc/<仮想マシン名>/config平文で 保存されます。これには vCenter Server のパスワードも含む ため、運用には注意が必要です。

ユースケース

試したいくつかの使い方を紹介します。

ネステッド ESXi のパワーオン

VirtualBMC for vSphere は、vCenter Server に ESXi の BMC として登録できます

このため、ネステッド ESXi の BMC として VirtualBMC for vSphere を登録する と、物理 ESXi と同じように、ESXi のパワーオン(スタンバイからの復帰)が vSphere Client から行える ようになります。

vCenter Server へ登録する BMC は、待ち受けポートが必ず 623 番でなくてはならず、また、誤登録防止のために MAC アドレスも必要です。これらを考慮したガイドを Wiki に載せています。

ネステッド環境で vSphere DPM を有効化

前述のように、VirtualBMC for vSphere はネステッド ESXi の BMC として登録できるので、つまり、ネステッド ESXi で構成されたホストクラスタで、DPM(Distrubuted Power Management)も有効化できます。

vSphere DPM は、これまで物理サーバなしには試すのが難しかったのですが、これで比較的簡単に動かせるようになります。

上のアニメーションは、ネステッド ESXi で構成されたホストクラスタで vSphere DPM を有効化した結果、

  • ESXi のスタンバイからの自動的な復帰
  • 復帰後の自動負荷平準化(vMotion)

が動作している様子です。同様に、動作している仮想マシンを減らすと、ESXi が自動的にスタンバイモードに移行する様子も観察できます。

なお、vSphere DPM をネステッド環境で動作させる上では、vSphere DPM のコスト計算が正しくない 点に注意が必要です。

vSphere DPM は、ESXi のスタンバイ化やパワーオンの必要性を評価するためにさまざまなメトリックを利用しており、それには ESXi 自身が自分自身のハードウェアから直接取得する情報 が含まれます。

しかしながら、ネステッド ESXi が使っている 仮想ハードウェアは、それらの情報を提供しません。例えば、ネステッド ESXi の消費電力は常にゼロとして評価されます。そして、ハードウェアから直接でしか情報を取得しないので、そこに 仮想 BMC が介在する余地はありません

結果として、vSphere DPM のコストの評価結果が正しくなく、期待した推奨が提案されない 場合があります。本気の検証には向かないので、あくまで動作の雰囲気をつかめるくらいと捉えるのがよいでしょう。

構成方法は、前述のガイドに載せています。

oVirt でネステッド KVM のフェンスエージェントとして登録

oVirt では、ノードの BMC をフェンスエージェントとして登録すると、可用性の向上が実現できます。具体的には、ホストで障害が検出されると、スプリットブレインの発生有無の確認のためにホストの電源状態を確認したり、電源がオフであることが分かった場合には電源の投入などが試みられます。

VirtualBMC for vSphere は、vSphere 環境の仮想マシンとして構成した KVM ホストの BMC として oVirt に登録できます。

構成方法は、Wiki に載せています。

OpenShift の自動ベアメタルインストール(IPI)を仮想マシンで

OpenShift をまっさらな環境にほぼ全自動でインストールする方法に IPI と呼ばれる手段があり、そのうち まっさらな物理サーバに全自動でインストールする方法が、ベアメタル IPI(Baremetal IPI)です。

名前の通り、本来は物理的に BMC を積んだベアメタルサーバ(物理サーバ)に対して自動インストールを行うもので、その過程では IPMI での電源制御やブートデバイス指定(PXE、ローカルディスクなど)が駆使されます。

VirtualBMC for vSphere を使うと、これを仮想マシンに対して行えるようになります

上の画像は、実際に仮想マシンに対してベアメタル IPI の手順で構成した OpenShift 環境です。実体は仮想マシンですが、OpenShift としては Bare Metal Hosts として登録されています。Management Address に表示されている先が、VirtualBMC for vSphere です。

もちろん、OpenShift としてはそもそも vSphere 環境向けのインストール手段も用意されているので、OpenShift 環境が欲しいだけならそれでもよいわけですが、どちらかというとこのユースケースは 物理サーバのプロビジョニング手順を仮想環境で気軽に試せる ことがメリットかと思います。

サンプルの設定例などは Wiki に載せています。

余談: 開発のきっかけ

もともとは vSphere DPM がどうのこうのなどはまったく考えておらず、oVirt を動かして遊びたくなっただけでした。

その時は、ネステッド ESXi と同じく、vSphere の上にネステッド KVM として組めばいいやと考えたわけですが、ドキュメントを読んでいたところこんな記述を見つけました。

Power management must be configured for the hosts running the highly available virtual machines.

Administration Tasks | oVirt

可用性を高くしたいなら電源管理を構成にしなさいよ、とのことです。しなくても HA 自体は機能するようですが、こうなるとせっかくなので試したくなるわけです。

電源管理というのは、oVirt 的には フェンスエージェントを構成して oVirt がホストの電源状態を確認・制御できるようにすること を意味します。これにはつまり何らかの BMC が必要です。

エージェントに ipmilan が選べるので、IPMI が喋れさえすればよさそうですが、そもそもネステッドで組もうとしているので、vCenter Server にも ESXi にも仮想マシンの IPMI 操作を受け付ける機能はないし、どう考えても無理です。

とはいえ、IPMI over LAN なんてただの UDP パケットなわけだし、世の中のだれかが仮想 IPMI ゲートウェイ的なものをすでに作っていることはじゅうぶんに期待できます。が、調べると、残念ながら vSphere 向けは皆無でした。

先行事例は、以下のような具合です。

  • pyghmi
    • OpenStack 傘下の Python 製サーバ管理用モジュール
    • IPMI のサーバ側としての初期ネゴシエーション、セッション管理の仕組みや、物理サーバの BMC をエミュレートするクラスが実装済み
  • VirtualBMC
    • OpenStack 傘下の仮想 BMC
    • IPMI コマンドを受けて libvirt ドライバ経由で仮想マシンを制御できる
    • pyghmi をベースにしている
  • mushorg/conpot
    • 産業用の監視・制御・データ収集システム向けのハニーポット
    • IPMI も受け付けてフェイクの返事を返すようにできている
    • pyghmi をベースにしている
  • rhtyd/ipmisim
    • 上記 conpot から IPMI 部分だけを切り出した IPMI のシミュレータ

調べた範囲では VirtualBMC がいちばんぼくの求めるモノに近く、libvirt 向けの処理を pyvmomi で vSphere 向けに書き直せばどうにかなりそうだったので、ライセンスも APL 2.0 ですし、これを基に拡張していこうというのが今回の開発のきっかけでした。

VirtualBMC ですでに書かれていた処理を vSphere 向けに置き換えるところまではさくさくだったのですが、vSphere DPM での利用を目論んで vCenter Server に BMC として登録できるようにする部分が厄介でした。

結局、VirtualBMC(やその基の pyghmi)でも対応していないパケットのフォーマットや IPMI のコマンドがいくつも必要になってしまい、それらを処理する部分を完全に自製することになりました。

パケットをキャプチャして、IPMI と ASF の仕様書を片手に vCenter Server からの要求を読み解き、応答パケットを仕様書に従って組み立てて投げる、的な作業の繰り返しです。

すごくおもしろかったです。

本エントリ執筆時点で、累計ダウンロード数がすでに 1,300 を超えており、ニッチながらそこそこの需要はあったのかもしれない感触を得られています。ご活用ください。

追記: バージョン 0.1.0 で、コマンド名を vsbmcdvsbmc に変更しました。これまでフォーク元の本家 VirtualBMC からコマンド名を変えておらず実は競合する状態を放置したままでしたが、これを解消させる目的です。併せて、本文中のコマンドも修正しました。

@kurokobo

くろいです。ギターアンサンブルやら音響やらがフィールドの IT やさんなアルトギター弾き。たまこう 48 期ぎたさん、SFC '07 おんぞう、新日本ギターアンサンブル、Rubinetto。今は野良気味。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です