NetBSD/i386でシリアルコンソール

1.PCでのシリアルコンソール

ごく普通のパソコンでは、VGAカードをつけて、それにモニタをつなげて使う、というのが一般的ですから、WSみたいに全ての設定をシリアルコンソールで操作するというのはできません。例えば、ディスプレイがないPCではBIOSの設定を変えたいといった時は、ディスプレイをどこからか調達してくる必要があるわけです。しかし、ブートメッセージを出したり、ログインプロンプトをシリアルに出すことであれば、普通のi386アーキテクチャのマシンでもできます。

2.ログインプロンプトをシリアルに出力する

まずはログインプロンプトをシリアルに出力させてみます。これは、/etc/ttysというファイルを編集するだけなので非常に簡単です。「シリアルなんか使わないから、kernelの設定で無効にしちゃったよ」、とか、「BIOSで無効にした」という人はちゃんと有効にしておきましょう:-)
まずはお好みのエディタ(おすすめはviですが)で/etc/ttysを編集します。
#
#       from: @(#)ttys  5.1 (Berkeley) 4/17/89
#       $NetBSD: ttys,v 1.10.8.1 2000/08/12 18:01:48 mason Exp $
#
# name  getty                           type    status          comments
#
console "/usr/libexec/getty Pc"         pc3     off secure
ttyE0   "/usr/libexec/getty Pc"         vt220   on secure
ttyE1   "/usr/libexec/getty Pc"         vt220   on secure
ttyE2   "/usr/libexec/getty Pc"         vt220   on secure
ttyE3   "/usr/libexec/getty Pc"         vt220   on secure
tty00   "/usr/libexec/getty std.9600"   unknown off secure 
tty01   "/usr/libexec/getty std.9600"   unknown off secure
tty02   "/usr/libexec/getty std.9600"   unknown off secure
tty03   "/usr/libexec/getty std.9600"   unknown off secure
tty04   "/usr/libexec/getty std.9600"   unknown off secure
tty05   "/usr/libexec/getty std.9600"   unknown off secure
tty06   "/usr/libexec/getty std.9600"   unknown off secure
tty07   "/usr/libexec/getty std.9600"   unknown off secure
ttyp0   none                            network
以下略
NetBSD/i386のデフォルトでは、上のようになっているはずです。このうち、シリアルポートはtty00〜tty07までです。COM1ポートがtty00、COM2ポートがtty01です。とりあえず何かあった時のために別名でコピーするなりしてバックアップを作っておきます。
この設定ファイルをみて、わかる人もいると思いますが、例えばCOM1ポートをシリアルコンソールにしたい場合はtty00という行を編集すればよいわけです。たとえば、COM1をシリアルコンソールにするような場合は
tty00   "/usr/libexec/getty std.9600"   vt100 on secure local
のように書き換えます。2番目の"/usr/libexec/getty std.9600"という部分ですが、std.xxxxの数字はシリアルポートのスピードを表します。上の場合は9600bpsになります。もっと速くしたいような場合には19200, 38400, 57600, ,115200などを書きます。詳しくはcom(4)を参照してください。うちでは57600bpsでつないでいます。
3番目のvt100というのは、ターミナルタイプです。普通はvt100でよいでしょう。
4番目はon, offで指定します。使うポートはonで、使わないポートはoffにしておきます。また、secureと書いてあるコンソールからはrootでログインできます。書いてないコンソールからは、一般ユーザーでしかログインできません。もちろん、一般ユーザーでログインしたあとにsuコマンドでrootになることはできます。詳細はttys(5)を参照してください。

/etc/ttysを編集したら、ttyflagsコマンドを実行します。tty00をコンソールとして使いたい時は

ttyflags ttys00
とします。そのあとに
kill -HUP 1
とやって、initにHUPシグナルを送ります。ここまでできたら作業は一通りおしまいです。念のためpsコマンドでgettyがちゃんと起動しているかどうか確認しておきます。
[mira@algol mira]% ps ax
PID TT STAT    TIME COMMAND
  0 ?? DLs  0:00.02 (swapper)
  1 ?? Is   0:00.02 init 
  2 ?? DL   0:00.00 (pagedaemon)
  3 ?? DL   0:00.03 (reaper)
  4 ?? DL   0:00.61 (ioflush)
      省略
177 00 Is+  0:00.02 /usr/libexec/getty std.57600 tty00 
      省略
上のように、gettyが/etc/ttysで指定したポート(tty00等)を見張っていればOKです。また、std.xxxxの数字が/etc/ttysで指定したものと同じであることを確認してください。問題ないようであれば、別なマシンから
cu -l /dev/cuaa0 -s 57600
のようにやって接続します。ちなみに上の例はFreeBSDから接続する場合で、NetBSDの時はcuaa0ではなくて、dty00などを指定します。-sのあとの数字はシリアルポートの速さで、接続先のものと一致させます。Connectedと表示されたあとにEnterキーを1回たたくと

login

のように表示されます。

3.boot messageもシリアルに出力する

