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をロードした後,画面には何も出ませんが,ここでシリアルコンソールが有効になっています.

NetBoot, Serial Console

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