Kota Abe
English page>>

OSKitで遊ぼう

このページはVMware 2.x for Linuxをベースに記述しています.より新しいVMwareでも動くと思いますが,確認していません.

UNIX USER2003年3月号に高野了成氏による "OSKitではじめるDIY感覚のOS開発 自分だけのOSを作ろう!" という記事が掲載されています.OSKitに興味がある人には一読をお勧めします.(このWebページも紹介されています.)

目次

OSKitとは何か

OSKitは,一言で言えば,OSを簡単に作成するためのライブラリ群です.University of UtahFlux 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 を出力するだけのカーネルなら,こんなに簡単です.

#include <stdio.h>
#include <oskit/clientos.h>
#include <oskit/startup.h>

int main()
{
  oskit_clientos_init();
  printf("Hello, World\n");
  return 0;
}

このページの主旨は 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 とでもしておきましょう.

では,とりあえず動かしてみましょう.

% vmware -x /work/vmware/netboot/netboot.cfg
    

うまくいけば,GRUBのメニューがでるはずです.

GRUB

ここで,カーソルキーを使って "netboot from floppy, PC console" を選ぶと,GRUBがnetbootをロードし,次のような画面になるはずです.

NetBoot

BOOTPサーバの準備

NetBootは,bootpプロトコルを使ってIPアドレスを取得するので,Linux側でbootpサーバを動作させる必要があります.bootpサーバとしては,VMwareのdhcpdを使えば良いでしょう.

まず,先ほど作成した仮想計算機の MAC アドレスを調べます.Linuxの/var/log/messagesに次のようなメッセージが残っているはずです.仮想ネットワークのネットワークインタフェース名もわかります(ここではvmnet1).

Apr  8 16:30:58 tigger vmnet-dhcpd: BOOTREQUEST from 00:50:56:dd:78:10 via vmnet1
Apr  8 16:30:58 tigger vmnet-dhcpd: No applicable record for BOOTP host 00:50:56:dd:78:10 via vmnet1
    

Linuxのvmnet1側のネットワークアドレスを確認しておきます.これはVMwareインストール時に選択しているはずです.ここでは192.168.0.1を使っています.

[root@tigger dhcpd]# /sbin/ifconfig vmnet1
vmnet1    Link encap:Ethernet  HWaddr 00:50:56:C0:00:01  
          inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2162 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3672 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
    

/etc/vmware/vmnet1/dhcpd/dhcpd.confに,hostエントリを一つ追加します.IPアドレスはvmnet1のネットワークから適当に選んでください.(ここでは192.168.0.10を使います.)

#
# Configuration file for ISC 2.0b6pl1 vmnet-dhcpd operating on vmnet1.
#
# This file was automatically generated by the VMware configuration program.
# If you modify it, it will be backed up the next time you run the
# configuration program.
#
# We set domain-name-servers to make some clients happy
# (dhclient as configued in SuSE, TurboLinux, etc.).
# We also supply a domain name to make pump (Red Hat 6.x) happy.
#
allow unknown-clients;
default-lease-time 1800;                # 30 minutes
max-lease-time 7200;                    # 2 hours

subnet 192.168.0.0 netmask 255.255.255.0 {
    range 192.168.0.128 192.168.0.254;
    option broadcast-address 192.168.0.255;
    option domain-name-servers 160.193.8.1;
    option domain-name "media.osaka-cu.ac.jp";
    option routers 192.168.0.1;
}

host netboot {
    hardware ethernet 00:50:56:dd:78:10;
    fixed-address 192.168.0.10;
    option host-name "netboot";
}
    

VMware関係のデーモンを再起動すると,設定が反映されます.

[root@tigger dhcpd]# sh /etc/rc.d/init.d/vmware stop
[root@tigger dhcpd]# sh /etc/rc.d/init.d/vmware start
    

では,もう一度VMwareを起動してみましょう.今度はIPアドレスが取れてNetBootのプロンプトが出るはずです.

NetBoot

NFSサーバの準備

NetBootはNFSを使ってカーネルを読み込むので(最近はTFTPもサポートしているようですが),LinuxをNFSサーバに仕立てます.

とりあえず,OSKitに付属しているサンプルカーネルを動かしてみるために,$OSKITを仮想計算機に対して NFS export します./etc/exportsに以下のような行を追加して,mountdをリスタートします.

/work/oskit 192.168.0.10(ro)
    
[root@tigger /]# sh /etc/rc.d/init.d/nfs restart
...
[root@tigger /]# /usr/sbin/showmount -e
Export list for tigger.media.osaka-cu.ac.jp:
/work/oskit 192.168.0.10
    

サンプルカーネルの起動

いよいよサンプルカーネルを動かしてみます.サンプルカーネルはいくつかありますが,まずは定番の hello カーネルにしましょう.hello カーネルは $OSKIT/examples/x86/hello にあるはずです.

VMwareを起動して,NetBootのプロンプトが現れたら次のように入力します(もちろん192.168.0.1はLinuxのIPアドレスです.)

192.168.0.1:/work/oskit/examples/x86/hello
    

次のように hello カーネルが動くはずです.

Hello

動きましたか?

次へ