さて、今までの設定で、とりあえずネットワーク経由でログインできない場合でも大丈夫になりました。しかし、何かのトラブルでシングルユーザーモードで起動してしまったらアウトです。どこからかディスプレイを持ってくるはめになるでしょう。
NetBSDでboot messageの段階からシリアルに出力するには、kernelの再構築をする必要があります。NetBSDでkernelの再構築したことがない人は、何かしらのドキュメントに目を通してからの方がいいでしょう。
では早速kernelの設定ファイルを編集します。NetBSD/i386の設定ファイルは/sys/arch/i386/confにあります。はじめて編集する人はGENERICを適当な名前でコピーして、それを編集するようにしてください。設定ファイルの中に
# This option allows you to force a serial console at the specified
# I/O address.   see console(4) for details.
#options         "CONSDEVNAME=\"com\"",CONADDR=0x2e8,CONSPEED=57600
#       you don't want the option below ON iff you are using the
#       serial console option of the new boot strap code.
#options         CONS_OVERRIDE   # Always use above! independent of boot info
という項目があります。GENERICではどちらもコメントになっているので、これを有効にします。気をつけて欲しいのは
options         "CONSDEVNAME=\"com\"",CONADDR=0x3f8,CONSPEED=57600
の部分です。大抵のPCのシリアルデバイスはcomとして認識されると思いますが、そうでない場合はCONSDEVNAMEを変更します。また、使いたいシリアルデバイスのハードウェアアドレスをCONADDRに指定します。これはdmesgをみればでていると思います。最後のCONSPEEDはシリアルポートの速度で、うちでは57600bpsを使っています。
変更したら、configしてmake depend、make、make installの順で実行します。再起動の前に/etc/ttysを編集してttyE0をoffにしておきます。デフォルトのコンソールがシリアルに移るのでttyE0が使えなくなるからです。また、シリアルコンソールとして使うシリアルデバイスを/etc/ttysのなかで有効にしておいてください。それが終ったら再起動します。
再起動すると一番最初のブートローダーまではディスプレイに出力されますが、それ以降(dmesgで確認できる部分)はシリアルに出力されます。

boot1

boot2

上のスクリーンショットのように、ちゃんとメッセージが出力されれば成功です。ちなみにディスプレイの方には(有効にしてあれば)ttyE1のログインプロンプトが出ているはずです。

4.ブートプログラムをシリアルコンソール対応にする

kernelがシリアルコンソール対応になったので、ブートプログラムもシリアル対応にしておきます。ソースは/usr/src/sys/arch/i386/stand以下にあって、シリアルコンソール対応のはbiosboot_com0というディレクトリの下にMakefileがあります。Makefileは以下のようになってます。
#       $NetBSD: Makefile,v 1.1 1999/07/11 01:23:53 kim Exp $

BASE= biosboot_com0

.include "../biosboot/Makefile"
このままの状態でmakeすると、コンソールになるシリアルポートはCOM0で、通信速度は9600bpsになります。さっき、kernelを作る時に57600bpsにしたので、ブートプログラムもそれに合わせたほうがいいでしょう。biosboot_com0のMakefileは/usr/src/sys/arch/i386/stand/biosboot/Makefileを参照しているので、こちらを見てみると、
.if (${BASE} == "biosboot")
# Various serial line configurations
CPPFLAGS+= -DSUPPORT_SERIAL=CONSDEV_PC -DDIRECT_SERIAL
#       or
#CPPFLAGS+= -DSUPPORT_SERIAL=CONSDEV_COM0KBD
#       or
#CPPFLAGS+= -DSUPPORT_SERIAL=CONSDEV_AUTO
#       and maybe
#CPPFLAGS+= -DDIRECT_SERIAL -DCOMCONS_KEYPRESS -DCONSPEED=57600
.endif

.if (${BASE} == "biosboot_com0")
CPPFLAGS+= -DSUPPORT_SERIAL=CONSDEV_COM0 -DDIRECT_SERIAL
.endif
のような部分があります。シリアルポートの速度は-DCONSPEED=xxxxというので設定します。なので、biosboot_com0のMakefileに以下のように書き足します(数字は各自の設定に合せます)。
CPPFLAGS+= -DCONSPEED=57600
これで/usr/src/sys/arch/i386/stand/biosboot_com0でmake depend && make && make installとやってブートプログラムをmakeします。
さて、Makefileを見て分ると思いますが、標準で用意されてるMakefileではCOM0をコンソールとして使うことを前提としています。もし他のポートを使う場合には-DSUPPORT_SERIALを変更する必要があります。この辺の詳しいことはbt_cosole(8)に載ってますので、そちらを参考にして下さい。

で、次に作成したブートプログラムをHDDに書き込みます。make installをすると、biosboot_com0.symという名前で/usr/mdec以下にインストールされますが、これだけではだめです。
ブートプログラムを書き込むのはinstallbootというコマンドを使います。詳しい使い方はinstallboot(8)を参照して下さい。とりあえず以下のようにやればうまくいきます。

/usr/mdec/installboot /usr/mdec/biosboot_com0.sym /dev/rwd0a
うちのNetBSDマシンはIDEのHDDなのでrwd0aですが、SCSIならrsd0aとでもやって下さい。 これでマシンをリブートしてみると...

boot program

のようになります。

これでシリアル経由でいろいろできるようになりましたが、やっぱりBIOSの設定とかはディスプレイやキーボードをつながないとできないので、Alphaマシンみたいにシリアルコンソールを使ってOSのインストールなどはできません…

5.おまけ…全部シリアルに出力する

私はよくぷらっとホームのWebページを見るのですが、この前「PC Weasel 2000」という製品が紹介されていました。詳しくはリンク先のページに書いてありますが、これは通常のVGA出力をシリアルポートに出力し、ハードウェアレベルで監視・操作を可能にするものです。つまり、通常のPCにこのカードを取り付ければ、BIOSの設定変更や再起動などの操作がすべてシリアル経由でできてしまうということになります。
私は、これは素晴らしい製品だ、とは思いましたが、値段が高いのでちょっと手を出しかねています…

BSDのページに戻る
$Id: serial.html,v 1.1.1.1 2002/01/13 08:40:33 mira Exp $