このページでは、 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-pathnameXXは0から31の数字。
マウント方法
mount -t cofs (cofs)XX(:path) (-o options) /mnt/point‘cofs’はデバイス名のプリフィックスでオプショナルである。 これはわかりやすくするために使用されている。
オプショナルのサフィックス’:path’により、 ルートの替わりマウントする内部パスを指定することができる。
‘option’はsmbfsと同じである
- gid: デフォルトのグループ
- uid: デフォルトのユーザ
- dmask: デフォルトのディレクトリパーミッション
- fmask: デフォルトのファイルパーミッション/li>
例
次のような設定を用いる。
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 0cofs31 (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 | 279.45 | 910.56 |
smbfs [TAP-Win32] | 349.31 | 1136.64 |
smbfs [WinPCap] | 127.02 | 413.89 |
ディスクイメージ | 1360 | 4450 |
nfs [TAP-Win32] | 17.69 | 57.63 |
nfs [WinPCap] | 16.83 | 54.85 |
WinPCapを使っている場合はsmbfsよりcofsの方が早そうです。
コメント