OpenBSDを使っていると、以下のようなケースでシリアルコンソールを使用する場合がある。
OpenBSDをシリアルコンソールで運用するには以下の操作を行う。
tty00 "/usr/libexec/getty std.9600" vt220 on secure
↑ ↑
実際のラインスピードに合わせる gettyを有効にするboot> set tty com0 ←VGAなどに表示される boot> [Enter] ←シリアルデバイスに切り替わって出力される
通常のOpenBSDをHDD等へインストールする場合であれば、インストール時に
Change the default console to com0? [no]
と訊かれるため、これにyesと答えれば上記の設定が行われる。
一方、河豚板ではデフォルトでは毎回fresh bootとなるため、このような設定をあらかじめ作り込んでおくことができない。 そのため、別のアプローチを取る必要がある。
さらに、bootプロンプト(又はboot.conf)で設定したボーレートと/etc/ttysに記述されているエントリが合っていない場合、途中で通信速度が変わってしますため、端末側の通信速度をそれに合わせてやらなければならない。
河豚板では、OpenBSD本来の初期化スクリプト/etc/rcに先立ち、/boottmp/rcという独自の初期化スクリプトが実行される。
シリアルコンソール対応として、/boottmp/rc内で以下の処理を行うこととした。
実際に/boottmp/rc内に追加したコードは以下のようになる。
- echo "Keyboard type;"
- while :; do
- kbd -l | sed -e '1,3d; /^$/d' | sort | paste - - - -
- echo -n '-> '; read kbtype
- if kbd $kbtype; then
- echo $kbtype > /etc/kbdtype
- break
- fi
- done
+ if dmesg | grep -q '^.* at .*: console keyboard'; then ←コンソールがwsconsデバイスの場合のみ
+ echo "Keyboard type;" キーボードレイアウトを設定するように変更
+ while :; do
+ kbd -l | sed -e '1,3d; /^$/d' | sort | paste - - - -
+ echo -n '-> '; read kbtype
+ if kbd $kbtype; then
+ echo $kbtype > /etc/kbdtype
+ break
+ fi
+ done
+ fi
- echo "Please wait ... "
+ #------------------------------
+ # serial console (for vmm/vmd)
+ # ブートメッセージに「com0: console」が
+ if dmesg | grep -q '^com0: console'; then ← 出力されたらシリアルコンソールと判定
+ ttyspeed=`stty speed` ← ボーレートを取得
+ sed -i.orig -e 's|^tty00[ ].*|tty00 "/usr/libexec/getty std.'${ttyspeed}'" vt220 on secure|' /etc/ttys
+ fi ↑
+ /etc/ttysファイルの該当エントリを書き換えて
+ #--------------- シリアルデバイスからログインできるようにする。
+ # root password
+ #
until passwd root
do
echo "passwd failed, Try again."
done
以上の改修により、河豚板が起動された環境がheadless運用の場合などにシリアルコンソールを自動的に有効化し、スムースに運用することができるようになった。
河豚板ではLive Systemの特徴を活かすため起動時に環境を自動検出し、動的に設定を書き換えるようになっている。 例を挙げると;
今回のシリアルコンソール対応も、これらの設定などと同様の方針で行われた。