cofsをサービスで使う

このページで紹介しているパッチは、coLinux-0.6.2で採用されました(参考1, 参考2)。coLinux-0.6.2を使う人は本パッチを適用する必要はありません。設定方法は本ページで紹介した方法のままです。

スナップショットcolinux-20041024で、直接(=ネットワークを介さずに)ホストPC上のディレクトリを、coLinuxからマウントするcofsが追加されました。

しかし、colinux-20041024では、cofsの設定はcolinux-daemon.exeのコマンドラインオプションからしかできません(やり方はこちらを参照)。

一方、coLinuxをWindosのサービスとして利用する場合は、coLinuxの設定はXMLファイルに記載してそれをcolinux-daemon.exeに読み込ませることで行います。

ここで困ったことなのが、コマンドラインオプションによるcoLinuxの設定と、XMLによるcoLinuxの設定は同時にできないということです。したがって、colinux-20041024ではcoLinuxをサービスとして動かすとcofsが使えないということになります。

しかし、せっかくの強力な新機能なので、なんとかサービスでも使えるようにしました。

どうするか

coLinuxをサービスとして動かし、なおかつ、cofsを使えるようにするには以下の2つの手が考えられます。

  1. cofsの設定をXMLファイルで行えるようにする
  2. サービスとして動かすときにも、コマンドラインオプションでcoLinuxの設定を行えるようにする。

いずれも、coLinux(正確にはcolinux-daemon.exe)のソースコードの修正が必要です。ここではソースを見て簡単そうだった前者を採用しました。

修正内容

ここはソースコードの中身なので興味がない人は次に進んじゃってください。

パッチ内容はごく簡単です。ソースコードをながめると、colinux/src/colinux/user/config.cがcolinux-daemon.exeにおいて設定処理(コマンドラインオプションの解析とXMLファイルの解析)を行っていることがわかりました。なので、これをいじってXMLファイルでcofsの設定を行えるようにします。

具体的には、コマンドラインオプションでcofsの設定が行われたときに処理を行っているparse_args_config_cofs関数と、
XMLファイルにblock_deviceの指定があったときに処理をするco_load_config_blockdev関数を比較して、XMLファイルにcofs_deviceの指定があったときの処理を行うco_load_config_cofs関数をでっち上げました。結局パッチは以下の様な感じです。

# Old manifest: 4d0cd0ffb40982619ae7d413d8cb9c7f08dc73ce
# New manifest: 8f4e16714629b1997331c514ccbea3aae495cb47
# Summary of changes:
# 
#   patch src/colinux/user/config.c
#    from d2058bc3f9156ca809c1a7d0b601388497616ca8
#      to e5a6df18dcdc74f5c4f85b224980d4a6f69a22fb
# 
--- src/colinux/user/config.c
+++ src/colinux/user/config.c
@@ -19,6 +19,70 @@

#include "daemon.h"

+static co_rc_t co_load_config_cofs(co_config_t *out_config, mxml_element_t *element)
+{
+    int i;
+    long index = -1;
+    char *path = "";
+    co_cofsdev_desc_t *cofs;
+    char *enabled = NULL;
+    char *type = NULL;
+    
+    for (i=0; i < element->num_attrs; i++) {
+        mxml_attr_t *attr = &element->attrs[i];
+        
+        if (strcmp(attr->name, "index") == 0)
+            index = atoi(attr->value);
+        
+        if (strcmp(attr->name, "path") == 0)
+            path = attr->value;
+        
+        if (strcmp(attr->name, "enabled") == 0)
+            enabled = attr->value;
+        
+        if (strcmp(attr->name, "type") == 0)
+            type = attr->value;
+    }
+    
+    if (index < 0) {
+        co_debug("config: invalid cofs element: bad index\n");
+        return CO_RC(ERROR);
+    }
+    
+    if (index >= CO_MODULE_MAX_COFS) {
+        co_debug("config: invalid cofs element: bad index\n");
+        return CO_RC(ERROR);
+    }
+    
+    if (path == NULL) {
+        co_debug("config: invalid cofs element: bad path\n");
+        return CO_RC(ERROR);
+    }
+    
+    if (type == NULL) {
+        co_debug("cofing: invalid cofs element: no type\n");
+        return CO_RC(ERROR);
+    }
+    
+    cofs = &out_config->cofs_devs[index];
+    
+    if        ( strcmp(type, "flat") == 0 ) {
+        cofs->type = CO_COFS_TYPE_FLAT;
+    } else if ( strcmp(type, "meta") == 0 ) {
+        cofs->type = CO_COFS_TYPE_UNIX_METADATA;
+    } else {
+        co_debug("cofing: invalid cofs element: bad type\n");
+        return CO_RC(ERROR);
+    }
+    
+    snprintf(cofs->pathname, sizeof(cofs->pathname), "%s", path);
+    cofs->enabled = enabled ? (strcmp(enabled, "true") == 0) : 0;
+    
+    co_terminal_print("mapping cofs%d to %s\n", index, cofs->pathname);
+    
+    return CO_RC(OK);
+}
+
co_rc_t co_load_config_blockdev(co_config_t *out_config, mxml_element_t *element)
{
int i;
@@ -330,7 +394,9 @@
rc = co_load_config_memory(out_config, &walk->value.element);
} else if (strcmp(name, "network") == 0) {
rc = co_load_config_network(out_config, &walk->value.element);
-     }
+     } else if (strcmp(name, "cofs_device") == 0) {
+       rc = co_load_config_cofs(out_config, &walk->value.element);
+            }

