Top / EBUG勉強会 / 20190223_SerialConsole

河豚板のシリアルコンソール対応

EBUG 第68回会合
2019年2月23日、(有)銀座堂
川俣吉広、kaw@on.rim.or.jp

シリアルコンソールを使用するケース

OpenBSDを使っていると、以下のようなケースでシリアルコンソールを使用する場合がある。

  • OpenBSD/arm64をラズパイ3等で動作させる場合
    • HDMIがまだサポートされていないので、デフォルトでコンソールがシリアルとなっている
  • OpenBSDをvmm(4)のゲストOSとして動作させる場合
    • vmmはビデオ出力をサポートしていないため、コンソールが仮想端末(/dev/ttyp??)となっている
      (コンソールへのアクセスはインスタンス起動後にcu(1)などを用いる)
  • OpenBSDの起動メッセージのtranscript取るためにQEMUを-serial stdioオプションを付きで使う
  • 盆栽のような、headless運用の場合
    • メモリ節約のためVGAドライバを入れていない、あるいはリモートブートのため
  • etc...

OpenBSDをシリアルコンソールで運用するには以下の操作を行う。

  • シリアルデバイスからログインできるように、あらかじめ/etc/ttysを編集しておく
    tty00   "/usr/libexec/getty std.9600"   vt220   on  secure
                                     ↑             ↑
             実際のラインスピードに合わせる    gettyを有効にする
  • 起動直後のブートプロンプトに対し、以下のように入力する
    boot> set tty com0    ←VGAなどに表示される
    boot> [Enter]         ←シリアルデバイスに切り替わって出力される
  • あるいは、前項の入力内容を/etc/boot.confに記述しておく。
  • OpenBSD/arm64では、デフォルトでシリアルコンソールとなっているため、上記設定済みでインストールされる。

河豚板での問題点

通常のOpenBSDをHDD等へインストールする場合であれば、インストール時に

Change the default console to com0? [no]

と訊かれるため、これにyesと答えれば上記の設定が行われる。

一方、河豚板ではデフォルトでは毎回fresh bootとなるため、このような設定をあらかじめ作り込んでおくことができない。 そのため、別のアプローチを取る必要がある。

さらに、bootプロンプト(又はboot.conf)で設定したボーレートと/etc/ttysに記述されているエントリが合っていない場合、途中で通信速度が変わってしまうため、端末側の通信速度もそれに合わせてやらなければならない。

対応策

河豚板では、OpenBSD本来の初期化スクリプト/etc/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

まとめ

以上の改修により、河豚板が起動された環境がheadless運用の場合などにシリアルコンソールを自動的に有効化し、スムースに運用することができるようになった。

河豚板ではLive Systemの特徴を活かすため起動時に環境を自動検出し、動的に設定を書き換えるようになっている。 例を挙げると;

  • 起動時に全ストレージデバイスをスキャンし、河豚板用のデバイスやスワップパーティションを有効化する
  • 全デバイスのスキャン結果やユーザの指示を基にファイルシステムのマウントを行う
    →マウントの結果から、/etc/fstabを生成する
  • ネットワークデバイスの検出を行い、実際に使われそうなデバイスをユーザに候補として表示する
    WiFiデバイスの場合は、認証設定の項目も提示する

今回のシリアルコンソール対応も、これらの設定などと同様の方針で行われた。


Top / EBUG勉強会 / 20190223_SerialConsole

Reload  New Edit Freeze Diff Attach Copy Rename  Top Index Search Recent Backups  Help  RSS
Last-modified: 2019-02-15 (Fri) 04:02:13 (98d)