2023/03/04
KAICHO: s_naray[at]yahoo[dot]co[dot]jp
※SPAM防止のため捻ってある

fakebmcd - Fake BMC Daemon

■はじめに

本文書では、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などが乗ったお高いサーバは使えないよぅ、という時には便利。