coLinux-0.6.2へのアップグレード

今までスナップショットでしたが、2005年2月5日にようやく(0.6.2)がリリースされました。

リリースノートの適当訳

とりあえず、リリースノートの和訳です。かなり適当なので間違っているかもしれません。

ちなみに、colinux-20041024のリリースノートとの違いは最後のメモリアロケーションの部分のみのようです。

Version 0.6.2
  • XMLファイルを使用する替わりにコマンドラインで全ての設定ができるようになった(UMLとの互換性に向けた活動)。doc/colinux-daemonを参照のこと。
  • LinuxパッチがLinxu 2.6.10にポーティングされた。今後、Linux 2.4.xは公式にはサポートされない。もし、古いルートイメージを使用する場合は、それを修正する必要があるかもしれない。WiKiサイト(http://www.colinux.org/wiki/)の「moving to 2.6.x」を参照のこと
  • UMLのhostfsと同じようにhost OSのディレクトリをlinuxでマウントすることを可能にするCooperative file systemドライバを実装。これにより、Sambaや他のネットワークファイルシステムを使用することなくCドライブにアクセスすることが可能になる。
    doc/cofsを参照のこと。
  • coLinuxはPAEが設定されている状態でも動作するようになり、AMD64でNXビットをenableにすること(つまりWindows XP SP2)が可能になった
  • slirp network daemonが追加された。このnetwork daemonにより、TAPドライバやPCAPライブラリを用いることなくcoLinuxから外部に通信するネットワークを容易にセットアップできるようになった。
  • initrd機能が追加された。コンフィグレーションファイルに<initrd path="…"/>を追加することによって、この機能は有効になる。または、コマンドラインオプションにinitrd=filenameオプションを指定しても良い。
  • 2KBバイト以上のサイズのネットワークパケットの送受信に関するバグを修正。
  • コンソールや他のDaemonが起動時にcolinux-daemonに接続できない問題を修正(Windowsのみ)。
  • linux.syusとvmlinuxのコンパイルに異なるバージョンのGCCコンパイラが使用されている場合にリブートを停止するバグを修正。
  • Linuxゲスト内での浮動小数点状態保護を修正。現在では、coLinuxはflops20テストプログラムをパスすることができる。
  • coLinuxをシャットダウンするときの微小なメモリリークを修正。
  • Linux portにおいて、ドライバの参照カウンタを修正。
  • ネットワークドライバ(conet)が、チェックサムを確認するようになった(PCAPによって受信されるネットワークパケットは実にひどい様だ)。
  • PCAPのハンドリングをAdapter/Device/Driver名の替わりに接続名を使用するように変更。ネットワークのNAMEオプションはPCAPとTAPで統一され、同じメーカ/デバイスが複数装着されている場合にも接続できるようになった。
  • FLTKとNTコンソールでAltGrをサポート。
  • coserial daemon(現在はLinuxのみ)を追加。これによりゲストマシンにシリアルターミナルで接続できる(/sbin/mgetty ttyS0等を実行する)
  • デバッグ機能の向上。colinux-debug-daemonと名づけられた"collector" daemonが用意され、これにより全てのcoLinuxコンポーネントからのメッセージが収集される。また、このdaemonを実行すると、動作状況が出力されるようになる(このことにより、何が何を引きおこしているのか知るのが楽になる)。デフォルトでは全てのデバッグメッセージはオフであり、こちらの方が若干動作が速くなる。
  • 正しいvmlinuxとユーザスペース実行ファイルが、正しいcoLinuxドライバと共に利用されているかどうかを確認するために、バージョンナンバーのAPIが追加された
  • alias="hda2"のようなブロックデバイスエイリアスが追加された。コンフィグレーションファイルの<block_device>要素に前述のようなエイリアスを追加することができ、coLinuxにマウントさせるようにすることができる(root=がついていても)。注意: cobdXデバイスとそれのエイリアスは排他的である。つまり、同時にその両者をマウントすることはできない。
  • Linuxゲスト用に新しいタイマを実装した。これによりtime-going-back問題が修正される。
  • メッセージパッシング処理を向上させた。これによりネットワークが若干高速化されるかもしれない。
  • Win32-TAPドライバがVersion 8.1にアップグレードされた。このバージョンはドライバのコードはまったく変更されていない。
    しかし、TAPドライバを同梱している他のプロジェクトに、複数のTAPドライバが共存(例えばOpenVPNとcoLinux)できるようにドライバの識別子が変更されたことを通知するためにリリースされた(???)。従って、coLinuxは、TAPドライバをTAPxxxxco(xxxxはドライババージョン)としてインストールするようになる。インストール後、「ネットワークとダイアルアップ接続」においてデバイス名に"(coLinux)"が追加されていることに気づくであろう。古いドライバはアンインストールするまでそのままである。
  • MACアドレスが指定されない場合は、TAPドライバと同じプリフィックス(00:FF:XX:XX:XX:XX)を用いたランダムなMACアドレスを使用するようになった。
  • coLinuxのキーボード処理の向上(スキャンコードをWindowsからlinuxからに送るようにした)。
  • メモリアロケーションを変更し、VM用のRAMを起動時ではなく、オンデマンドで確保するようになった。これは、coLinuxのロードが早くなり、ホストでのメモリ確保失敗を減少させることになる。

必要なパッケージのインストール

(この部分はcoLinux-20041024と一緒です)

最新のcoLinuxは2.6系列カーネルのみサポートしています。なので、coLinux 0.6.1を使用している人は、必要なパッケージをインストールしておきます。既に、2.6.xベースのスナップショットを使っている人にはこの項は不要だと思います。

下記のコマンドで2.6系列のカーネルが要求するパッケージを調べましょう(「-s」を忘れずに)。

# apt-get update
# apt-get -s install kernel-image-2.6.6-1-386

次に、上記のコマンドでインストールしようとしたパッケージ(もちろんkernelパッケージ以外)をインストールしましょう。私は、dash, cramfsprogs, initrd-tools, module-init-toolsをインストールしました。

# apt-get install dash cramfsprogs initrd-tools module-init-tools

ついでにパッケージをアップグレードしておきましょう(これは既にスナップショットを使っている人もやっておきましょう)。

# apt-get update
# apt-get upgrade

以前のcoLinuxのアンインストール

(この部分もcoLinux-20041024と一緒です)

まず、coLinuxを動かしている人はShutdownさせましょう。これには、coLinuxにログインしてshutdownコマンドを実行しても良いですし、coLinuxをサービスで動かしている場合は「コントロールパネル→管理ツール→サービス」の「Cooperative Linux」を右クリックして「停止」を選択しても良いです。

サービスで動かしている場合はコマンドプロンプトで以下のコマンドを打って、サービスからcoLinuxを削除しておきます。

C:\coLinux>colinux-daemon --remove-service
Cooperative Linux Daemon, 0.6.2-pre6
Compiled on Mon Nov  8 00:14:45 2004

daemon: removing service 'Cooperative Linux'
daemon: service 'Cooperative Linux' removed successfully.

次に、今まで使ってた設定ファイルのバックアップを取って起きましょう。特に、ファイル名がdefault.colinux.xmlのままの人は名前を変えておきましょう。

最後に、旧バージョンをアンインストールします。これはコントロールパネルの「アプリケーションの追加と削除」で「coLinux」を選択すればOKです。

coLinux 0.6.2のインストール

coLinux-0.6.2.exeをhttp://sourceforge.net/projects/colinux/files/からダウンロードします。

インストールしたファイルをダブルクリックするとインストーラが起動します。ここからは0.6.1と同じなのでこちらを見てください。必要な人は、WinPCapもインストールしておきましょう。

設定ファイルの作成

自分の環境に合わせて、設定ファイルを作成しましょう。標準でついてきたdefault.colinux.xmlと、バックアップしておいた自分の設定ワイルを比較しながら作成します(colinux-20041024から変更は不要のようです)。

私はとりあえず以下のようにしてみました(行頭の数字は説明のためのものです)。

3行目には自分のルートイメージ、4行目にはスワップイメージ、6行目はinitrd(起動用RAMディスクイメージ)、7行目はカーネル、8行目のメモリサイズです。ルートイメージ、スワップイメージの用意できていない方は、こっちを見て用意しましょう。

9行目はネットワークの設定です。これは以前のバージョンと一緒です。こちらの「ネットワークの設定」を見て適切なnameを指定します。

特に、以前のcoLinuxをアンインストールすると、TAPデバイスもWindowsからアンインストールされてしまいます。そして、coLinux-0.6.2のインストーラにより新たにインストールされなおします。従って、WindowsでのTAPデバイスの名前やIPアドレスなどは再度設定しなおす必要があるので注意してください。ちなみに、最近私はTAPデバイスの名前をこちらの例の「Local Area Network 1」ではなく、「TAP-Win32」としているので9行目のようになっています。

< ?xml version="1.0" encoding="UTF-8"?>
<colinux>
    <block_device index="0" path="\DosDevices\c:\coLinux\root.img" enabled="true"></block_device>
    <block_device index="1" path="\DosDevices\c:\coLinux\swap.img" enabled="true"></block_device>
    <bootparams>root=/dev/cobd0</bootparams>
    <initrd path="initrd.gz"></initrd>
    <image path="vmlinux"></image>
    <memory size="128"></memory>
    <network index="0" name="TAP-Win32" type="tap"></network>
</colinux>

動作確認

coLinuxの起動はコマンドプロンプトから行います。colinux-daemon.exeに"-c"オプションをつけて、設定ファイルを指定する必要があります。

コマンドプロンプトで以下のコマンドを入力して、coLinuxのコンソールが起動するのを確認しましょう。

C:\Documents and Settings\scratchpad>cd c:\coLinux
C:\coLinux>colinux-daemon -c my.colinux.xml

以前は、手動でモジュールを展開しておかないと、起動時にいろいろ起こられたのですが、このバージョンではinitrdがサポートされたためそんな心配はありません。下記のように起動するはずです。

console-0.6.1

ちゃんと起動したらrootでログインして下記コマンドでcoLinuxをシャットダウンしましょう。

# shutdown -h now

cofsを試す

さて、動くことを確認したら新機能であるcofsを試してみましょう。cofsとは、coLinuxからホストPCのディスクに直接アクセスするファイルシステムです。今までは、ホストPCで共有フォルダを作成し、それをsmbfs等を使ってマウントしていましたが、より直接的にファイルを共有できるようになるはずです。

cofsをサービスで使う」のページで私がでっち上げたパッチが需要があったようで本家に採用されたようです(参考1, 参考2)。colinux-devel MLに投稿していただいたOkajimaさん、ありがとうございます。まあ、次のリリースからXMLファイルでの設定はできなくなるようですが…

cofsとは

まず、cofsに関するドキュメントを見てみましょう。オフィシャルなcofsのドキュメントはhttp://sourceforge.net/projects/colinux/files/からダウンロードできるcolinux-0.6.2.tar.gzに含まれています。このファイルを展開してできたディレクトリのdoc/cofsがそのドキュメントです。

以下が例によって適当訳です。かなりわかりにくいかもしれませんが、UMLというのはUser-Mode-Linuxの略でcoLinuxのだいぶ前から開発されているLinux上でLinuxを動かす機能であることと、coLinuxにはWindows上だけでなくLinux上で動くバージョンもあることを念頭に入れて読めば分かりやすいかもしません。

このドキュメントでは、設定方法がcolinux-daemonのコマンドラインオプションで書かれていますが、このページではXMLファイルでの設定方法を説明します。

coLinuxカーネル内のcofsドライバは、fuse-1.3ライブラリとカーネルコードに貢献している人々、すなわちMiklos Szerediの成果に基づいている。

cofsは、UMLのhostfsと同じようなものであり、ホストのVFS層とLinuxのVFS層を結びつける。cofsを使うことによって、ホストOSのディレクトリをLinuxからマウントすることができる。

Flat mode (default)

Flatモードでのマウントは、vfatやsambaでマウントしたファイルシステムと同じような動作が期待できる。これは、通常のUNIXメタデータがサポートされず、UNIXアトリビュート(mode, uid, gid)は全てのファイルとディレクトリで事実上同じとなることを意味する。シンボリックやデバイスノード、パイプなどの特殊なファイルは作成できない。

UNIX meta data mode

cofsの将来のバージョンでは、hostfsと同様に、UNIX meta data modeを導入する予定である。これにより、VMのUNIXメタデータを隠しファイル(?)として保存することにより、Windows(あるいはLinux)上に真のUNIXファイルシステムを構築することができる。理論上は、ルートファイルシステムイメージがなくても、完全なLinuxシステムを起動することが可能となる。

Ports

このドキュメントが書かれた時点(2004年10月23日)では、cofsのホストサイドはWindows上でのみサポートされる。

計画中のLinux上へのポーティングでは、UMLのflat mode(UNIXアトリビュート付き)のhostfsとUNIX meta data modeのhumfsに、より似るようにデザインされる予定である。

cofsの設定
cofsXX=host-pathname

XXは0から31の数字。

マウント方法
mount -t cofs (cofs)XX(:path) (-o options) /mnt/point

‘cofs’はデバイス名のプリフィックスでオプショナルである。
これはわかりやすくするために使用されている。

オプショナルのサフィックス’:path’により、
ルートの替わりマウントする内部パスを指定することができる。

‘option’はsmbfsと同じである

  • gid: デフォルトのグループ
  • uid: デフォルトのユーザ
  • dmask: デフォルトのディレクトリパーミッション
  • fmask: デフォルトのファイルパーミッション

次のような設定を用いる。

colinux-daemon kernel=vmlinux hda1=root_fs cofs0=c:\

これはcofs0をc:\に割り当てる。

mount -t cofs 0 /mnt/windows

これc:\を/mnt/windowsとしてマウントする。

mount -t cofs cofs0 -o uid=dax,gid=dax /mnt/windows

これc:\を/mnt/windowsとしてマウントし、
daxに全てのファイルとディレクトリのフルアクセス権を与える。

mount -t cofs cofs0:Share -o uid=dax,gid=dax,dmask=0700,fmask=0700 /mnt/windows

これc:\Shareを/mnt/windowsとしてマウントし、
daxに全てのファイルとディレクトリの排他的フルアクセス権を与える。

fstabエントリの例:

cofs0:Share      /mnt/windows            cofs    defaults          0 0

cofsの設定

さて概要がわかったら試してみましょう。ここではホストPCのc:\dataをマウントしてみることにします。coLinux-0.6.2ではXMLファイルでcofsの設定ができるようになりましたので、以下の例のようにXMLファイルを修正します。もちろん5行目がcofsの設定の部分です。

< ?xml version="1.0" encoding="UTF-8"?>
<colinux>
    <block_device index="0" path="\DosDevices\c:\coLinux\root.img" enabled="true"></block_device>
    <block_device index="1" path="\DosDevices\c:\coLinux\swap.img" enabled="true"></block_device>
    <cofs_device index="0" path="\DosDevices\c:\" type="flat" enabled="true"></cofs_device>
    <bootparams>root=/dev/cobd0</bootparams>
    <initrd path="initrd.gz"></initrd>
    <image path="vmlinux"></image>
    <memory size="128"></memory>
    <network index="0" name="TAP-Win32" type="tap"></network>
</colinux>

cofsの設定項目は次のとおりです。

index=
cofsの番号です。
この例では、マウントするときにcofs0としてマウントデバイスを指定します。
path=
cofsに割り当てるWindowsのパスです。
block_deviceにならって、「\DosDevice\」に続いてデバイス名を指定してください。
この例では、cofs0をc:\に割り当てることになります。
type=
cofsのタイプです。"flat"と"meta"を指定できるのですが、
今のところ"flat"を指定してください。
enabled=
このcofsを有効にするかどうかです。falseの場合は、cofsデバイスとして利用できません。

試す

XMLファイルができたら、coLinuxを起動しましょう。無事起動したら、coLinuxで次のように入力し、cofsをマウントします。

# mount -t cofs cofs0:data /mnt

さてちょっとスピードを測ってみましょう。適当に見つけたpostmarkというパッケージで以下のように測ってみました。

# apt-get install postmark
# cd /mnt
# postmark
pm>run

結果は以下の様な感じです。「cofs」はcofsでマウントしたディレクトリ、「smbfs」はsmbfsでマウントしたディレクトリ(WinPCapでのブリッジ接続)、「ディスクイメージ」はディスクイメージ上のディレクトリ(/usr/local/test)で上記コマンドを実行した場合の測定結果です。参考のNFSは、LAN上のファイルサーバ(Linux)のディレクトリをNFSでマウントした場合の測定結果です。単位はKバイト/秒です。

cofs smbfs ディスクイメージ
Read: 155.25 23.68 1360
Write: 505.87 77.17 4450

これを見るとsmbfs(TAP-Win32での接続)よりかなり早くなってます。ホストPCとのデータのやり取りにはcofsのがずっと早そうです。ただ、2chでの書き込み等を見ていると日本語のファイル名が含まれていると、ls等ができないようです。使用する方は気をつけてください。

コマンドラインオプションを試す

coLinux-0.6.2では、設定を全てコマンドラインオプションで設定することができます。このコマンドラインオプションは、UML(User-Mode Linux)のものと近いようです。

私は、coLinuxの設定はXMLファイルで行っているのですが、コマンドラインオプションの方が主流となりそうなので一応紹介しておきます。

私の上記のXMLファイルをコマンドラインオプションに直すと次のようになります。

C:\coLinux>colinux-daemon kernel=vmlinux mem=128 cobd0=root.img cobd1=swap.img cofs0=c:\ root=/dev/cobd0 initrd=initrd.gz eth0=tuntap,"TAP-Win32"

上述の設定ファイルと比較するとどこに何を指定したらよいかわかると思います。一つ要注意なのが、ネットワークの指定です。これは以下のようになります。設定ファイルの<network … />の部分(9行目)と比較してみてください。

ethX=YYY,"ZZZZ"

  • X・・・設定ファイルのindexで指定した数値を指定する。
  • YYY・・・設定ファイルのtypeでbridgedを指定していた場合は「pcap-bridge」、tapを指定した場合は「tuntap」を指定する。
  • ZZZ・・・設定ファイルのnameで指定した文字列を""付きで指定する。

なお、coLinuxの後述のようにサービスとして起動する場合は、コマンドラインオプションを使うことができません。サービスとしてcoLinuxを使う方は、XMLファイルを利用しましょう。

coLinuxをサービスとして利用する

これはのバージョンと一緒です。ただし、サービスとして利用する場合はXMLファイルで設定情報を記述しなければいけない点に注意してくだっさい。

サービスとして利用する場合は以下の様な手順になります。

C:\Documents and Settings\scratchpad>cd c:\coLinux
C:\coLinux>colinux-daemon --install-service -c my.colinux.xml

上記のコマンドを打ち込むと以下のように表示されるはずです。

C:\coLinux>colinux-daemon --install-service -c my.colinux.xml 
Cooperative Linux Daemon, 0.6.2
Compiled on Sat Feb  5 10:19:28 2005

daemon: installing service 'Cooperative Linux'
daemon: service command line: "C:\coLinux\colinux-daemon.exe" --run-service "Coo
perative Linux" -d -c "my.colinux.xml"
daemon: setting restart options
daemon: service installed.

サービスの起動

この状態ではサービスに登録されているだけなので、起動はしていません。まだ、起動時に自動で起動するようになっていません。

そこで「コントロールパネル」→「管理ツール」→「サービス」からサービスの設定を変更します。「サービス」を開くとインストールされているサービス一覧が表示されますので、名前が「Cooperative Linux」となっている行を選択して右クリックでプロパティを選ぶと下のダイアログが表示されます。

service-20041007

このダイアログボックスの「開始ボタン」を押しましょう。これでcoLinuxがサービスとして起動します。

サービスの状態が「開始」になるので、とりあえずcoLinuxが動いたのがわかりますが、確認するにはtelnetやsshでネットワーク接続してみるか、coLinuxをインストールしたフォルダにあるcolinux-console-fltk.exeかcolinux-console-net.exeをダブルクリックすることによってコンソールを表示させることができます。

サービスの自動起動

無事にサービスとしてcoLinuxが動いているのが確認できたら、Windowsの起動時にcoLinuxが自動的に起動するようにしましょう。

これは簡単で、上記のダイアログボックスのスタートアップの種類を「自動」にすればOKです。

おしまい

以上でcoLinux-0.6.2への移行は完了です。

フォローする