OSKitで遊ぼう
この文書の内容はかなり古い(2003年頃)ですが,OSKitの日本語の情報があまりないため残してあります.
OSKitは既にメンテナンスされていません.
このページはVMware 2.x for Linuxをベースに記述しています.より新しいVMwareでも動くと思いますが,確認していません.
UNIX USER2003年3月号に高野了成氏による “OSKitではじめるDIY感覚のOS開発自分だけのOSを作ろう!” という記事が掲載されています.OSKitに興味がある人には一読をお勧めします.(このWebページも紹介されています.)
目次
- OSKitとは何か
- OSKitの入手とコンパイル
- VMwareを使って遊ぶ
- NetBootが含まれたGRUBフロッピーイメージの作成
- BOOTPサーバの準備
- NFSサーバの準備
- サンプルカーネルの起動
- 仮想シリアルコンソールの使用
- カーネル起動の自動化
OSKitとは何か
OSKitは,一言で言えば,OSを簡単に作成するためのライブラリ群です. University of UtahのFlux Research Groupが開発しています.(私は1年間,Flux Groupに客員研究員として参加していました)
OSを自分で作成する場合,ブートローダやデバッグプリントを実装するだけでも大変ですが,OSKitがそこらへんの面倒をみてくれるので,自分のOSを裸のハードウェア上で動作させることが比較的簡単にできるようになります.
OSKitのライブラリには,以下のようなものが含まれています(一部).
- POSIX emulation (open, read, write等)
- FreeBSD C library (FreeBSDのlibcをカーネルレベルで動作できるようにしたもの)
- FreeBSD math library
- Runtime Linker/Loader
- メモリ管理ライブラリ (単純なものから仮想記憶まで)
- マルチスレッド
- 簡単なプロセス
- ファイルシステム (NetBSD FFS, Linux ext2fs)
- FreeBSDのTCP/IPスタック
- Linuxのデバイスドライバ
- プロファイリング
例えば,コンソールに hello を出力するだけのカーネルなら,こんなに簡単です.
このページの主旨は OSKit を紹介することではなくて,VMwareを使ってどうやってOSKitで遊ぶかというのがテーマです.
OSKitの入手とコンパイル
OSKitは,OSKitのページから入手できます.最新版のスナップショットをダウンロードしましょう.
コンパイルは,configure して GNU make を使って make するだけです.少なくとも Redhat Linux 7.1 ならば問題なくコンパイルできるはずです.
ドキュメントには以下のものが必要と書いてあります.
- GNU make
- GNU CC (gcc) version 2.7.x or version 2.95.2. More recent gcc versions and egcs may work but have not been well tested.
- GNU binutils version 2.8.x, or 2.9.1 with BFD 2.9.1.
以後,OSKitを展開してあるディレクトリを$OSKITで表します.
VMwareを使って遊ぶ
Linux上でVMwareを使うと,自作カーネルを動かすためのコンピュータを用意しないでも,簡単に自作カーネルを動作させることができます.基本的な動作の流れは以下の通りです.
- VMwareが仮想フロッピー上のGRUBを使ってNetBootローダを起動する
- NetBootが仮想ネットワーク経由でカーネルをロードし,実行する
NetBootが含まれたGRUBフロッピーイメージの作成
NetBootはOSKitに含まれているブートローダです.
NetBootローダはイーサネットを使用してカーネルをロードするので,VMware が提供する仮想イーサネットインタフェース(AMD Lance)をサポートしたものが必要です.ただし,最新のOSKitのスナップショットは,NetBoot回りにバグがあって,VMware上で動かないので,動くように修正したフロッピーイメージをここに置いておきます.
ダウンロード (grubnetboot-lance.img, 1.44MB)
これを適当なディレクトリに置きます.ここでは,/work/netboot/ に置いたとして説明します.
次に,VMwareのFile→Newメニューを使って,次のような仮想計算機を作ります.最初にこれから作る仮想計算機の設定ファイル名を聞かれるので,適当に入力してください.ここでは/work/vmware/netboot/netboot.cfgを作ることにします.
- Floppy Drives:
- Type: File
Path: /work/netboot/grubnetboot-lance.img
Start Connected にはチェックを入れておきます. - Ethernet Adapters:
- Connection Type: Host-only として Install を押します.
- Misc:
- Display Name: 空欄になっているので NetBoot とでもしておきましょう.
とりあえず動かしてみましょう.
うまくいけば,GRUBのメニューがでるはずです.
ここで,カーソルキーを使って “netboot from floppy, PC console” を選ぶと,GRUBがnetbootをロードし,次のような画面になるはずです.
BOOTPサーバの準備
NetBootは,bootpプロトコルを使ってIPアドレスを取得するので,Linux側でbootpサーバを動作させる必要があります.bootpサーバとしては,VMwareのdhcpdを使えば良いでしょう.
まず,先ほど作成した仮想計算機の MAC アドレスを調べます.Linuxの/var/log/messagesに次のようなメッセージが残っているはずです.仮想ネットワークのネットワークインタフェース名もわかります(ここではvmnet1).
Linuxのvmnet1側のネットワークアドレスを確認しておきます.これはVMwareインストール時に選択しているはずです.ここでは 192.168.0.1を使っています.
/etc/vmware/vmnet1/dhcpd/dhcpd.confに,hostエントリを一つ追加します.IPアドレスはvmnet1のネットワークから適当に選んでください.(ここでは192.168.0.10を使います.)
VMware関係のデーモンを再起動すると,設定が反映されます.
では,もう一度VMwareを起動してみましょう.今度はIPアドレスが取れてNetBootのプロンプトが出るはずです.
NFSサーバの準備
NetBootはNFSを使ってカーネルを読み込むので(最近はTFTPもサポートしているようですが),LinuxをNFSサーバに仕立てます.
とりあえず,OSKitに付属しているサンプルカーネルを動かしてみるために,$OSKITを仮想計算機に対して NFS export します./etc/exportsに以下のような行を追加して,mountdをリスタートします.
サンプルカーネルの起動
いよいよサンプルカーネルを動かしてみます.サンプルカーネルはいくつかありますが,まずは定番の hello カーネルにしましょう.hello カーネルは $OSKIT/examples/x86/hello にあるはずです.
VMwareを起動して,NetBootのプロンプトが現れたら次のように入力します (もちろん192.168.0.1はLinuxのIPアドレスです.)
次のように hello カーネルが動くはずです.
(動きましたか?