if (!CO_OK(rc))
break;

パッチ済みcolinux-daemon.exeのダウンロード

このファイルは私が勝手にビルドしたもので、当然無保証です。何が起こっても責任は取れません。ご理解の上ご利用ください。

以下に、パッチ済みのcolinux-daemon.exe(20041024)をダウンロードできるようにしておきます。自分でcolinux-daemon.exeをコンパイルしない限り、パッチファイルは不要です。

cofsの設定方法

では、cofsの設定をXMLファイルで行ってみましょう。私のパッチではcofsの設定は次のようなXMLファイルで行います(cofsの設定は5行目です)。

< ?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="Local Area Network" type="bridged"></network>
</colinux>

cofsの設定項目は次のとおりです。
(この設定方法は私が勝手に決めました。将来、XMLファイルでのcofsの設定が正式に実装されたら、ここでの指定方法と異なる可能性があります。)

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

結局、上記のXMLファイルではcolinux-daemon.exeに以下のコマンドラインオプションを指定した場合と同じになります。

kernel=vmlinux mem=128 cobd0=root.img cobd1=swap.img root=/dev/cobd0 initrd=initrd.gz eth0=pcap-bridge,"Local Area Network"

試す

では試してみましょう。まずダウンロードしたcolinux-daemon-20041024.zipを適当な解凍ソフトで解凍してください。

解凍すると、colinux-daemon.exeができますので、それを自分のcolinuxがインストールされているフォルダ(私の場合はc:\colinux)にコピーします。(もちろん安全のためオリジナルのcolinux-daemon.exeはバックアップしておきましょう)

次に、上記を参照にXMLファイルにcofsの設定を追記してください。私はmy.colinux.xmlとしました。あとはそのXMLファイルを指定して起動するだけです。

c:\colinux> colinux-daemon -c my.colinux.xml

coLinuxが起動したらcofs0をマウントしてみましょう。
以下の例ではcドライブのしたのdataフォルダをcolinuxから読み書きできるように
マウントしています。何もエラーがでなければ成功です。

# mount -t cofs cofs0:data /mnt

サービスとして利用する

これは今まで同じです。「colinux-20040710へのアプグレード」のページからコピペしておきます。

サービスの登録

コマンドプロンプトから行います。以下のコマンドを打ち込みましょう。XMLファイルはcolinux-daemon.exeと同じフォルダに置いておいて、-cの後にはフルパスではなくファイル名だけを書いた方がよさそうです。

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

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

C:\coLinux> colinux-daemon -c c:\coLinux\my.colinux.xml --install-service
Cooperative Linux Daemon, 0.6.1
Compiled on Sat May 29 16:20:11 2004

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

サービスの起動

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

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

service-0.6.1

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

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

サービスの自動起動

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

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

おしまい

簡単なパッチですが、coLinuxをサービスとして動かしていても、cofsが使えるようになったはずです。

ご利用はぐれぐれも自己責任でお願いします。

フォローする