OSKitで遊ぼう - シリアルコンソールの使用
毎回,VMwareのVGAウインドウ上でキータイプしてカーネルを起動するのは面倒なので,仮想シリアルコンソールと expect を使って自動化します.
仮想シリアルコンソールの設定
VMwareのシリアルポートはPTY(Pseudo TTY)に繋ぐことができるので,これを使ってVMwareのシリアルポートをLinux側に繋ぎます.
まず,VMwareのSetting→Configuration Editorを使って,Serial Portsを追加します.
COM1を,以下のように設定します.
- Type: TTY
- Path: /dev/ptyz0 (使われてなさそうなPTY)
- Start Connectedにチェックを入れて Install ボタンを押します.
Linuxからは cu コマンドを使ってTTYにアクセスすることにします.Redhat Linuxの場合,cu コマンドは uucp のパッケージに含まれていますが,Redhat Linux7.1に含まれているuucpには若干問題があるようなので,アップデートの方をインストールします.
# rpm -Uvh /somewhere/uucp-1.06.1-33.7.1.i386.rpm
VMwareを起動して,今度は “netboot from floppy, PC console” を選びます.GRUBがNetBootをロードした後,画面には何も出ませんが,ここでシリアルコンソールが有効になっています.

Linuxのターミナル上で,”cu -l /dev/ttyz0” を実行すると,NetBootのシリアルコンソールに接続することができます.
% cu -l /dev/ttyz0
Connected.
NetBoot 1>
ここで,前回と同じように入力すると,シリアルコンソール上で hello カーネルを動作させることができます.
NetBoot 1> 192.168.0.1:/work/oskit/examples/x86/hello
hello: loading...done (0.08 seconds)
hello: booting...
OSKit Version 20020317 (compiled Apr 2 2002)
Hello, World
_exit(0) called; returning to netboot...
NetBoot metakernel v3.1.0
Built 09- 4月-2002 by k-abe@tigger:/work/oskit/boot/net
I am netboot.media.osaka-cu.ac.jp (IP: 192.168.0.10, mask: 255.255.255.0)
Gateway: 192.168.0.1
Nameserver: 160.193.8.1
NetBoot 2>
毎回,GRUBで選択するのも面倒なので,デフォルトでシリアルコンソールの NetBoot が起動するようにします.$OSKIT/boot/net/ で gmake grubnetboot-lance-timeout@1-default@0.img して作ったものを置いておきます.
ダウンロード (grubnetboot-lance-timeout@1-default@0.img, 1.44MB)
これを起動フロッピーイメージとして使うと,GRUBが起動して1秒後にはシリアルコンソールのNetBootが起動します.
カーネル起動の自動化(expectの使用)
自作のカーネルをテストする場合,何度もカーネルを起動することになるので,毎回NetBootのプロンプトに対してカーネルのパスを入力するのは面倒です.これを自動化するには expect が使えます.
次のようなスクリプトを使うと,VMwareを起動してから NetBoot のプロンプトにカーネルの場所を入力し,VMware を終了させるまでを自動的に実行させることができます.なお,このスクリプトではVMwareをアイコン化して実行しているので,VMwareのウインドウは画面上には現れません.
適当に修正して使ってください.
#!/bin/sh
# VMware Configuration File
VMWARE_CONFIG=/work/vmware/netboot/netboot.cfg
# Your Kernel Location
KERN_LOC="192.168.0.1:/work/oskit/examples/x86/hello"
# Start VMware in iconified window mode
# If you are using VMware2.0, you may have to remove -- option
/usr/bin/vmware -x -q $VMWARE_CONFIG -- -iconic &
VMWARE_PID=$!
trap "echo 'Killing the VMware...' ; kill $VMWARE_PID" 0 1 2 15
sleep 1
# Connect to the virtual serial console
expect - <<__ENDEXPECT__
set prompt NetBoot.*>
set timeout 60
spawn cu -l /dev/ttyz0
send_user "Waiting for a NetBoot prompt...\n"
expect {
eof { send_user "EOF!"; exit }
timeout { send_user "timed out\n"; exit }
-re \$prompt
}
send "$KERN_LOC\r"
# If your kernel is an interactive kernel, you may want to enable
# the following line.
#interact
expect -re \$prompt
__ENDEXPECT__
echo
# EOF