本文書では、IPMI/BMC をシミュレートする fakebmc をデーモン化/rpmパッケージ化したものを頒布する。BMC/IPMIがない貧弱なPC環境でのテスト用途を想定している。
fakebmcd は、簡単に言えば、「BMCっぽい動作をするデーモン」。OS が正常動作していることという 前提条件はあるものの、OS にログインすることなく、リモートから強制電源Off とか再起動とかができる。ある意味危険。 pyghmiが提供しているfakebmcを少し拡張して作成した。
実は最初はipmisimをなんとかしようとしてたんだけど、結構作りが荒くてうまくいかず困ってた。その最中にpyghmiを追いかけてたら、fakebmcを見つけて、コレちょっとつつけば希望のものができるやんけ、ということで作ったものがコレ。
CentOS7/8 で動作確認した。
ディストリビューション | RPMパッケージ | 備考 |
---|---|---|
CentOS7 | fakebmcd-0.1-3.el7.noarch.rpm | 前提パッケージとして、python2-pyghmi が必要。EPEL にある。 |
CentOS8 | fakebmcd-0.1-3.el8.noarch.rpm | 前提パッケージとして、python3-pyghmi が必要。EPEL にある。 |
共通 | fakebmcd-0.1-3.el7.src.rpm | ソースコード。実は CentOS7/CentOS8共通。 |
CentOS の場合 epel が必要なので、以下を実行しておく。
# yum install epel-release |
その後、以下のようにインストール(CentOS7の場合)。firewalld に穴をあけたりデーモン起動するように設定したりは、rpmインストール時に自動実行される。
# yum install fakebmcd-0.1-3.el7.noarch.rpm |
これで、その CentOS 上に、PORT=623 で待ち受けする fakebmcd デーモンが起動される。firewalldが動作してると、PORT=623を勝手に開けるので注意。 動作状況は "systemctl status fakebmcd" で確認可。
# systemctl status fakebmcd * fakebmcd.service - IPMI FakeBMC daemon Loaded: loaded (/usr/lib/systemd/system/fakebmcd.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2023-03-04 19:42:57 JST; 8s ago Process: 3680 ExecStart=/usr/bin/fakebmcctl.sh start (code=exited, status=0/SUCCESS) Main PID: 3682 (fakebmc.py) Tasks: 2 CGroup: /system.slice/fakebmcd.service `-3682 /usr/libexec/platform-python /usr/bin/fakebmc.py --port 623... Mar 04 19:42:57 centos7 systemd[1]: Starting IPMI FakeBMC daemon... Mar 04 19:42:57 centos7 systemd[1]: Started IPMI FakeBMC daemon. # |
簡単。アンインストールしてもfirewalldのPORT=623は塞がないので、必要なら手作業で塞ぐこと。
# yum remove fakebmcd |
単体ではあまり意味がない。他のマシンから ipmitool コマンドで叩くと色々できる。今実装済みなのは以下四種類のみ。その他のコマンドを受け取ると、ログに記録するだけ記録して他にはなにもしない。あと、仕組み上 Power on は絶対できないので注意。
コマンド例 | fakebmcdの動作 | fakebmcd内部の実行コマンド |
---|---|---|
ipmitool -I lanplus -H IPアドレス -U admin -P password chassis power off | 強制電源断する | /sbin/halt --force --poweroff |
ipmitool -I lanplus -H IPアドレス -U admin -P password chassis power cycle | 強制再起動する | /bin/echo b > /proc/sysrq-trigger |
ipmitool -I lanplus -H IPアドレス -U admin -P password chassis power reset | ||
ipmitool -I lanplus -H IPアドレス -U admin -P password chassis power soft | shutdownする | /sbin/shutdown -h now |
/etc/sysconfig/fakebmcdで設定する。デフォルトの設定ファイルは以下の通り。
# location of PID and LOG file # # PIDFILE="/var/run/ipmisim.pid" # LOGFILE="/var/log/ipmisim.log" # port is 623 by default # # PORT=623 # "run os cmd"(actual reboot/reset/halt) is enabled by default # change "False" if you would NOT like to reboot/reset/halt the server actually # RUN_OSCMD=True # FakeBMC remote access user. "admin" by default # # USER=admin # password of the user, "password" by default # # PASSWORD=password |
RUN_OSCMD=False とすると、ipmitool で power off などを実行しても、 OS コマンドである shutdown やら reboot やらをせず、ログに残すのみになる。 設定変更後は以下のようにfakebmcdサービスの再起動が必要。
# systemctl restart fakebmcd.service |
以下のコマンドでログファイルを確認すると、ipmitool から指令が届く度に同ファイルが更新されていることがわかる。
# tail -f /var/log/fakebmcd.log |
ログファイルはサービス起動毎に刷新され、以前の記録は残さない。ローテートもしない。
fakebmcdをデーモンとして起動するのではなく、コマンドとして起動することも可能。その場合はログは標準出力にしか吐かないし、/etc/sysconfig/fakebmcd も参照されない。止める時はCtrl-CやCtrl-Zで。エラー出るけど気にしない。オプションなどは-hで表示してくだされ。
# systemctl stop fakebmcd.service # # /usr/bin/fakebmc.py 2023-03-04 00:39:48,603 - fakebmc - INFO - IPMI FakeBMC initialized. 2023-03-04 00:39:48,603 - fakebmc - INFO - IPMI FakeBMC run_os_command is False |
現在は -I lanplus のみ対応してて、-I lan は使用できない。色々追いかけてみたけど、元から実装されてないようなので諦めた。 対応するにはpyghmiの改定が必要。 ipmitool コマンドはオプションに -vvvvv とか付加すると、送信してるパケットの内容詳細を表示してくれるので、-I lan に対応させたい人は是非お願いします。対応できたらパッチください。
困るのはovirtのKVM hostにインストールして使う時。ovirtは/usr/sbin/fence_ipmilan でIPMIでのfenceを実現しているが、-I lan がデフォルトで、変更方法が用意されていない。ので、必要なら直接 /usr/sbin/fence_ipmilan を手作業編集して -I lanplus を使うよう変更する必要がある。
テストであれば十分使えると思う。クラスタシステムを作ってフェンシングのテストしたいけど、IPMI/BMC/ILOMなどが乗ったお高いサーバは使えないよぅ、という時には便利。