#topicpath
 * 河豚板のシリアルコンソール対応 [#s510934d]
 RIGHT:EBUG 第68回会合 ~
 2019年2月23日、(有)銀座堂 ~
 川俣吉広、kaw@on.rim.or.jp
 
 ** シリアルコンソールを使用するケース [#g54897f2]
 OpenBSDを使っていると、以下のようなケースでシリアルコンソールを使用する場合がある。
 
 ** 河豚板での問題点 [#n0459c71]
 -OpenBSD/arm64をラズパイ3等で動作させる場合
 --HDMIがまだサポートされていないので、デフォルトでコンソールがシリアルとなっている
 
 ** 対応策 [#w5152a7c]
 -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に記述されているエントリが合っていない場合、途中で通信速度が変わってしまうため、端末側の通信速度もそれに合わせてやらなければならない。
 
 ** 対応策 [#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
Top Index Search Recent Backups  Help  RSS