Ubuntu 10.4をインストールしたPC/AT互換機を、端末としてシリアルポートを使うように設定してみた。最近はクライアント環境としてはMacBook Proを専ら使っていて、他のマシンにはSSH経由で入ることが多いので、ディスプレイやキーボードは邪魔なだけだ。メンテするときもUnixワークステーションの類はMacにUSB-Serialアダプタを挿してシリアルで繋ぐので、PC/AT互換機もそれに合わせたい。
基本的には Remote Serial Console HOWTO に従う。
- 設定をミスしたときのためのブートディスクは作らなかったけど、安全を期すならやっぱり作った方が良い。
- このマシンのBIOSはシリアルポートに出力する機能が見あたらなかった。BIOSをシリアル経由で扱うのは諦める。
- このマシンにはシリアルポート3は存在しないので、ttyS2を無効化する手順は必要なかった。
- ブートローダーが問題だ。HOWTOにはGRUB 1の設定例が載っているけど、GRUB 2はちょっと勝手が違う。
- カーネルへに引き渡す引数はそのままで問題ない。問題は、それをGRUBの設定のどこに書くのか。
- getty設定もHOWTOとはちょっと流儀が違う。
変数設定
結論から言えば、シリアルポートを使用する仕組み自体はGRUB2の設定テンプレートに含まれていた。概ね、 /etc/default/grub の設定値だけを弄れば十分である。次の値を設定した。
GRUB_CMDLINE_LINUX_DEFAULT="quiet console=tty0 console=ttyS0,9600n8" GRUB_TERMINAL_INPUT="serial console" GRUB_TERMINAL_OUTPUT="serial console" GRUB_SERIAL_COMMAND="serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1"
/boot/grub/grub.cfg においては設定 terminal_input
, termianl_output
はHOWTOに書かれている terminal
*1 と同じく、複数の値を取れるようだ。しかし、 grub.cfg を生成するための /usr/sbin/grub-mkconfig と /etc/grub.d/00_header は複数の値を受けとることを想定していない。そこで、次のパッチを当てる。設定値の中に gfxterm
を含むとこれでもうまくないが、私の設定は "serial console"
だから気にしない。
--- grub-mkconfig.orig 2010-06-21 16:25:32.373592706 +0900 +++ grub-mkconfig 2010-06-21 16:28:57.453592511 +0900 @@ -127,7 +127,8 @@ GRUB_TERMINAL_OUTPUT="${GRUB_TERMINAL}" fi -case x${GRUB_TERMINAL_OUTPUT} in +for grub_terminal_output_entry in "${GRUB_TERMINAL_OUTPUT}"; do +case x${grub_terminnal_output_entry} in x | xgfxterm) # If this platform supports gfxterm, try to use it. if test -e ${grub_prefix}/gfxterm.mod ; then @@ -144,9 +145,11 @@ xconsole | xserial | xofconsole) ;; *) echo "Invalid output terminal \"${GRUB_TERMINAL_OUTPUT}\"" >&2 ; exit 1 ;; esac +done # check for terminals that require fonts -case ${GRUB_TERMINAL_OUTPUT} in +for grub_terminal_output_entry in "${GRUB_TERMINAL_OUTPUT}"; do +case ${grub_terminal_output_entry} in gfxterm) if [ -n "$GRUB_FONT" ] ; then if is_path_readable_by_grub ${GRUB_FONT} > /dev/null ; then @@ -181,6 +184,7 @@ # make sure all our children behave in conformance with ascii.. export LANG=C esac +done # These are defined in this script, export them here so that user can # override them.
--- 00_header.orig 2010-06-21 16:33:22.945593418 +0900 +++ 00_header 2010-06-21 16:33:29.805593524 +0900 @@ -65,7 +65,7 @@ EOF case ${GRUB_TERMINAL_INPUT}:${GRUB_TERMINAL_OUTPUT} in - serial:* | *:serial) + serial*:* | *:serial*) if ! test -e ${grub_prefix}/serial.mod ; then echo "Serial terminal not available on this platform." >&2 ; exit 1 fi
getty
最後にgettyを設定する。Ubuntuに含まれているgettyはagettyなのか? ともあれ、manを参考にしながら設定する。
gettyの起動設定は、 /etc/init を見ると tty1.conf やら tty2.conf やらが並んでいるのでこれだろう。 tty1.conf をコピーして次のような ttyS0.conf を作った。
# ttyS0 - getty # # This service maintains a getty on ttyS0 from the point the system is # started until it is shut down again. start on runlevel [23] stop on runlevel [!23] respawn exec /sbin/getty -8 9600 ttyS0
生成
以上で、 update-grub2 して再起動したところ、VGA出力+キーボードとシリアルポートの両方を端末として利用できるようになった。ま、実際には一気にやらないでgrub, kernel, gettyと順番に順次再起動して試しながらやったんだけどね。
*1:こちらは古い設定項目のようだ