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
設定ファイルの修正
以前は、cofsの指定はcolinux-daemon.exeにコマンドラインで オプションを渡すことでしかできなかったのですが、 最近では設定ファイルに記述することによりできるようになっています。
何を隠そう私がでっち上げたパッチが採用されて、 これができるようになったのです! (が、0.7.x系列になって設定ファイルの書式が変更になり、 私のパッチは不要になりましたが…)
それはさておき、以下に設定ファイルのサンプルを示します。
<?xml version="1.0" encoding="UTF-8"?> <colinux> <block_device index="0" path="\DosDevices\c:\colinux\root.img" enabled="true" /> <block_device index="1" path="\DosDevices\c:\colinux\swap.img" enabled="true" /> <cofs_device index="0" path="\DosDevices\c:\" type="flat" enabled="true" /> <bootparams>root=/dev/cobd0</bootparams> <initrd path="initrd.gz" /> <image path="vmlinux" /> <memory size="128" /> <network index="0" type="tap" /> </colinux>
太字の行がcofsの設定です。cofsの設定項目は以下の通りです。
- index=
- cofsの番号です。 この例では、 マウントするときにcofs0としてマウントデバイスを指定します。
- path=
-
cofsに割り当てるWindowsのパスです。
block_deviceにならって、
「\DosDevice\」に続いてデバイス名を指定してください。
この例では、cofs0をc:\に割り当てることになります。
なお、実際にマウントするときに さらにサブディレクトリ指定することができます。 - type=
- cofsのタイプです。 "flat"と"meta"を指定できるのですが、 今のところ"flat"を指定してください。
- enabled=
- このcofsを有効にするかどうかです。 falseの場合は、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:data on /mnt type cofs (rw)
なお、設定ファイルで path="\DosDevices\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でマウントしたディレクトリ(WinPCapでのブリッジ接続)、 「ディスクイメージ」はディスクイメージ上のディレクトリ(/usr/local/test) で上記コマンドを実行した場合の測定結果です。 単位はKバイト/秒です。
なお、 参考のNFSは、LAN上のファイルサーバ(Linux)のディレクトリを NFSでマウントした場合の測定結果です。 本当は、Host PCでNFSサーバーを動かして比較すればよかったのですが、 面倒なので省きました。
Read (KBytes/s) | Write (KBytes/s) | |
---|---|---|
cofs | 199.61 | 650.40 |
smbfs [TAP-Win32] | 232.87 | 758.80 |
smbfs [WinPCap] | 127.02 | 413.89 |
ディスクイメージ | 1360 | 4450 |
nfs [TAP-Win32] | 93.15 | 303.52 |
nfs [WinPCap] | 60.75 | 197.95 |
WinPCapを使っている場合はsmbfsよりcofsの方が早そうです。
Copyright © 2004-2008 scratchpad All rights reserved.