coLinux(0.8.x)のインストール [その8]

このページでは、 cofsを使ってホストPCのファイルをcoLinuxから読めるようにします。

cofsとは

まず、cofsに関するドキュメントを見てみましょう。 colinuxをインストールしたディレクトリに cofs.txtというファイルがあります。

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

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の設定(colinux-daemonのコマンドラインオプションを使用した場合)
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
cofs31 (initrd と vmlinux-modules.tar.gz)

initrdを使用すると、cofs31は 同じディレクトリのvmlinux-dmodules.tar.gzファイル指定するために initrd.gzのパスを追加する。(?)

ユーザはcofs31を上書きすることができ、その場合はinitrdは機能せず、 モジュールはインストールされれない。

設定ファイルの修正

以前は、cofsの指定はcolinux-daemon.exeにコマンドラインで オプションを渡すことでしかできなかったのですが、 最近では設定ファイルに記述することによりできるようになっています。

以下に設定ファイルのサンプルを示します。

kernel=vmlinux
cobd0="c:\coLinux\root.img"
cobd1="c:\coLinux\swap.img"
root=/dev/cobd0
ro
initrd=initrd.gz
mem=128
eth0=tuntap
cofs0=c:\

太字の行がcofsの設定です。 現在のところ、ここで設定するのはcofsに割り当てるパスぐらいです。

ホストPCのフォルダのマウント

さて設定が終わったら、 cofsを使ってHost PCのフォルダをマウントしましょう。 マウントポイントを/mntとした場合は次のコマンドを実行します

# mount -t cofs cofs0:data /mnt

このコマンドによってCドライブ(これは設定ファイルで指定)の サブディレクトリであるdataが/mntに割り当てられます。

実行結果はmountコマンドで確認しましょう。

# mount
/dev/cobd0 on / type ext3 (rw,noatime,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
cofs0:data on /mnt type cofs (rw)

なお、設定ファイルで cofs0=c:\data\とした場合は、

# mount -t cofs cofs0 /mnt

とすることで、c:\dataをマウントすることができます。

日本語のファイル名

smbfs同様、cofsでもダメそうです。

mountの"-o"でいろいろやろうとするとエラーを吐くので、 smbfsより可能性がなさそうです。 とりあえず以下の様にするとファイル名だけは見えます。

# ls | nkf -e

smbfsとの比較

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

# aptitude install postmark
# cd /mnt
# postmark
pm>run

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

なお、 参考のNFSは、LAN上のファイルサーバ(Linux)のディレクトリを NFSでマウントした場合の測定結果です。 本当は、Host PCでNFSサーバーを動かして比較すればよかったのですが、 面倒なので省きました。

Read (KBytes/s) Write (KBytes/s)
cofs 232.87 758.80
smbfs [TAP-Win32] 232.87 758.80
smbfs [WinPCap] 93.15 303.52
ディスクイメージ 1360 4450
nfs [TAP-Win32] 18.15 59.13
nfs [WinPCap] 17.91 58.37

WinPCapを使っている場合はsmbfsよりcofsの方が早そうです。

SEO [PR] おまとめローン Windows7 冷え性対策 動画 掲示板 レンタルサーバー ライブチャット SEO