#topicpath * 河豚板のシリアルコンソール対応 [#s510934d] RIGHT:EBUG 第68回会合 ~ 2019年2月23日、(有)銀座堂 ~ 川俣吉広、kaw@on.rim.or.jp ** シリアルコンソールを使用するケース [#g54897f2] OpenBSDを使っていると、以下のようなケースでシリアルコンソールを使用する場合がある。 -OpenBSD/arm64をラズパイ3等で動作させる場合 --HDMIがまだサポートされていないので、デフォルトでコンソールがシリアルとなっている -OpenBSDを[[vmm(4)>https://man.openbsd.org/vmm.4]]のゲストOSとして動作させる場合 --vmmはビデオ出力をサポートしていないため、コンソールが仮想端末(/dev/ttyp??)となっている~ (コンソールへのアクセスはインスタンス起動後に[[cu(1)>https://man.openbsd.org/cu.1]]などを用いる) -OpenBSDの起動メッセージのtranscript取るためにQEMUを-serial stdioオプションを付きで使う -盆栽のような、headless運用の場合 --メモリ節約のためVGAドライバを入れていない、あるいはリモートブートのため -etc... OpenBSDをシリアルコンソールで運用するには以下の操作を行う。 -シリアルデバイスからログインできるように、あらかじめ[[/etc/ttys>https://man.openbsd.org/ttys.5]]を編集しておく tty00 "/usr/libexec/getty std.9600" vt220 on secure ↑ ↑ 実際のラインスピードに合わせる gettyを有効にする -起動直後のブートプロンプトに対し、以下のように入力する boot> set tty com0 ←VGAなどに表示される boot> [Enter] ←シリアルデバイスに切り替わって出力される -あるいは、前項の入力内容を[[/etc/boot.conf>https://man.openbsd.org/boot.conf]]に記述しておく。 -OpenBSD/arm64では、デフォルトでシリアルコンソールとなっているため、上記設定済みでインストールされる。 ** 河豚板での問題点 [#d966acd9] 通常のOpenBSDをHDD等へインストールする場合であれば、インストール時に Change the default console to com0? [no] と訊かれるため、これにyesと答えれば上記の設定が行われる。 一方、河豚板ではデフォルトでは毎回fresh bootとなるため、このような設定をあらかじめ作り込んでおくことができない。 そのため、別のアプローチを取る必要がある。 さらに、bootプロンプト(又はboot.conf)で設定したボーレートと/etc/ttysに記述されているエントリが合っていない場合、途中で通信速度が変わってしますため、端末側の通信速度をそれに合わせてやらなければならない。 さらに、bootプロンプト(又はboot.conf)で設定したボーレートと/etc/ttysに記述されているエントリが合っていない場合、途中で通信速度が変わってしまうため、端末側の通信速度もそれに合わせてやらなければならない。 ** 対応策 [#j242f55d] 河豚板では、OpenBSD本来の初期化スクリプト[[/etc/rc>https://man.openbsd.org/rc]]に先立ち、/boottmp/rcという独自の初期化スクリプトが実行される。~ シリアルコンソール対応として、/boottmp/rc内で以下の処理を行うこととした。 -コンソールがシリアルデバイスかどうかの検出を行う -シリアルデバイスの場合、その伝送速度を取得する -検出した結果に基づいて/etc/ttysの書き換えを行う。 実際に/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 **まとめ [#a6c32cda] 以上の改修により、河豚板が起動された環境がheadless運用の場合などにシリアルコンソールを自動的に有効化し、スムースに運用することができるようになった。 河豚板ではLive Systemの特徴を活かすため起動時に環境を自動検出し、動的に設定を書き換えるようになっている。 例を挙げると; -起動時に全ストレージデバイスをスキャンし、河豚板用のデバイスやスワップパーティションを有効化する -全デバイスのスキャン結果やユーザの指示を基にファイルシステムのマウントを行う~ →マウントの結果から、[[/etc/fstab>https://man.openbsd.org/fstab.5]]を生成する -ネットワークデバイスの検出を行い、実際に使われそうなデバイスをユーザに候補として表示する~ WiFiデバイスの場合は、認証設定の項目も提示する 今回のシリアルコンソール対応も、これらの設定などと同様の方針で行われた。 ---- #topicpath