Debian GNU/Linuxの/sbin/init (というか、たぶんほとんどのLinuxベースOS) には、動作中にコンソールをすりかえるカッチョイイ機能があるみたい。
Linux (というかUnix一般) でコンソールとは特殊な端末で、だいたい3つの役割がある。
- カーネルが直接入出力をする端末。カーネルの起動メッセージやエラーメッセージが出る。入力の方はあんまりないが、KDBとか。
- init(8)の標準入出力になっている端末。各デーモンの起動メッセージなんかが出てくる。BSD系Unixではshutdown時の各デーモンの終了メッセージは、shutdown(8)を実行した端末に出てくるが、Linuxなどではコンソールなどに出てくる (デーモンを停止する動作は、BSD系ではshutdown(8)が起動する/etc/rc.shutdownスクリプトが行なうのに対し、Linuxなどではshutdown(8)などの指示によりinit(8)が起動する/etc/rc?.d/*スクリプトが行なうという違いがあるため)。/sbin/initはカーネルが起動するので、その標準入出力もカーネルが設定する。したがって、普通は上記のコンソールと一致する。
- loginして普通に作業する端末。普通にgetty→login→ログインシェルが動く端末。他の端末と同じように、/etc/inittab (BSD系では/etc/ttys) で設定。
Linuxの場合、1番目に挙げたカーネルの端末を、起動オプションconsole=<ほげ>で与える。カッチョイイのは、これが複数指定できて、どの端末も同じように使える点。このうち最後に指定された端末が、/sbin/initを起動する際の標準入出力になる。最近のLinux-2.6では、USBシリアルをコンソールにできたり、出力専用ながらsyslogd形式でカーネルメッセージを他のマシンに送ったりできるようだ。
実際にはUSBシリアルは、init(8)起動の時点でまだ初期化されていないことが多いので、いくら最後に指定してもinitのコンソールにはならない。そこで、このプログラムをコンパイルして、
# ./chcons /dev/ttyUSB0
などとしてやると、init(8)のコンソールを/dev/ttyUSB0にすりかえることができる。端末のパラメータ (速度やパリティなど) はあらかじめstty(8)などで設定しておくこと。
# stty -F /dev/ttyUSB0 `stty -F /dev/ttySC0 -g`
てな感じで設定がttySC0からコピーされる。