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には若干問題があるようなので,アップデートの方をインストールします.
VMwareを起動して,今度は “netboot from floppy, PC console” を選びます.GRUBがNetBootをロードした後,画面には何も出ませんが,ここでシリアルコンソールが有効になっています.
Linuxのターミナル上で,”cu -l /dev/ttyz0” を実行すると,NetBootのシリアルコンソールに接続することができます.
ここで,前回と同じように入力すると,シリアルコンソール上で hello カーネルを動作させることができます.
毎回,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のウインドウは画面上には現れません.
適当に修正して使ってください.