開始行:
#norelated
*Solaris で擬似ファイルシステムをつくろう/其の2 (FTPファ...
*目次 [#v4fc9936]
#contents
*ご注意 [#s352c217]
ここで紹介しているプログラムは、カーネルモジュールを含ん...
*概要 [#f863b7fa]
「Solaris で擬似ファイルシステムをつくろう/其の1」で作成...
リモートホストのディレクトリをマウントしてローカルファイ...
ディレクトリを share していなくても、FTP サーバが稼動して...
のであれば、リモートホストの任意のディレクトリにマウント...
ただ、残念ながら現時点ではサポートしている環境と機能がか...
&br;&br;
-2010/04/29 COLOR(RED){x86/x64 OpenSolaris(32bit/64bit) ...
(でも、マウント先へのファイルの書き込みは不可のままです)
>>
※ 現在ではユーザモードアプリでファイルシステムを作成でき...
Fuse では FTP だけでなく SSH や WebDav などのプロトコルを...
<<
*ソースファイルとダウンロード [#p0da4166]
>ソースファイル: [[iumfs-ftp.tar.gz>https://github.com/ka...
|>|CENTER:アーカイブ・ファイルに含まれるファイル|h
|iumfs.c|IUMFS ファイルシステムモジュール|
|iumfs_vnode.c|iumfs の vnode オペレーションが記述された...
|iumfs_request.c|iumfs の iumfscntlドライバとのインターフ...
|iumfs_cntl_device.c|iumfscntl 擬似デバイスドライバ|
|iumfs.conf|iumfscntl ドライバの為の driver.conf(4)ファイ...
|iumfs_devlink.tab|iumfscntl の為の devlinks(1M) テーブル...
|iumfsd.c|ユーザモードデーモン|
|iumfs.h|ヘッダーファイル|
|iumfs_mount.c|IUMFS ファイルシステム用の mount コマンド|
|Makefile.in|Makefile の雛形|
|configure.in|configure の雛形|
|configure|configure スクリプト|
|fstest.c|iumfs の機能テスト用プログラム|
|fstestd.c|iumfs の機能テスト用デーモンプログラム|
|test.sh|テストを実行するスクリプト(マウントとfstest,fst...
|install-sh| インストールスクリプト|
各ソースコードは以下からも参照いただけます。
>>
http://github.com/kaizawa/iumfs-ftp
<<
*動作確認済み Solaris バージョン [#p23d16d4]
OpenSolaris 対応の変更を行った後(2010/4/29) の iumfs ファ...
Solaris9 以前はテストしてません。Soalris 10 も sparc のみ...
|プラットフォーム&br;Solarisバージョン|Sparc&br;(32bit)|S...
|CENTER:|CENTER:|CENTER:|CENTER:|CENTER:|c
|Solaris9以前|?|?|?|?|
|Solaris10|-|○|?|?|
|OpenSolaris|-|?|○|○|
>>○:動作確認済み ×:動作不可 ?:未確認 -:該当なし&br;
*プログラムの解説 [#ta6aa97f]
この FTP ファイルシステムは2つのプログラムで構成されてい...
**IUMFS ファイルシステムモジュール [#b36c5a3a]
ファイルシステムとしての基本的な枠組みは「Solaris で擬似...
まま流用しています。&br;
ファイルの属性や内容、ディレクトリエントリなどの情報はリ...
になったため、iumfs_readdir()関数(ディレクトリエントリの...
属性情報の取得)などを変更し、後述の iumfscntl デバイスを...
ユーザモードデーモンにリクエストを行うルーチンが追加され...
また其の1ではユーザプロセスから read(2) 要求があった場合...
カーネル空間のアドレスを uiomove(9F) を使って uio 構造体...
、其の2の iumfs_read() では segmap_getmapflt() 関数を使っ...
指定領域とカーネルアドレス空間のマップを行い、このマップ...
そして、segmap_getmapflt() によってマップされたアドレスに...
オペレーション(iumfs_getpage) が新たに追加されています。
***iumfs_readdir() の変更 [#m757c267]
iumfs_readdir() は getdents(2)システムコールに対応した VN...
からの要求にしたがって、ディレクトリエントリを返す関数に...
其の1では要求されたディレクトリ自身の iumnode 構造体(フ...
リンクされている dirent_t 構造体を読み込むんでユーザプロ...
其の2でも同様にローカルのカーネルメモリ内に保持された dir...
わりませんが、要求がきた場合、まず iumfs_request_readdir(...
ホスト上のディレクトリエントリを読み込むようリクエストし...
それをユーザプロセスに返すように変更されています。
*** iumfs_getattr() の変更 [#pa24f2a3]
iumfs_getatt() は ファイルのサイズ、変更日、パーミッショ...
其の1では要求されたファイル・ディレクトリ自身の iumnode ...
リンクされている vattr_t 構造体を読み込むだけでしたが、其...
iumfscntl ドライバに対してリモートホスト上のファイルの属...
変更されています。
***iumfs_read() の変更と、iumfs_getpage() 追加 [#pa24f2a3]
其の2での一番大きな変更点は VOP_GETPAGE(ページ取得)の実...
其の1の IUMFS ファイルシステムではファイルの全内容はカー...
ユーザプロセスからの読み込み要求(read(2)システムコール)に...
iumfs_read() 関数がメモリの内容をユーザプロセスに返してい...
iumfs_read() は seg_map セグメントドライバが提供する segm...
ファイルをカーネルアドレス空間にマップすることだけを行い...
は、マップされたカーネルアドレスがアクセスされ、ページフ...
ドライバから呼ばれる GETPAGE VNODE オペレーション(iumfs_g...
iumfs_getpage() はシステムのページサイズ毎に iumfs_getapa...
呼び出し、iumfs_getapage() は iumfs_request_read() 関数を...
対してリモートホスト上のファイルデータの読み込みを行うよ...
***ページキャッシュ [#ab94a860]
其の2のファイルシステムではファイルデータの読み込みは FTP...
でファイルを読み込むことで行い、基本的にはローカルシステ...
その代わり、一回読み込んだファイルデータをカーネル空間上...
し、このページキャッシュが有効である限りは再度リモートか...
このページキャッシュという仕組みは UFS や NFS などのファ...
ディスク装置やネットワーク経由でのファイルの不要な再読み...
***iumfscntl デバイスへのリクエスト [#jed90114]
前述の iumfs_readdir, iumfs_getattr, iumfs_getapge といっ...
デバイスドライバに対して各々の VNODE オペレーションに対応...
|iumfsの関数名|対応するVNODEオペレーション|iumfscntl へ要...
|iumfs_readdir|VOP_READDIR|iumfs_request_readir|
|iumfs_getattr|VOP_GETATTR|iumfs_request_getattr|
|iumfs_lookup|VOP_LOOKUP|iumfs_request_getattr|
|iumfs_getapage|VOP_GETPAGE|iumfs_request_read|
iumfscntl デバイスへのリクエストを要求するそれぞれの関数(...
必ず以下の関数を順番どおりに呼びだすようにしており、複数...
実行されないことを保証しています。
|1|iumfs_daemon_request_enter()|リクエストの順番待ちをする|
|2|iumfs_daemon_request_start()|リクエストを投げる|
|3|iumfs_daemon_request_exit()|リクエストを終了する|
もしいずれかのリクエストがあるスレッドにて処理中であれば...
中で cv_wait_sig(9F) で待たされます。
**iumfscntl デバイスドライバ [#na7df0d0]
其の1には無かった仮想デバイス /dev/iumfscntl のデバイスド...
IUMFS ファイルシステムモジュールと iumfsd ユーザモードデ...
データ送受を行います。iumfscntl デバイスはキャラクタデバ...
サポートしています。
|オペレーション|概要|解説|h
|open|デバイスのオープン||
|close|デバイスのクローズ||
|read|デバイスからの読み込み|IUMFSファイルシステムからの...
|write|デバイスへの書き込み|iumfsd からのリクエストの実行...
|mmap|デバイスのユーザメモリ空間へのマップ|iumfsd からの...
|poll|デバイスのイベント通知|IUMFS ファイルシステムからの...
iumfscntl ドライバ自身は IUMFS ファイルシステムから渡され...
渡されたファイルデータの中身は頓着していません。ただ中継...
ちなみに、IUMFS ファイルシステムモジュールと iumfscntl デ...
同一のファイル(ハードリンク)になっていますが、カーネルに...
モジュールとして認識されます。
# modinfo |grep -i iumfs
190 7bfb9cc8 3828 24 1 iumfs (file system for iumfs)
190 7bfb9cc8 3828 148 1 iumfs (control driver for i...
**iumfd ユーザモードデーモン [#g8c4e78e]
socket(3socket) をつかって実際のリモートホストと FTP の通...
このデーモンは起動時に /dev/iumfscntl デバイスをオープン...
待ち、IUMFS ファイルシステムからファイルや属性情報の読み...
指定されたリモートホスト上のファイルデータやファイル属性...
を通じて取ってきた情報を IUMFS ファイルシステムに返します...
大雑把に言えば、FTP を使って以下の3つの VNODE オペレーシ...
|VNODE オペレーション|対応するFTP プロトコルでのコマンド|h
|readdir|NLST -a|
|read|RETR|
|getattr|NLST -dlAL|
なお、データセッションについては PASVモード(パッシブモー...
[[RFC 959:>ftp://ftp.rfc-editor.org/in-notes/rfc959.txt]]...
足りない点があるため、FTP クライアントプログラムと考えた...
***属性情報の読み込み(NLST) [#f01f44b9]
上記表の NLST コマンドで使っている「-a」や「-dlAL」といっ...
また -l で取得できるファイルの属性情報(といっても /bin/l...
依存します。現在 iumfsd が認識できる NLST -a の出力フォー...
-デバイスファイルの場合
crw-rw-rw- 1 root sys 146, 3 Feb 11 00:13 tcp6@...
crw-rw-rw- 1 root sys 146, 3 Feb 11 2005 tcp6@0...
crw-rw-rw- 1 root sys 146, 3 2月 11日 00:13 tcp6@...
crw-rw-rw- 1 root sys 146, 3 2月 11日 2005年 tcp6...
-その他のファイルの場合
-rwxr-xr-x 1 root bin 203 Dec 10 00:13 clea...
-rwxr-xr-x 1 root bin 203 Dec 10 2005 clea...
-rwxr-xr-x 1 root bin 203 12月 10日 00:13 clea...
-rwxr-xr-x 1 root bin 203 12月 10日 2005年 clea...
世には多くの GUI の FTP クライアントソフトが存在し、どの ...
はずだとおもうのですが、みなさんどのようにファイルの属性...
しょう・・単に多くのフォーマットに対応するようにしている...
実装に依存せずファイルの属性情報をとってくるコマンド等が...
私には調べきれませんでした。
'''ちなみに、NLST の「-d」オプションははディレクトリ中身...
***ファイルデータの読み込み(RETR) [#l0622e40]
ファイルデータの読み込みではファイルシステムという性質上'...
データをとってきたいところです。しかし多くの FTP サーバで...
つまり、ファイルの 100バイト目から 300バイト目までの 200 ...
を使うとファイル全体を読み込んでしまうのです。これはかな...
ですので、iumfsd デーモンでは REST コマンドを使ってまずフ...
RETR コマンドを使ってそこから必要バイト分だけ読んだ時点で...
行わないようにしています。
-ファイル「hoge」の 100 バイト目から 200 バイト読むための...
+転送開始オフセットを指定
REST 100
+パッシブモードを指示
PASV
+ファイル「hoge」の転送指示
RETR hoge
+データセッションにて 200 バイト分だけ読み込む
+ファイルの転送中止を指示
ABORT
ABORT コマンドを発行したとしても、実際の転送が終了される...
を通じて流れてきてしまうためやはり非効率なのは否めません...
だいぶ無駄は少ないと考えています。また、ファイル全体を読...
かならず 8K バイト単位でデータをとりにいきますのでパフォ...
***同時実行性 [#k7a0db92]
このデーモンはシングルプロセスかつシングルスレッドです。...
だけです。(たとえば、ホストA 上の /var/log/syslog ファイ...
IUMFS ファイルシステム自身は、複数のリモートホストのディ...
ますし、複数のユーザプロセス(cp や vi 等)が同時に多数の...
なのですが、最終的にデータをリモートホストから転送してく...
スレッドプロセスなので、例えば 1つのカーネルスレッドが IU...
read(2) を処理している最中は他のカーネルスレッドは cv_wai...
もし、連続してきたリクエストがそれぞれ別々の FTP サーバ上...
状況はさらに悪くなります。iumfsd デーモンは、異なる FTP ...
セッションの 切断 -> 接続 -> ログイン の処理を繰り返すた...
耐え難いほどのパフォーマンスの低下が予想されます・・・い...
少なくとも FTP のデータセッションのつなぎなおしが必要ない...
-3つの別々のリモート FTP サーバ上のファイルの読み込み要求...
+ホストAのファイルFILE_Aの0 バイト目から100 byte 分だけ読...
++ホストAとのFTPコントロールセッションを接続・ログイン
++REST、RETRコマンドを使ってファイルの指定オフセットから...
+ホストBのファイルFILE_Bの0 バイト目から100 byte 分だけ読...
++ホストAとのコントロールセッションを切断
++ホストBとのFTPコントロールセッションを接続・ログイン
++REST、RETRコマンドを使ってファイルの指定オフセットから...
+ホストCのファイルFILE_A の 100 バイト目から200 byte 分だ...
++ホストBとのコントロールセッションを切断
++ホストCとのFTPコントロールセッションを接続・ログイン
++REST、RETRコマンドを使ってファイルの指定オフセットから...
**IUMFS ファイルシステム用 mount コマンド [#s65b30a4]
IUMFS ファイルシステム専用の mount コマンドです。&br;
其の1とほぼ同じでものです。mount(1M) コマンドが自動的にこ...
ユーザはこの IUMFS 専用の mount コマンドの存在を意識する...
を渡し、ファイルシステムを指定すればよいだけです。 &br;
其の1 からの変更点としては、今回はマウントするリソース(...
指定する必要があるため、引数にリモートホスト名と、マウン...
するようになりました。
# mount -F iumfs -o user=root,pass=hoge ftp://srv.examp...
^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^...
オプション リソース ...
mount コマンド内では渡されたオプションやリソース部分の構...
mount(2) システムコールを通じて IUMFS ファイルシステムの ...
引数に含まれるホスト名やユーザ名などの情報自身のチェック...
iumfsd ユーザモードデーモンの中で行われます)
*インストール [#q0561d17]
**コンパイル&インストール [#re8fcf25]
configure, make 実行すると環境に応じて 64bit/32bit のファ...
コンパイル終了後、make install にてファイルのコピーと、フ...
OpenSolaris での実行例)
# ./configure
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for a BSD-compatible install... /bin/ginstall -c
checking for isainfo... yes
configure: creating ./config.status
config.status: creating Makefile
# make
gcc -c -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACK...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
-D_KERNEL -I. iumfs.c -o iumfs.o
gcc -c -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACK...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
-D_KERNEL -I. iumfs_vnode.c -o iumfs_vnode.o
gcc -c -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACK...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
-D_KERNEL -I. iumfs_cntl_device.c -o iumfs_cntl_device.o
gcc -c -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACK...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
-D_KERNEL -I. iumfs_request.c -o iumfs_request.o
ld -dn -r iumfs.o iumfs_vnode.o iumfs_cntl_device.o iumf...
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
# make install
/bin/ginstall -c -m 0644 -o root -g sys iumfs /kernel/fs...
/bin/ginstall -c -m 0644 -o root -g sys iumfs.conf /usr/...
/usr/bin/ln /kernel/fs/amd64/iumfs /usr/kernel/drv/amd64...
/usr/sbin/add_drv iumfs
/bin/ginstall -c -d -m 0755 -o root -g bin /usr/lib/fs/i...
/bin/ginstall -c -m 0755 -o root -g bin mount /usr/lib/f...
/bin/ginstall -c -d -m 0755 -o root -g bin /usr/local/bin
/bin/ginstall -c -m 0755 -o root -g bin iumfsd /usr/loca...
/usr/sbin/devfsadm -t ./iumfs_devlink.tab -i iumfs
**アンインストール [#zd68f39b]
ファイルシステムモジュールおよびコマンドのアンインストー...
もし、インストール時に利用した Makefile がすでに無い場合...
マニュアルで実行していただければ同じ結果を得られます。
# make uninstall
pkill -x iumfsd
/usr/sbin/rem_drv iumfs
rm /kernel/fs/amd64/iumfs
rm /usr/kernel/drv/amd64/iumfs
rm /usr/kernel/drv/iumfs.conf
rm /usr/lib/fs/iumfs/mount
rm -rf /usr/lib/fs/iumfs
rm -rf /usr/local/bin/iumfsd
iumfsd が動作していない場合以下のようなエラーがでますが問...
*** Error code 1 (ignored)
IUMFS ファイルシステムが利用中(マウントされている)の場...
のアンロードは失敗します。この場合システムのリブート後に...
# make uninstall
pkill -x iumfsd
*** Error code 1 (ignored)
/usr/sbin/rem_drv iumfs
Device busy
Cannot unload module: iumfs
Will be unloaded upon reboot.
rm /kernel/fs/amd64/iumfs
rm /usr/kernel/drv/amd64/iumfs
rm /usr/kernel/drv/iumfs.conf
rm /usr/lib/fs/iumfs/mount
rm -rf /usr/lib/fs/iumfs
rm -rf /usr/local/bin/iumfsd
*使い方 [#ja8cf0fb]
IUMFS ファイルシステムの利用方法についてご説明します。
**iumfsd デーモンの起動 [#j5e9cc04]
IUMFS ファイルシステムからのリクエストに従って FTP の通信...
実際にはこのデーモンの起動と、後述のファイルシステムのマ...
デーモンを起動していない状態でファイルシステムのマウント...
参照することはできません。
Usage: iumfsd [-d level]
-d level : デバッグレベル[0-3]
デバッグレベルを 1 以上にした場合、フォアグランドで実行さ...
**ファイルシステムのマウント [#i7948cdf]
IUMFS ファイルシステムのマウントには通常の mount(1M) コマ...
使い方: mount -F iumfs [-o options] ftp://host/pathname ...
ftp://host/pathname
マウントをする FTP サーバのホスト名と、サーバ上の...
ftp:// 必須
host FTP サーバ名
/pathname サーバ上のディレクトリ。「/」だけで...
-o options
IUMFS ファイルシステム専用のオプションを指定する...
user=ユーザ名 ユーザ名を指定します。デフォ...
pass=パスワード ユーザのパスワードを指定しま...
mount_point
IUMFS ファイルシステムをマウントするマウントポイ...
以下に /mnt ディレクトリに srv.example.com の上の /export...
をhoge、パスワードをheheとします。)
# /usr/sbin/mount -F iumfs -o user=hoge,pass=hehe ftp://...
#
もし、FTP サーバが anonymous アクセスを許可しているならば...
# /usr/sbin/mount -F iumfs ftp://srv.example.com/export ...
#
確認
# mount
...
...
/mnt on ftp://srv.example.com/export read only/setuid/de...
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**可能なファイル操作 [#g8e2a81e]
***ディレクトリの移動、ディレクトリエントリの参照 [#b7167...
# cd /mnt
# /bin/ls
file1 file2
***各ファイルの属性情報の参照 [#saeda8b3]
# ls -la
合計 3
drwxr-xr-x 1 root root 512 3月 19日 17:5...
drwxr-xr-x 27 root root 1024 3月 19日 23:1...
-rw-r--r-- 1 root root 54455 3月 19日 17:5...
-rw-r--r-- 1 root root 163365 3月 19日 17:5...
ファイル属性のうち、ファイルタイプ、ファイルサイズ、ファ...
あとパーミッションはオリジナルファイルの情報がそのまま反...
のオーナー情報だけはリモートホスト側の実際のオーナーに関...
***ファイルの読み込み [#ud041f82]
# head file1
This is a test file
This is a test file
This is a test file
This is a test file
This is a test file
This is a test file
This is a test file
This is a test file
This is a test file
This is a test file
#
***ファイルのコピー [#s3801688]
# cp file1 /var/tmp
#
** 不可能な操作 [#uc61e2ee]
open/read/lseek/getdent以外のファイル操作は'''ほとんどで...
其の2の IUMFS ファイルシステム上のファイルに対してこれら...
ファイルのアクセス権の変更
# chmod 777 file1
chmod: 警告: file1 を変更できません。
ファイルの更新日時を変更
# touch file1
touch: file1 の時間を変更できません。
ファイルのオーナーを変更
# chown nobody file1
chown: file1: 読み取り専用のファイルシステムです。
ファイルに書き込み
# cp /var/adm/messages file1
cp: file1 を作成できません: 読み取り専用のファイルシステ...
** ファイルシステムのアンマウント [#t4473c5e]
IUMFS ファイルシステムのアンマウントには通常の umount(1M)...
Usage: umount mount_point
mount_point : ファイルシステムがマウントされているマ...
他のファイルシステムでもおなじですが、だれかがそのファイ...
利用中の場合には BUSY が返り、umount(1M) は失敗します。
アンマウントの成功例)
# umount /mnt
#
ファイルシステムが利用中である為にアンマウントが失敗する...
# pwd
/mnt
# umount /mnt
umount: /mnt 使用中です。
*今後の課題 [#q8d2f3d7]
+FTPに加えて、HTTP や他のプロトコル経由でもリモートホスト...
+対応するシステムコールを増やす&br;
前回も増やしたいといっておきながら、逆に対応のシステムコ...
が未対応になったのはファイルシステムとしては痛手だと思っ...
++IUMFS ファイルシステムのの不具合のせいでリモートホスト...
++PUTPAGE VNODE オペレーションを実装するのが大変。&br;
という2つの理由から実装を見送っています。
+%%Solaris 9 のサポート%%&br;
さすがにもう Solaris9 はあきらめました。
終了行:
#norelated
*Solaris で擬似ファイルシステムをつくろう/其の2 (FTPファ...
*目次 [#v4fc9936]
#contents
*ご注意 [#s352c217]
ここで紹介しているプログラムは、カーネルモジュールを含ん...
*概要 [#f863b7fa]
「Solaris で擬似ファイルシステムをつくろう/其の1」で作成...
リモートホストのディレクトリをマウントしてローカルファイ...
ディレクトリを share していなくても、FTP サーバが稼動して...
のであれば、リモートホストの任意のディレクトリにマウント...
ただ、残念ながら現時点ではサポートしている環境と機能がか...
&br;&br;
-2010/04/29 COLOR(RED){x86/x64 OpenSolaris(32bit/64bit) ...
(でも、マウント先へのファイルの書き込みは不可のままです)
>>
※ 現在ではユーザモードアプリでファイルシステムを作成でき...
Fuse では FTP だけでなく SSH や WebDav などのプロトコルを...
<<
*ソースファイルとダウンロード [#p0da4166]
>ソースファイル: [[iumfs-ftp.tar.gz>https://github.com/ka...
|>|CENTER:アーカイブ・ファイルに含まれるファイル|h
|iumfs.c|IUMFS ファイルシステムモジュール|
|iumfs_vnode.c|iumfs の vnode オペレーションが記述された...
|iumfs_request.c|iumfs の iumfscntlドライバとのインターフ...
|iumfs_cntl_device.c|iumfscntl 擬似デバイスドライバ|
|iumfs.conf|iumfscntl ドライバの為の driver.conf(4)ファイ...
|iumfs_devlink.tab|iumfscntl の為の devlinks(1M) テーブル...
|iumfsd.c|ユーザモードデーモン|
|iumfs.h|ヘッダーファイル|
|iumfs_mount.c|IUMFS ファイルシステム用の mount コマンド|
|Makefile.in|Makefile の雛形|
|configure.in|configure の雛形|
|configure|configure スクリプト|
|fstest.c|iumfs の機能テスト用プログラム|
|fstestd.c|iumfs の機能テスト用デーモンプログラム|
|test.sh|テストを実行するスクリプト(マウントとfstest,fst...
|install-sh| インストールスクリプト|
各ソースコードは以下からも参照いただけます。
>>
http://github.com/kaizawa/iumfs-ftp
<<
*動作確認済み Solaris バージョン [#p23d16d4]
OpenSolaris 対応の変更を行った後(2010/4/29) の iumfs ファ...
Solaris9 以前はテストしてません。Soalris 10 も sparc のみ...
|プラットフォーム&br;Solarisバージョン|Sparc&br;(32bit)|S...
|CENTER:|CENTER:|CENTER:|CENTER:|CENTER:|c
|Solaris9以前|?|?|?|?|
|Solaris10|-|○|?|?|
|OpenSolaris|-|?|○|○|
>>○:動作確認済み ×:動作不可 ?:未確認 -:該当なし&br;
*プログラムの解説 [#ta6aa97f]
この FTP ファイルシステムは2つのプログラムで構成されてい...
**IUMFS ファイルシステムモジュール [#b36c5a3a]
ファイルシステムとしての基本的な枠組みは「Solaris で擬似...
まま流用しています。&br;
ファイルの属性や内容、ディレクトリエントリなどの情報はリ...
になったため、iumfs_readdir()関数(ディレクトリエントリの...
属性情報の取得)などを変更し、後述の iumfscntl デバイスを...
ユーザモードデーモンにリクエストを行うルーチンが追加され...
また其の1ではユーザプロセスから read(2) 要求があった場合...
カーネル空間のアドレスを uiomove(9F) を使って uio 構造体...
、其の2の iumfs_read() では segmap_getmapflt() 関数を使っ...
指定領域とカーネルアドレス空間のマップを行い、このマップ...
そして、segmap_getmapflt() によってマップされたアドレスに...
オペレーション(iumfs_getpage) が新たに追加されています。
***iumfs_readdir() の変更 [#m757c267]
iumfs_readdir() は getdents(2)システムコールに対応した VN...
からの要求にしたがって、ディレクトリエントリを返す関数に...
其の1では要求されたディレクトリ自身の iumnode 構造体(フ...
リンクされている dirent_t 構造体を読み込むんでユーザプロ...
其の2でも同様にローカルのカーネルメモリ内に保持された dir...
わりませんが、要求がきた場合、まず iumfs_request_readdir(...
ホスト上のディレクトリエントリを読み込むようリクエストし...
それをユーザプロセスに返すように変更されています。
*** iumfs_getattr() の変更 [#pa24f2a3]
iumfs_getatt() は ファイルのサイズ、変更日、パーミッショ...
其の1では要求されたファイル・ディレクトリ自身の iumnode ...
リンクされている vattr_t 構造体を読み込むだけでしたが、其...
iumfscntl ドライバに対してリモートホスト上のファイルの属...
変更されています。
***iumfs_read() の変更と、iumfs_getpage() 追加 [#pa24f2a3]
其の2での一番大きな変更点は VOP_GETPAGE(ページ取得)の実...
其の1の IUMFS ファイルシステムではファイルの全内容はカー...
ユーザプロセスからの読み込み要求(read(2)システムコール)に...
iumfs_read() 関数がメモリの内容をユーザプロセスに返してい...
iumfs_read() は seg_map セグメントドライバが提供する segm...
ファイルをカーネルアドレス空間にマップすることだけを行い...
は、マップされたカーネルアドレスがアクセスされ、ページフ...
ドライバから呼ばれる GETPAGE VNODE オペレーション(iumfs_g...
iumfs_getpage() はシステムのページサイズ毎に iumfs_getapa...
呼び出し、iumfs_getapage() は iumfs_request_read() 関数を...
対してリモートホスト上のファイルデータの読み込みを行うよ...
***ページキャッシュ [#ab94a860]
其の2のファイルシステムではファイルデータの読み込みは FTP...
でファイルを読み込むことで行い、基本的にはローカルシステ...
その代わり、一回読み込んだファイルデータをカーネル空間上...
し、このページキャッシュが有効である限りは再度リモートか...
このページキャッシュという仕組みは UFS や NFS などのファ...
ディスク装置やネットワーク経由でのファイルの不要な再読み...
***iumfscntl デバイスへのリクエスト [#jed90114]
前述の iumfs_readdir, iumfs_getattr, iumfs_getapge といっ...
デバイスドライバに対して各々の VNODE オペレーションに対応...
|iumfsの関数名|対応するVNODEオペレーション|iumfscntl へ要...
|iumfs_readdir|VOP_READDIR|iumfs_request_readir|
|iumfs_getattr|VOP_GETATTR|iumfs_request_getattr|
|iumfs_lookup|VOP_LOOKUP|iumfs_request_getattr|
|iumfs_getapage|VOP_GETPAGE|iumfs_request_read|
iumfscntl デバイスへのリクエストを要求するそれぞれの関数(...
必ず以下の関数を順番どおりに呼びだすようにしており、複数...
実行されないことを保証しています。
|1|iumfs_daemon_request_enter()|リクエストの順番待ちをする|
|2|iumfs_daemon_request_start()|リクエストを投げる|
|3|iumfs_daemon_request_exit()|リクエストを終了する|
もしいずれかのリクエストがあるスレッドにて処理中であれば...
中で cv_wait_sig(9F) で待たされます。
**iumfscntl デバイスドライバ [#na7df0d0]
其の1には無かった仮想デバイス /dev/iumfscntl のデバイスド...
IUMFS ファイルシステムモジュールと iumfsd ユーザモードデ...
データ送受を行います。iumfscntl デバイスはキャラクタデバ...
サポートしています。
|オペレーション|概要|解説|h
|open|デバイスのオープン||
|close|デバイスのクローズ||
|read|デバイスからの読み込み|IUMFSファイルシステムからの...
|write|デバイスへの書き込み|iumfsd からのリクエストの実行...
|mmap|デバイスのユーザメモリ空間へのマップ|iumfsd からの...
|poll|デバイスのイベント通知|IUMFS ファイルシステムからの...
iumfscntl ドライバ自身は IUMFS ファイルシステムから渡され...
渡されたファイルデータの中身は頓着していません。ただ中継...
ちなみに、IUMFS ファイルシステムモジュールと iumfscntl デ...
同一のファイル(ハードリンク)になっていますが、カーネルに...
モジュールとして認識されます。
# modinfo |grep -i iumfs
190 7bfb9cc8 3828 24 1 iumfs (file system for iumfs)
190 7bfb9cc8 3828 148 1 iumfs (control driver for i...
**iumfd ユーザモードデーモン [#g8c4e78e]
socket(3socket) をつかって実際のリモートホストと FTP の通...
このデーモンは起動時に /dev/iumfscntl デバイスをオープン...
待ち、IUMFS ファイルシステムからファイルや属性情報の読み...
指定されたリモートホスト上のファイルデータやファイル属性...
を通じて取ってきた情報を IUMFS ファイルシステムに返します...
大雑把に言えば、FTP を使って以下の3つの VNODE オペレーシ...
|VNODE オペレーション|対応するFTP プロトコルでのコマンド|h
|readdir|NLST -a|
|read|RETR|
|getattr|NLST -dlAL|
なお、データセッションについては PASVモード(パッシブモー...
[[RFC 959:>ftp://ftp.rfc-editor.org/in-notes/rfc959.txt]]...
足りない点があるため、FTP クライアントプログラムと考えた...
***属性情報の読み込み(NLST) [#f01f44b9]
上記表の NLST コマンドで使っている「-a」や「-dlAL」といっ...
また -l で取得できるファイルの属性情報(といっても /bin/l...
依存します。現在 iumfsd が認識できる NLST -a の出力フォー...
-デバイスファイルの場合
crw-rw-rw- 1 root sys 146, 3 Feb 11 00:13 tcp6@...
crw-rw-rw- 1 root sys 146, 3 Feb 11 2005 tcp6@0...
crw-rw-rw- 1 root sys 146, 3 2月 11日 00:13 tcp6@...
crw-rw-rw- 1 root sys 146, 3 2月 11日 2005年 tcp6...
-その他のファイルの場合
-rwxr-xr-x 1 root bin 203 Dec 10 00:13 clea...
-rwxr-xr-x 1 root bin 203 Dec 10 2005 clea...
-rwxr-xr-x 1 root bin 203 12月 10日 00:13 clea...
-rwxr-xr-x 1 root bin 203 12月 10日 2005年 clea...
世には多くの GUI の FTP クライアントソフトが存在し、どの ...
はずだとおもうのですが、みなさんどのようにファイルの属性...
しょう・・単に多くのフォーマットに対応するようにしている...
実装に依存せずファイルの属性情報をとってくるコマンド等が...
私には調べきれませんでした。
'''ちなみに、NLST の「-d」オプションははディレクトリ中身...
***ファイルデータの読み込み(RETR) [#l0622e40]
ファイルデータの読み込みではファイルシステムという性質上'...
データをとってきたいところです。しかし多くの FTP サーバで...
つまり、ファイルの 100バイト目から 300バイト目までの 200 ...
を使うとファイル全体を読み込んでしまうのです。これはかな...
ですので、iumfsd デーモンでは REST コマンドを使ってまずフ...
RETR コマンドを使ってそこから必要バイト分だけ読んだ時点で...
行わないようにしています。
-ファイル「hoge」の 100 バイト目から 200 バイト読むための...
+転送開始オフセットを指定
REST 100
+パッシブモードを指示
PASV
+ファイル「hoge」の転送指示
RETR hoge
+データセッションにて 200 バイト分だけ読み込む
+ファイルの転送中止を指示
ABORT
ABORT コマンドを発行したとしても、実際の転送が終了される...
を通じて流れてきてしまうためやはり非効率なのは否めません...
だいぶ無駄は少ないと考えています。また、ファイル全体を読...
かならず 8K バイト単位でデータをとりにいきますのでパフォ...
***同時実行性 [#k7a0db92]
このデーモンはシングルプロセスかつシングルスレッドです。...
だけです。(たとえば、ホストA 上の /var/log/syslog ファイ...
IUMFS ファイルシステム自身は、複数のリモートホストのディ...
ますし、複数のユーザプロセス(cp や vi 等)が同時に多数の...
なのですが、最終的にデータをリモートホストから転送してく...
スレッドプロセスなので、例えば 1つのカーネルスレッドが IU...
read(2) を処理している最中は他のカーネルスレッドは cv_wai...
もし、連続してきたリクエストがそれぞれ別々の FTP サーバ上...
状況はさらに悪くなります。iumfsd デーモンは、異なる FTP ...
セッションの 切断 -> 接続 -> ログイン の処理を繰り返すた...
耐え難いほどのパフォーマンスの低下が予想されます・・・い...
少なくとも FTP のデータセッションのつなぎなおしが必要ない...
-3つの別々のリモート FTP サーバ上のファイルの読み込み要求...
+ホストAのファイルFILE_Aの0 バイト目から100 byte 分だけ読...
++ホストAとのFTPコントロールセッションを接続・ログイン
++REST、RETRコマンドを使ってファイルの指定オフセットから...
+ホストBのファイルFILE_Bの0 バイト目から100 byte 分だけ読...
++ホストAとのコントロールセッションを切断
++ホストBとのFTPコントロールセッションを接続・ログイン
++REST、RETRコマンドを使ってファイルの指定オフセットから...
+ホストCのファイルFILE_A の 100 バイト目から200 byte 分だ...
++ホストBとのコントロールセッションを切断
++ホストCとのFTPコントロールセッションを接続・ログイン
++REST、RETRコマンドを使ってファイルの指定オフセットから...
**IUMFS ファイルシステム用 mount コマンド [#s65b30a4]
IUMFS ファイルシステム専用の mount コマンドです。&br;
其の1とほぼ同じでものです。mount(1M) コマンドが自動的にこ...
ユーザはこの IUMFS 専用の mount コマンドの存在を意識する...
を渡し、ファイルシステムを指定すればよいだけです。 &br;
其の1 からの変更点としては、今回はマウントするリソース(...
指定する必要があるため、引数にリモートホスト名と、マウン...
するようになりました。
# mount -F iumfs -o user=root,pass=hoge ftp://srv.examp...
^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^...
オプション リソース ...
mount コマンド内では渡されたオプションやリソース部分の構...
mount(2) システムコールを通じて IUMFS ファイルシステムの ...
引数に含まれるホスト名やユーザ名などの情報自身のチェック...
iumfsd ユーザモードデーモンの中で行われます)
*インストール [#q0561d17]
**コンパイル&インストール [#re8fcf25]
configure, make 実行すると環境に応じて 64bit/32bit のファ...
コンパイル終了後、make install にてファイルのコピーと、フ...
OpenSolaris での実行例)
# ./configure
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for a BSD-compatible install... /bin/ginstall -c
checking for isainfo... yes
configure: creating ./config.status
config.status: creating Makefile
# make
gcc -c -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACK...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
-D_KERNEL -I. iumfs.c -o iumfs.o
gcc -c -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACK...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
-D_KERNEL -I. iumfs_vnode.c -o iumfs_vnode.o
gcc -c -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACK...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
-D_KERNEL -I. iumfs_cntl_device.c -o iumfs_cntl_device.o
gcc -c -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACK...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
-D_KERNEL -I. iumfs_request.c -o iumfs_request.o
ld -dn -r iumfs.o iumfs_vnode.o iumfs_cntl_device.o iumf...
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE...
-DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSO...
# make install
/bin/ginstall -c -m 0644 -o root -g sys iumfs /kernel/fs...
/bin/ginstall -c -m 0644 -o root -g sys iumfs.conf /usr/...
/usr/bin/ln /kernel/fs/amd64/iumfs /usr/kernel/drv/amd64...
/usr/sbin/add_drv iumfs
/bin/ginstall -c -d -m 0755 -o root -g bin /usr/lib/fs/i...
/bin/ginstall -c -m 0755 -o root -g bin mount /usr/lib/f...
/bin/ginstall -c -d -m 0755 -o root -g bin /usr/local/bin
/bin/ginstall -c -m 0755 -o root -g bin iumfsd /usr/loca...
/usr/sbin/devfsadm -t ./iumfs_devlink.tab -i iumfs
**アンインストール [#zd68f39b]
ファイルシステムモジュールおよびコマンドのアンインストー...
もし、インストール時に利用した Makefile がすでに無い場合...
マニュアルで実行していただければ同じ結果を得られます。
# make uninstall
pkill -x iumfsd
/usr/sbin/rem_drv iumfs
rm /kernel/fs/amd64/iumfs
rm /usr/kernel/drv/amd64/iumfs
rm /usr/kernel/drv/iumfs.conf
rm /usr/lib/fs/iumfs/mount
rm -rf /usr/lib/fs/iumfs
rm -rf /usr/local/bin/iumfsd
iumfsd が動作していない場合以下のようなエラーがでますが問...
*** Error code 1 (ignored)
IUMFS ファイルシステムが利用中(マウントされている)の場...
のアンロードは失敗します。この場合システムのリブート後に...
# make uninstall
pkill -x iumfsd
*** Error code 1 (ignored)
/usr/sbin/rem_drv iumfs
Device busy
Cannot unload module: iumfs
Will be unloaded upon reboot.
rm /kernel/fs/amd64/iumfs
rm /usr/kernel/drv/amd64/iumfs
rm /usr/kernel/drv/iumfs.conf
rm /usr/lib/fs/iumfs/mount
rm -rf /usr/lib/fs/iumfs
rm -rf /usr/local/bin/iumfsd
*使い方 [#ja8cf0fb]
IUMFS ファイルシステムの利用方法についてご説明します。
**iumfsd デーモンの起動 [#j5e9cc04]
IUMFS ファイルシステムからのリクエストに従って FTP の通信...
実際にはこのデーモンの起動と、後述のファイルシステムのマ...
デーモンを起動していない状態でファイルシステムのマウント...
参照することはできません。
Usage: iumfsd [-d level]
-d level : デバッグレベル[0-3]
デバッグレベルを 1 以上にした場合、フォアグランドで実行さ...
**ファイルシステムのマウント [#i7948cdf]
IUMFS ファイルシステムのマウントには通常の mount(1M) コマ...
使い方: mount -F iumfs [-o options] ftp://host/pathname ...
ftp://host/pathname
マウントをする FTP サーバのホスト名と、サーバ上の...
ftp:// 必須
host FTP サーバ名
/pathname サーバ上のディレクトリ。「/」だけで...
-o options
IUMFS ファイルシステム専用のオプションを指定する...
user=ユーザ名 ユーザ名を指定します。デフォ...
pass=パスワード ユーザのパスワードを指定しま...
mount_point
IUMFS ファイルシステムをマウントするマウントポイ...
以下に /mnt ディレクトリに srv.example.com の上の /export...
をhoge、パスワードをheheとします。)
# /usr/sbin/mount -F iumfs -o user=hoge,pass=hehe ftp://...
#
もし、FTP サーバが anonymous アクセスを許可しているならば...
# /usr/sbin/mount -F iumfs ftp://srv.example.com/export ...
#
確認
# mount
...
...
/mnt on ftp://srv.example.com/export read only/setuid/de...
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**可能なファイル操作 [#g8e2a81e]
***ディレクトリの移動、ディレクトリエントリの参照 [#b7167...
# cd /mnt
# /bin/ls
file1 file2
***各ファイルの属性情報の参照 [#saeda8b3]
# ls -la
合計 3
drwxr-xr-x 1 root root 512 3月 19日 17:5...
drwxr-xr-x 27 root root 1024 3月 19日 23:1...
-rw-r--r-- 1 root root 54455 3月 19日 17:5...
-rw-r--r-- 1 root root 163365 3月 19日 17:5...
ファイル属性のうち、ファイルタイプ、ファイルサイズ、ファ...
あとパーミッションはオリジナルファイルの情報がそのまま反...
のオーナー情報だけはリモートホスト側の実際のオーナーに関...
***ファイルの読み込み [#ud041f82]
# head file1
This is a test file
This is a test file
This is a test file
This is a test file
This is a test file
This is a test file
This is a test file
This is a test file
This is a test file
This is a test file
#
***ファイルのコピー [#s3801688]
# cp file1 /var/tmp
#
** 不可能な操作 [#uc61e2ee]
open/read/lseek/getdent以外のファイル操作は'''ほとんどで...
其の2の IUMFS ファイルシステム上のファイルに対してこれら...
ファイルのアクセス権の変更
# chmod 777 file1
chmod: 警告: file1 を変更できません。
ファイルの更新日時を変更
# touch file1
touch: file1 の時間を変更できません。
ファイルのオーナーを変更
# chown nobody file1
chown: file1: 読み取り専用のファイルシステムです。
ファイルに書き込み
# cp /var/adm/messages file1
cp: file1 を作成できません: 読み取り専用のファイルシステ...
** ファイルシステムのアンマウント [#t4473c5e]
IUMFS ファイルシステムのアンマウントには通常の umount(1M)...
Usage: umount mount_point
mount_point : ファイルシステムがマウントされているマ...
他のファイルシステムでもおなじですが、だれかがそのファイ...
利用中の場合には BUSY が返り、umount(1M) は失敗します。
アンマウントの成功例)
# umount /mnt
#
ファイルシステムが利用中である為にアンマウントが失敗する...
# pwd
/mnt
# umount /mnt
umount: /mnt 使用中です。
*今後の課題 [#q8d2f3d7]
+FTPに加えて、HTTP や他のプロトコル経由でもリモートホスト...
+対応するシステムコールを増やす&br;
前回も増やしたいといっておきながら、逆に対応のシステムコ...
が未対応になったのはファイルシステムとしては痛手だと思っ...
++IUMFS ファイルシステムのの不具合のせいでリモートホスト...
++PUTPAGE VNODE オペレーションを実装するのが大変。&br;
という2つの理由から実装を見送っています。
+%%Solaris 9 のサポート%%&br;
さすがにもう Solaris9 はあきらめました。
ページ名: