coLinux HOW TO

このエントリは2008/04/02の再掲です

Windosの豊富な商用アプリケーションを使って開発しているけれど、ターゲットマシンはUnix系のWebサーバだという状況に置かれている人は、けっこう多いのではないでしょうか。すでに運用開始しているサーバだから、開発途中のものを実サーバで動かすわけにもいかず、もちろん開発試験のためだけの追加サーバ予算もない、となったとき、一発で動くものを作らないといけないプレッシャーは胃に悪いですね。そこで、coLinuxでのLinux仮想化です。

coLinuxX11なしの仮想 LinuxをWindowsでホストするさい、おそらく最高の仮想化環境といえます。coLinuxは、ゲストOSに割いたメモリ以外の余分なメモリ消費が比較的少ないのが特徴です。カーネルと各種デーモンとttyだけが乗ればいいので、もともと割くメモリも少なくてすみます。なので、フル機能でマルチ用途な商用製品と異なり、ホストOSのデスクトップアプリケーションを邪魔しません。coLinuxを使えば、テストと開発の切り替えのたびに仮想OSをシャットダウンする必要なく、常駐させっぱなしの開発が可能になります。もちろん、追加の設備予算はゼロです。

参考 coLinux による仮想化

他の多くのブログエントリと重複するかもしれませんが、Ubuntu-7.10-serverを例に、Linuxのディスクイメージを作成する方法を紹介します。皆さんいろいろな方法でディスクイメージを作成されているのですが、いろいろ試した結果、たぶんこれが標準的な方法だろうと思われるものの手順をまとめました。

参考 Ubuntu61 - coLinux
もっとも役立ったサイト

coLinuxインストール

まずcoLinuxのインストール時に、TAPドライバがインストールされることを確認しましょう。このオプションは、仮想ネットワークアダプタを通して、 coLinuxがLANの一員になるためのものです。Slirpだけでは、ホストOS内にプライベートネットワークを作成してしまうので、他のLAN端末、および、ホストOSの通常のネットワークからcoLinuxを見ることができません。(Slirpでも、ホストOSのポート番号をゲストのサーバポートにマッピングして、ホストOSへのTCP/UDP接続を転送することが可能です。特定のポートだけ見えればいいならTAPでなくてもかまいません。詳しくはcoLinuxcolinux-daemon.txtを参照)

TAPドライバのインストールを選ぶとWindows XPから厳しい警告を受けますが、この警告は単にWindowsロゴを取得していないデバイスドライバだよと怒っているだけで、ロゴを取得したいい加減な製品より、よほど行儀よいものなので安心してください。ただし、Winows XPから見ると追加のハードウェアだと認識されるかもしれないので、WindowsXPのライセンス減点が残り少ない人は注意したほうがいいかもしれません。

インストールが完了すると、マイネットワークのプロパティに、新しいネットワークアダプタが追加されています。新しく作成されたアダプタは、TAP-Win32 Adapter V8 (coLinux) というハードウェアを使っていることになっています。区別しやすいよう、coLinuxInterfaceなどの名前をつけておきましょう。そして、

Ctrlキーを押しながら、ローカルエリアネットワークとcoLinuxInterfaceのアイコンを両方選択し、右クリックして「ブリッジ接続」を作成

します。これで、これからインストールするLinuxがあたかも独立したPCであるかのように、LANの他の端末からアクセス可能になります。

ちなみにこのTAPドライバは、 coLinuxのインストール先のnetdriverフォルダにあるプログラムで、

tapcontrol.exe remove tap0801co

として削除することもできます。再度作成する場合は、

tapcontrol.exe install OemWin2k.inf tap0801co

です。

注:IBM developerWorksにある方法、つまり「インターネット接続の共有」では、多くの場合にうまく機能しません。この方法は、PCをプライベートネットワークのゲートウェイとして使うためのものです。もしホストOSコンピュータがすでにプライベートネットワークのクライアントのひとつである場合、「インターネット接続の共有」を行おうとすると、本当のゲートウェイ(BBルータやケーブルモデムなど)と競合します。多くのオフィス/家庭LAN内では、自分のPCがすでにプライベートネットワークのクライアントのひとつになっていることが多く、ゲートウェイに見せかけて使うには向いていません。

Windows XPの場合なので、2000や2003サーバ、Vistaでどうなのかは検証していません。だれか教えてください。

ディスクイメージ作成

では、OSディスクイメージの作成です。LinuxディストリビューションのインストールCDのISOイメージから、仮想マシンのディスク(単一の巨大ファイル)にLinuxをインストールしましょう。(Ubuntu Linuxの6.06-LTSではなく7.10を選んだのは、Pythonが2.5だということと、8を待てなかったということが理由です。インストーラの日本語訳もかなりマシになってますし(^^; 8のLTSが出れば間違いなくアップグレードでしょう。)

インストールには、QEMUおよびKQEMUという別の仮想化ソフトウェアを使います。QEMUはディスプレイデバイス付きのx86エミュレータです。QEMU単体でのエミュレーションは低速ですが、KQEMUという補助サービスを使うことで、フルスペックの仮想化が可能になり、商用製品に匹敵する速度が得られます。近年の OS(HDD空間を700MB以上使う)をCDからインストールする場合、バイナリイメージのベリファイと圧縮ファイルの展開が必要で、意外とCPUリソースを使います。KQEMUがあれば、QEMU単体でインストールするより、はるかに高速で快適でした。

どのプログラムが有効なバイナリなのかわかりにくいのですが、Windowsでならこの組み合わせが適切でした。画像が大阪プロレスだろうと、間違いなくここがオフィシャルです。…のはず。

  • QEMU-Windows から qemu-*-windows.zip をダウンロード
  • KQEMU から kqemu-*.tar.gz をダウンロード

KQEMUのtar.gzを展開し、kqemu.infを右クリックして「インストール」します。このインストールは、コントロールパネルからのアンインストールに対応しているので、後で不要になったときでも安心です。単にインストールしただけではまだ機能しないので、コマンドプロンプトから

net start kqemu

を実行しておきます。

次に、インストール先となる空のディスクイメージファイルを作成します。 Program FilesのcoLinuxインストール先に、ubuntu-7.10というサブフォルダを作成し、そこで作業することにしましょう。ここでは、ルート用に3GBのqemu_rootfs_3gb、スワップ用に512MBのqemu_swap_512mbを作成します。

fsutil file createnew qemu_rootfs_3gb 3221257728
fsutil file createnew qemu_swap_512mb 201358848

QEMUのディスクイメージは、512バイトで63ブロックほど、ディスクのヘッダ領域として予約されているようです。なので、数字部分の根拠は、こういうことになります。

1024*1024*1024*3 + 63*512 (byte)
1024*1024*512 + 63*512 (byte)

ダウンロードしたインストールCD-ROMのISOイメージもC:\Program Files\coLinux\ubuntu-7.10に置いておき、こんどはQEMU-Windowsのzipの展開先で、以下を実行します。


qemu.exe -hda "C:\Program Files\coLinux\ubuntu-7.10\qemu_rootfs_3gb" -hdb "C:\Program Files\coLinux\ubuntu-7.10\qemu_swap_512mb" -cdrom "C:\Program Files\coLinux\ubuntu-7.10\ubuntu-7.10-server-i386.iso" -m 512 -boot d -kernel-kqemu -L .

↑最後にピリオドがあるので注意。

重要なのは、-kernel-kqemuです。これは、さっき起動しておいた、KQEMUを使うオプションです。指定し忘れると、圧縮ファイルの展開の頃に、かなり待たされることになるので、起動後にKQEMUが動いてないようなエラーが出ていないかを確認してインストールを開始しましょう。また、-m 512としていますが、メモリを512MBも使われたらクラッシュするよという場合は、半分程度の256でも大丈夫です。

以降の手順は、普通にCD-ROMインストールするのと変わりません。質問に答えていくだけです。ただし、パーティションは手動で設定し、ルート用には3GBのほうを、スワップ用には512MBのほうを、と、きちんと使い分けましょう。自動的にやらせてしまうと、スワップとルートを同じファイルに書いてしまいます。くれぐれも同じディスクイメージにルートとスワップを共存させないでください。もしやってしまうと、万一スワップに何かあって修復しようにも、Windowsからは「壊れた巨大な単一ファイル」にしか見えない代物になってしまいます。

インストールが完了すれば、KQEMUはもう要らないので、

net stop kqemu

で停止させておいてもかまいません。(不思議なことに、KQEMUはコントロールパネルから見えないので、コマンドで実行するしか管理できません。そのうち修正されるのかもしれませんが)

QEMU のディスクイメージからcoLinuxのイメージに変換するのは、単に先頭の512*63バイトを除去するだけです。一番楽なのは、Unixで使われるバイナリファイル変換コマンドのddを使うことです。このツールはCygwinで提供されています。Cygwinのbinにあるddを使って、

dd if=qemu_rootfs_3gb of=rootfs_3gb.img bs=512 skip=63
dd if=qemu_swap_512mb of=swap_512mb.img bs=512 skip=63

とれば、ディスクイメージは完成です。あとはこのディスクをcoLinuxに乗せて動かすだけです。

coLinux上でLinux起動

coLinux0.7あたりから、設定ファイルXMLに代わって、もっと短い記述が可能になりました。すべてのオプションをコマンドラインで指定することも可能です。ということで、いきなり動作テストするには、こうです。


colinux-daemon.exe kernel=vmlinux cobd0=ubuntu-7.10\rootfs_3gb.img cobd1=ubuntu-7.10\swap_512mb.img root=/dev/cobd0 initrd=initrd.gz mem=64 eth0=tuntap

これで、とりあえずなにか起動しました。ターミナルからENTERの入力が効いていて、ログインできればイメージ作成は成功です。インストールを日本語で行ったなら、$LANGはきっとja_JPになっていることでしょう。無駄ゼロの仮想Linux日本語環境のできあがり。おめでとうございます。

さて、毎回オプションを指定するのは面倒なので、ubuntu-7.10.confという設定ファイルをこんな感じで作成しておき、

kernel="C:\Program Files\coLinux\vmlinux"
cobd0="C:\Program Files\coLinux\ubuntu-7.10\rootfs_3gb.img"
cobd1="C:\Program Files\coLinux\ubuntu-7.10\swap_192mb.img"
cofs0="C:\"
root=/dev/cobd0
initrd="C:\Program Files\coLinux\initrd.gz"
mem=64
#eth0=slirp,00:FF:2C:46:C8:00,tcp:22:22/tcp:80:80/tcp:443:443
eth0=tuntap,"coLinuxInterface",00:FF:2C:46:C8:00

コマンドラインからは

colinux-daemon.exe @ubuntu-7.10\ubuntu-7.10.conf

とするのが良い方法です。

面白いのは、cofs0="C:\" です。これは、WindowsのCドライブを/dev/cofs0というマウント可能な外部記憶デバイスにするという機能です。ファイル権限まわりは再現できませんが、単にWindowsからファイルをコピーするだけの場合、とてもお手軽な窓口です。

もうひとつ注目したいのが、 eth0=でMACアドレスを固定している点です。これは、DHCPIPアドレスをもらうにあたって、再起動ごとに異なるMACにならないための工夫です。こうしないと、再起動のたびに毎度異なるIPアドレスになってしまい、SSHクライアントにキャッシュしたRSAIPアドレス矛盾を起こしてしまいます。いつもキーをクリアして再取得しないといけないのは面倒ですね。(かといってtelnetだと、LANのどこから侵入されているか、怖いですよ。) Sambaで撒いた名前とIPがしょっちゅう変わるのも迷惑になるかもしれません。というわけで、TAPで実用していく場合、MACアドレスはかならず固定しましょう。

ここまで動いてしまえば、あとはもうLinux管理そのものです。apt-getでもyumでも何でも、やり放題です。たぶん最初にやるのは、

sudo apt-get install ssh

で、あの使いにくくて漢字が文字化けするターミナルから、使い慣れたSSHターミナルに切り替えることでしょうね。ただ、ひとつだけ特別にやっておくことがあるとすれば、hwclockのアクセス禁止です。coLinuxはhwclockコマンドの実行ができません。ハードウェアの時計はひとつしかないのに、個別IPのOSは2つ以上、という、なんだか形而上学的な妙な具合になっているせいです。で、ふだんの操作を意識する以外に、起動時の時計操作を止めるために、/etc/default/rcS (このパスはDebian特有っぽい)に一行追加し、

HWCLOCKACCESS=no

としましょう。あとは/etc/fstabや/etc/network/interfacesの確認

しばらく初期設定をしたら、あとはもう純粋にデーモンの入れ物になっていればいい、となると、起動シーケンスを表示するためのウィンドウすら要らないですね。


colinux-daemon.exe --install-service coLinux @"C:\Program Files\coLinux\ubuntu-7.10\ubuntu-7.10.conf"

net start coLinux
...やりたいこと...
net stop coLinux


というように、Windowsのサービスとして常駐させておき、いつでも起動/停止することができます。(サービス削除は--remove-service coLinuxで)

常駐サイズは、おそらくどのデスクトップアプリケーションよりも小さく(※ FireFoxAdobe製品との比較(笑))済ませられます。一時的に大きくメモリを消費することがあっても、メモリイメージはスワップファイルに逃げてくれるので、他のアプリケーションに迷惑がかかることもありません。これこそがcoLinuxの真骨頂。LAMPを真似た環境をWindowsで構築したときの、あの煩雑さと物理メモリ消費を考えると、coLinuxの魅力がいっそう引き立つのではないでしょうか。

追記

X11なしと書きましたが、実は、どこか別のPCにXサーバが立っていれば、Xアプリケーションのクライアントになることもできます。WindowsにXmingを立てておき、

DISPLAY=*.*.*.*:0.0 xeyes (*.*.*.*はXサーバのIP)

などとすることも可能です。ただ…、GUIが欲しいなら、素直にVirtualBoxを使ったほうがいいかもしれません。(VMware PlayerよりVirtualBoxのほうがビデオとホストOS協調がよくできていました) まあ、もっと適切なのは、WubiUbuntuとWindowsのデュアルブートをする、もしくは、普通にLinuxデスクトップを準備するのがいいのですが。なにせ、gtk+やQtの大きいアプリケーションを使う場合、結局メモリもディスクも余分に消耗して、coLinuxのよさがなくなるので。

もしかしたら、それでもXmingが役立つ場合があるのかもしれないので、実際にXmingを使っている方は、教えてくだされば幸いです。