私(鷲北)が学生の頃(1992年ぐらいの話です)、OS概論という授業がありました。教科書はタネンバウム著「MINIXオペレーティングシステム」で、すごく高くて買うのに躊躇する本です。当時この本は私が筆者として出入りしていたアスキーから出版されていたので、担当さんに頼みこんで一冊もらえないか交渉してみました。さすがに新品はくれなかったのですが、校正用に取ってあったものを譲り受け、授業に持ち込むことができました。ところどころに赤が入ってて、思えば貴重な一冊だったのですが、卒業後3回ぐらい引っ越すうちにどこかへまぎれてなくしてしまいました。
この本はとても分厚くて、巻末にはMINIXのソース・ダンプが数百ページに渡って掲載されている無茶な本です。しかし説明は平易でおもしろく、眠れない夜には枕に最適でした。特に好きだったのが競合を説明する章で紹介されている「食事する哲学者」のページで、あれは結構分り易かった、できればもう一度読み直してみたいもんだと思っていたのでした。
最近になって「もしかしたら古本があるかも?」と思い立ち、Amazonで検索してみました。そしたら驚いたことに第3版が2005年に出ているではありませんか。出版社はピアソンに変わっていますが、中身はだいたい同じのようです。というわけでAmazonで注文して、懐かしの「哲学者」のページを見ることができたのでした。
MINIXって?
ところでMINIXとはいったいなんでしょう? これを理解するには、1980年代から90年代にかけてのUnix事情を知る必要があります。
当時のUnixはAT&Tが販売する有料のソフトウェアでした。価格は非常に高く、また動かすべきコンピュータ自体もミニコンと呼ばれる大型のもので、個人が簡単に手に入れて使うようなシロモノではありません。ごく限られた企業か、コンピュータ学科をもつ大学にしかありませんでした。大学に対する販売ではライセンスが非常に安く(といってもやっぱり個人では買えないような価格です)、しかもソースコードつきで購入できたので、それを読んでOSを学ぶ学生が増えました。中にはBSDのように、独自の改造やソフトウェアのパッケージを追加して配布を始めるケースもでてきました。しかしあるときAT&TはUnixのライセンスをより厳しいものに変え、ソースを勝手に利用できないようにしてしまいました。自由に流通し、改造されて成長してきた分野は一時的に冷え込んでしまいました。
それを見て「使えないならゼロから作ろう」と決心したのが、オランダの大学で教授をしているタネンバウムでした。タネンバウムは自らの理論を実装したUnix OSを開発し、MINIX(mini-Unix)と名付けたのです。ソースは完全に独自のものであったので、これを使って以前のように講義を行うことができました。理論だけでなく、実際に動く教材としてMINIXを示したのです。
MINIXは教材であるため、実用に使われるOSに比べて足りない部分はいくらかあります(ちょうどPascalのような感じです)。しかしコンパクトで軽いので、当時の学生が持っていたフロッピーディスクしかないパソコンでもちゃんと動きました。やがて、MINIXのソースを読んで研究し批判を加えたり改良を始めたりする人も現れました。そうした動きが盛んになり、生まれてきたのがLinuxなのですが、それはまた別の話です。
現代においては、Unixのライセンス事情は大きく変わりました。LinuxはGNUライセンスの下おおいに開発が進み、一時は商用としてライセンスされていたBSDも書きかえられて無料の派生版がいくつか生まれました。これらはすべてインターネットでダウンロード可能で、利用ライセンスは自由度が高く、企業が実務で使用する本格的OSとして社会に完全に溶け込んでいます。さくらインターネットもその恩恵に大いにあずかっています。
そんな現代においても、タネンバウム先生はMINIXの改訂を続けています。2005年に公開されたMINIX 3は、ちゃんとインターネットにも対応しているようです。サポートサイトは http://www.minix3.org です。サイト上ではインストールCDのISOイメージも公開されているので、KVMで試してみるにはうってつけです。
ゲストOSにネットワークを設定する
というわけで前置きがとんでもなく長くなりましたが、今回はゲストOSにMINIXを据えて、インターネットアクセスが可能なように設定する手順をご紹介します。
MINIXみたいなマイナーなOSを例に説明するなんて、どうせならもっとメジャーなOSで試せよ、と思われるかもしれませんが、最近のOSのインストーラはどれもよくできていて、特に説明なしでも簡単に設定できますから大丈夫です(よね?)。というわけでインストールしてみたいOSの設定手順に合わせて、そのあたりは読み替えていただければと思います。
ホストOSのネットワークをブリッジ化する
ホストOSをインストールしたとき、そのネットワークインターフェースはeth0になっています。これをホストOSとゲストOSで共有するために、仮想的なブリッジをホストOSに作ってeth0を接続する方法に切り替えます。
ブリッジを利用するためにbridge-utilsをインストールします。インストール編でご紹介したFedora 12を使っている方なら、以下のようにすればOKです。
yum install bridge-utils
次にifcfg-eth0を書き換えます。eth0に割り当てられたIPアドレスはブリッジインターフェースの方へ移動し、eth0は仮想化します。
DEVICE=eth0 ONBOOT=yes IPADDR=192.168.12.46 NETMASK=255.255.255.0 GATEWAY=192.168.12.1
↓
DEVICE=eth0 ONBOOT=yes #IPADDR=192.168.12.46 #NETMASK=255.255.255.0 #GATEWAY=192.168.12.1 BRIDGE=br0
次にブリッジインターフェースbr0を作成します。/etc/sysconfig/network-scriptsの下にファイルifcfg-br0を作成します。ifcfg-eth0の変更前のアドレス設定をそのままコピーすればよいでしょう。
DEVICE=br0 ONBOOT=yes TYPE=Bridge IPADDR=192.168.12.46 NETMASK=255.255.255.0 GATEWAY=192.168.12.1
作成できたら、networkサービスを再起動します。リモート環境で失敗するとネットワークが切れてそれっきりになってしまうので、アドレスや文字のつづりに間違いがないことを確認しましょう。
# service network restart Shutting down interface eth0: bridge br0 does not exist! [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface eth0: [ OK ] Bringing up interface br0: [ OK ]
ブリッジが作成できたか確認するには、brctlコマンドを使います。
# brctl show bridge name bridge id STP enabled interfaces br0 8000.00304895676a no eth0
スクリプトを用意する
ゲストOSを起動する前に、qemuがコールするネットワークインターフェース起動時スクリプトを用意します。/etcディレクトリに、qemu-ifupという名前のファイルを以下の内容で作成します。
#!/bin/sh /sbin/ifconfig $1 up /usr/sbin/brctl addif br0 $1
chmodを使って実行ビットをたてておきましょう。
ゲストOSをインストールする
MINIXのインストールCD-ROMのISOファイルは、www.minix3.orgからDOWNLOADのリンクをたどっていけば最新版が見つかります。これをダウンロードしておき、ファイル名を指定します。またネットワークを使うために、qemuのコマンドラインに-netオプションを2つ加えます。
- -net nic,macaddr=xx:xx:xx:xx:xx:xx,model=e1000
物理的なネットワークカードの設定をVMに追加する。MACアドレスはLANにおいてユニークなものを指定してください。既存のホストと同じアドレスを割り当ててしまうと大変なことになります。modelはエミュレーションするネットワークカードを指定します。マニュアルによるとデフォルトはe1000なのですが、なぜかrtl8139がセレクトされてしまうので明示的に指定した方がよいようです。 - -net tap,ifname=tap0
tapはVM用のブリッジインターフェースです。ここで指定するifnameが、先ほど用意したqemu-ifupに渡され、ブリッジインターフェースと関連付けられます。
コマンドライン全体はこのようになります。
qemu-system-x86_64 vm00.img -no-kvm -m 1024 -monitor telnet::4444,server,nowait -vnc :0 -daemonize -net nic,model=e1000,macaddr=xx:xx:xx:xx:xx:xx -net tap,ifname=tap0 -cdrom minix_R3.1.6-r6084.iso -boot d
MINIXをインストールする際、KVMオプションがオンになっているとMINIXがブートしません。やむを得ず-no-kvmオプションをつけています。
CD-ROMブートに成功すれば、簡易なブートローダが起動します。loginプロンプトが出たらrootでログインします。パスワードはありません。
MINIXのセットアップスクリプトは自動起動ではないので、手動で「setup」と入力して起動します。派手なメニューはありませんが、簡易に設定できるので楽に進められると思います。特にこだわりがなければデフォルトを選択し続ければOKでしょう。
さて肝心のネットワーク設定ですが、Step8でMINIXが認識したNICの一覧が出ます。KVMの仮想NICが問題なく認識されていれば、このように表示されるはずです。
問題なければ、そのままリターンキーを押します。続いてネットワークのアドレスやDNS等の設定画面になるので、環境に合わせて指定すればOKです。
ディスクのフォーマットとファイルのコピーが終わるとsetupは終了します。最後に「shutdownしなさい」と指示が出るので、言われる通り実行します。
これでインストールは完了です。プロンプトからexitまたはoffと入力すると、VMの電源が切れてqemuも終了します。
ゲストOSを起動する
インストールが終わったらCD-ROMを外して再起動します。起動スクリプトを書き換えます。
qemu-system-x86_64 vm00.img -no-kvm -m 1024 -monitor telnet::4444,server,nowait -vnc :0 -daemonize -net nic,model=e1000,macaddr=xx:xx:xx:xx:xx:xx -net tap,ifname=tap0 -cdrom minix_R3.1.6-r6084.iso -boot d
起動したらパスワードを設定し、ping等でネットワークが設定できていることを確かめてみましょう。
ネットワークインターフェースの構成
ここまでの設定を図にまとめるとこのようになります。
ホストOS上でifconfigコマンドを使って確認してみると、以下のように表示されるでしょう。
br0 Link encap:Ethernet HWaddr 00:30:48:95:67:6A inet addr:192.168.12.46 Bcast:192.168.12.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:626872 errors:0 dropped:0 overruns:0 frame:0 TX packets:88272 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:676629398 (645.2 MiB) TX bytes:12683433 (12.0 MiB) eth0 Link encap:Ethernet HWaddr 00:30:48:95:67:6A UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1145693 errors:0 dropped:0 overruns:0 frame:0 TX packets:282468 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1236317448 (1.1 GiB) TX bytes:26194755 (24.9 MiB) Memory:ed100000-ed120000 tap0 Link encap:Ethernet HWaddr E2:FB:BE:08:CC:BA UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
br0とeth0の関係は、スイッチファブリックとポートの関係になります。ホストOS本体のネットワークはbr0を介して行われます。tap0はqemuによってゲストOSのNICに結び付けられ、これがbr0を介して外界のネットワークとブリッジされるわけです。
brctlコマンドを使うと、マッピングの状態が分ります。
# brctl show bridge name bridge id STP enabled interfaces br0 8000.00304895676a no eth0 tap0
ブリッジインターフェースは名前を変えて複数用意できます。2つ以上のNICを備えたホストの場合、それぞれのインターフェースごとに仮想ブリッジを作成して結び付け、さらにゲストOSに複数のNICを仮想的に用意して接続するなどの構成も可能です。詳しいことはqemuの-netオプションを熟読していただければと思います。一点だけ注意することは、KVMのNICはデフォルトでVLAN=0にリンクされているので、オプションをきちんと指定しないと簡単にループができてLANが破綻してしまいます。
おわりに
思いつきでMINIXをインストールしてみましたが、他のOSでもネットワーク設定を行う流れは同じですので、読み替えて実行してください。当方ではFreeBSD、Linux共に問題なくネットワーク接続できることを確認しています。
MINIXで何をするかですが、実はただインストールしてみただけで何かに使う予定はありません。gccがmakeできるようなので、コンパイル環境さえ整えれば何でも動かせるように思います。気が向いたらApacheでもインストールして、Webサーバを立ててみようかなと思います。
[…] NW設定 さて最後に肝心のNW設定を行ないます。 参考にさせて頂いたのはさくらインターネットさんのブログ。接続イメージもこちらをご参考ください。 KVMを使う(ネットワーク設定編) […]
[…] KVMを使う(ネットワーク設定編) « さくらインターネット研究所 […]
[…] さくらインターネット研究所 KVMを使う(ネットワーク設定編) […]
[…] http://research.sakura.ad.jp/2010/03/12/kvm-network/comment-page-1/ […]
[…] トを起動しましょう。ネットワークも設定できます。ここでは192.168.12.100とします。ネットワーク設定編で紹介した通り、ブリッジ経由でアクセス可能なようにしておけば、LiveMigration時に […]
[…] KVMを使う(ネットワーク設定編) « さくらインターネット研究所 […]