#norelated
 #navi(Solaris で擬似ファイルシステムをつくろう)
 *目次 [#ze77b5e0]
 #contents
 
 *ご注意 [#aa5317fc]
 ここで紹介しているプログラムは、カーネルモジュールを含んでいます。そのため、プログラム上に問題があった場合(可能性大)にはシステムが PANIC し、場合によってはファイルシステムに重大な障害を引き起こす可能性があります。以下のプログラムはテストプログラムで、十分な検証を行ってはいません。したがってあくまで個人の検証ためにお使いいただき、重要なシステム上では動作させないでください。本プログラムの使用により発生したトラブルなど、いかなる損害についても一切の責任を負いかねます。ご利用は自己責任にてお願いいたします。
 
 *概要 [#ld1aa9f9]
 今回は Solaris 上でマウントが可能な自作の擬似ファイルシステムを作成します。&br;
 擬似ファイルシステムとは、ハードディスクなどの実際のストレージデバイスを持たないファイルシステム
 のことで、Solaris 上では NFS、procfs、tmpfs などがあります。中でも一番身近な擬似ファイルシステムとして
 は NFS(Network File System)ではないかと思います。NFS はリモートシステムのハードディスク上のファイルを
 あたかもローカルディスクにあるよう見せ、読み込み、書き込み等の操作することができるファイルシステムで、
 擬似ファイルシステムのひとつです。(これに対して対して UFS 等のストレージデバイスを持つファイルシステムを
 ディスクファイルシステム、レギュラーファイルシステムと呼びます)&br;
 ここでご紹介する擬似ファイルシステム IUMFS も実際のストレージデバイスを持たず、このファイルシステム
 上のファイルはメモリに保持されます。そのため、システムがリブートされてしまうとこのファイルシステム
 上のファイルは全てなくなってしまいます。そういった意味では、/tmp に使われている tmpfs に近いもの
 かと思います。&br;
 現時点ではほとんど使い道の無いファイルシステムですが、今後はこれを利用して各種ネットワーク上のリソース
 をマウントしてローカルファイルのようにして利用できるファイルシステムを作成できればと考えています。
 
 *ソースファイルとダウンロード [#o62568f8]
 >ソースファイル: [[iumfs-tmpfs-0.1.tar.gz>http://github.com/downloads/kaizawa/iumfs-tmpfs/iumfs-tmpfs-0.1.tar.gz]](2010/04/29 更新 - OpenSolaris に対応しました)
 >ソースファイル: [[iumfs-tmpfs.tar.gz>https://github.com/kaizawa/iumfs-tmpfs/tarball/master]](2010/04/29 更新 - OpenSolaris に対応しました)
 
 |>|CENTER:tar ファイルに含まれるファイル|h
 |iumfs.c|IUMFS ファイルシステムモジュール|
 |iumfs_vnode.c|iumfs の vnode オペレーションが記述されたコード|
 |iumfs.h|ヘッダーファイル|
 |iumfs_mount.c|IUMFS ファイルシステム用の mount コマンド|
 |Makefile.in|Makefile の雛形|
 |configure.in|configure の雛形|
 |configure|configure スクリプト|
 |fstest.c|iumfs の機能テスト用プログラム|
 |test.sh|テストを実行するスクリプト(マウントとfstestの実行)|
 |install-sh| インストールスクリプト|
 
 各ソースコードはこちらから参照していただけます
 >>
 http://github.com/kaizawa/iumfs-tmpfs
 <<
 
 *動作確認済み Solaris バージョン [#p23d16d4]
 OpenSolaris 対応の変更を行った後(2010/4/29) の iumfs ファイルシステム の動作確認状況は以下のようになっています。~
 Solaris9 以前はテストしてません。Soalris 10 も sparc のみのテストです。
 
 |プラットフォーム&br;Solarisバージョン|Sparc&br;(32bit)|Sparc&br;(64bit)|x86|x64|h
 |CENTER:|CENTER:|CENTER:|CENTER:|CENTER:|c
 |Solaris9以前|?|?|?|?|
 |Solaris10|-|○|?|?|
 |OpenSolaris|-|?|○|○|
 >>○:動作確認済み ×:動作不可  ?:未確認  -:該当なし&br;
 
 *プログラムの解説 [#j182d8eb]
 **IUMFS ファイルシステムモジュール [#z24a7e8c]
 ***カーネルインターフェース [#yccc9687]
 Solaris 上のファイルシステムは、デバイスドライバや、STREAMS モジュールのように、ロード可能な
 カーネルモジュールとして実装されています。ローダブルなカーネルモジュールである以上、カーネル
 とのインターフェースさえ実装していれば、デバイスドライバのように後からシステムにインストール
 し、カーネルにロードすることが可能になるはずです。
 しかし問題となるのがこの「カーネルとのインターフェース」という部分なのです。&br;
 デバイスドライバや、STREAMS モジュールについては [[Sun のドキュメント>http://docs.sun.com]]に
 カーネルインターフェースが文書化されており、開発者はカーネルにロード可能なドライバ・モジュール
 に必要な要件を得ることができます。(英語しか無いですがそれでも無いよりはましです)しかし、
 ファイルシステムについてはそのインターフェースが公開されておらず、ファイルシステムとして
 どのような要件を満たさなければならないのかがまったくわかりません。&br;
 このように、ファイルシステムを自作するには厳しい状況なのですが救いの手はあります。それが
 「[[UNIX カーネルの魔法>http://www.amazon.co.jp/gp/redirect.html?ie=UTF8&location=http%3A%2F%2Fwww.amazon.co.jp%2FUNIX%25E3%2582%25AB%25E3%2583%25BC%25E3%2583%258D%25E3%2583%25AB%25E3%2581%25AE%25E9%25AD%2594%25E6%25B3%2595%25E2%2580%2595System-V%25E3%2583%25AA%25E3%2583%25AA%25E3%2583%25BC%25E3%2582%25B94%25E3%2581%25AE%25E3%2582%25A2%25E3%2583%25BC%25E3%2582%25AD%25E3%2583%2586%25E3%2582%25AF%25E3%2583%2581%25E3%2583%25A3-%25E3%2583%2590%25E3%2583%25BC%25E3%2583%258B%25E3%2583%25BC-%25E3%2582%25B0%25E3%2583%2583%25E3%2583%2589%25E3%2583%258F%25E3%2583%25BC%25E3%2583%2588%2Fdp%2F4894712156%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1222703762%26sr%3D8-1&tag=telecommunication-22&linkCode=ur2&camp=247&creative=1211]]」と「[[SOLARIS インターナル>http://www.amazon.co.jp/gp/redirect.html?ie=UTF8&location=http%3A%2F%2Fwww.amazon.co.jp%2FSolaris%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25BF%25E3%2583%25BC%25E3%2583%258A%25E3%2583%25AB%25E2%2580%2595%25E3%2582%25AB%25E3%2583%25BC%25E3%2583%258D%25E3%2583%25AB%25E6%25A7%258B%25E9%2580%25A0%25E3%2581%25AE%25E3%2581%2599%25E3%2581%25B9%25E3%2581%25A6-%25E3%2582%25B8%25E3%2583%25A0-%25E3%2583%25A2%25E3%2583%25BC%25E3%2583%25AD%2Fdp%2F4894714582%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1222703836%26sr%3D1-1&tag=telecommunication-22&linkCode=ur2&camp=247&creative=1211]]」という 2 つの書籍です。&br;
 「UNIX カーネルの魔法」は Solaris に特化したものでは無いのですが、Solaris の元にもなっている
 SVR4(System V Release 4) について説明した本で、実際のコードは書いていないものの、ファイルシステム
 の実装方法について書かれており、SVR4 システム上のファイルシステムに必要な要件(実装すべき関数や、
 その機能)について知ることができます。&br;
 「SOLARIS インターナル」は名前のとおり、Solaris のカーネルの実装について解説している本で、
 ファイルシステムを含めた実際の Solaris カーネルのコードに近い情報を知ることができます。&br;
 これ以外にも、以下に示す各種ヘッダーファイルから、カーネルからファイルシステムモジュールのへの
 エントリポイント等を推測することもできます。
 
 |sys/modctl.h|ファイルシステムモジュール用リンケージ構造体等|
 |sys/vfs.h|VFS オペレーション|
 |sys/vnode.h|VNODE オペレーション|
 
 このファイルシステムを作成しようと思い立った時は、Solaris でロード可能なファイルシステムで、
 コードが参照可能なものとしては XFS ぐらいしかなかったのですが、現在は 
 [[オープン Solaris>http://opensolaris.org]]で Solairs 10 相当のコード(実際には次期バージョン Solaris であ
 る Nevada ベースですが)を参照することができます。これは大きなアドバンテージです。&br;
 
 ***コンフィギュレーションエントリポイント [#odc7ed5c]
 [[Solaris でファイアーウォールを作ろう]]や、[[Solaris で SoftEther もどきを動かそう]]にて
 デバイスドライバや、STREAM モジュールのコードをご紹介してきましたが、ローダブルモジュールである
 ファイルシステムモジュールも、カーネルからのエントリポイントはこれらのカーネルモジュールと同様に
 _init(9E), _info(9E), _fini(9E) になります。
 
 |_init(9E)|     モジュールの初期化ルーチン|
 |_info(9E)|     モジュール情報取得ルーチン|
 |_fini(9E)|     モジュール終了処理ルーチン|
 
 カーネルが、ロードしようとしているモジュールがドライバなのか、ファイルシステムなのかを判断して
 いるのが、_init(9E) 内で mod_install(9F) に渡している modlinkage 構造体です。
 カーネルは、この modlinkage 構造体からリンクされている modlfs 構造体(システムモジュール用の
 リンケージ構造体 sys/modctl.h参照)からモジュールがファイルシステムモジュールであることがわかり、
 またそのファイルシステムモジュールでサポートされている操作を知ることができます。&br;
 
  _init() 
  { 
     int err;
     
     err = mod_install(&modlinkage);
           ^^^^^^^^^^^^^^^^^^^^^^^^^
     return (err);
  }
 
 ・・・と、ここまでの流れは Solaris 9 と Solaris 10 で同じなのですが、実はここから Solaris10 
 とそれ以前の Solaris(少なくとも Solaris 9)の実装が異なっています。正直私も最初は Solaris 9 
 上でファイルシステムを書けば、それを Solaris 10 でも動かせるだろうと思っていたのですが、
 Solaris 10 のヘッダーファイル(sys/vfs.h、sys/vnode.h)を見て愕然としました。先に書いた modlfs
 構造体が変更されていて、この構造体から参照されるデータ構造体も一新されていたのです。Solaris 10
 のヘッダーファイルのコメントを見る限り、これらの変更は、各ファイルシステムからカーネル側の
 構造体への依存性を無くし、カーネル側が変更されてもファイルシステムの再コンパイル
 が必要ないようにすることが目的のようです。(具体的には vfsops 構造体、vnode 構造体等の
 ファイルシステムからの直接の確保・開放を禁止し、カーネルが提供しているインターフェースを介して
 のみ確保・開放
 を行い、またこれらの構造体のメンバーの参照も一部に限定し、万一構造体が patch などで変更された
 場合にもファイルシステム側に影響ないようになっているようです)&br;
 以下に Solaris 9 と Solaris 10 での modlinkage 構造体からリンクされている構造体群の違いを示します。
 
 Solaris 9 の場合
   modlinkage (modlinkage 構造体)
       |
     +--- modlfs (modlfs 構造体)
              |
              +--- mod_fsops (mod_ops 構造体)
              |
              +--- iumfs_vfssw (vfssw 構造体)
 		       |
 		       +--- iumfs_init (初期化ルーチン)
 		       |
 		       +--- iumfs_vfsops (vfsops 構造体)
 			        |
 				+--- iumfs_mount(MOUNT オペレーション)
 				|
 				+--- iumfs_unmount(UMOUNT オペレーション)
 				|
 				...
 
 Solaris 10 の場合
   modlinkage (modlinkage 構造体)
       |
     +--- modlfs (modlfs 構造体)
              |
              +--- mod_fsops (mod_ops 構造体)
              |
              +--- iumfs_vfsdef (vfsdef 構造体)
 		       |
 		       +--- iumfs_init (初期化ルーチン)
 
 Solaris 9 の場合、modlfs 構造体に vfsops 構造体がメンバーとして含まれており、この vfsops 構造体
 のなかに、VFS オペレーション(mount や umount など)へのポインターがセットされています。&br;
 これに対して、Solaris 10 では modlinkage 構造体からは VFS オペレーションのポインターがリンクされて
 いません。それでは、Solaris 10 ではどうやってカーネルがこのファイルシステムの VFS オペレーション
 へのポインターを知るのでしょう?実は Solaris 10 では初期化ルーチン(IUMFS の場合 iumfs_init 関数)
 の中でvfs_setfsops() という関数に iumfs_vfs_ops_def_array という配列を渡すことによって、VFS 
 オペレーションのリストををカーネルに伝え、カーネル自身が vfsops 構造体を生成し、ファイルシステム
 側にのそのポインタを返しているのです。
 
         err = vfs_setfsops(fstype, iumfs_vfs_ops_def_array, &iumfs_vfsops);
                                    ~~~~~~~~~~~~~~~~~~~~~~~   ~~~~~~~~~~~~~
 				   カーネルに渡す VFS        カーネルが作成した
 				   オペレーションがリスト    vfsops構造体のポインタ
 				   された配列                がセットされる
 
 ここで紹介している IUMFS ファイルシステムでは 「SOL10」が define されているかどうかによってビルドする
 モジュールが Solaris 10 用か Solaris 用9 かを判断しこれらのコードが変更されるようにしています。
 
 ***VFS オペレーションと VNODE オペレーション [#fa0ce7ea]
 概要のところでお話したように、Solaris には大きく分けて「擬似ファイルシステム」と
 「ディスクファイルシステム」の2種類のファイルシステムがあり、UFS, NFS, PCFS, TMPFS, 
 PROCFS ・・などさまざまなファイルシステムが存在します。これらのファイルシステムはそれぞれ別々の
 ファイルシステムモジュールとして存在し、それぞれ独自に実装されています。&br;
 各ファイルシステム独自の実装をカーネルから隠蔽するため、VFS(仮想ファイルシステム)という
 というレイヤが設けられており、ファイルシステムへの操作はこの VFS のフレームワークを通じて行います。
 各ファイルシステムもVFS のフレームワークにのっとって、VFS のインターフェースを実装し、内部については
 独自に実装しています。たとえば、ユーザプロセスからあるファイルシステムの mount(2) 要求があった
 場合、カーネルは VFS のフレームワークを介してファイルシステム依存の mount ルーチンを呼び出します。&br;
 VFS インターフェースはファイルシステム自体を操作(mount/umount 等)するためのインターフェース
 ですが、同様にファイルシステム上に存在するファイルへの操作(open/read/write 等)にも、
 VNODE というインターフェースが存在し、各ファイルシステム独自の実装がカーネルから隠蔽されています。
 
 以下に本 IUMFS ファイルシステムが現在サポートしている VFS および VNODE のインターフェースのオペレーション
 をリストします。(比較のため、UFS でサポートしているオペレーションについても載せます。)
 
 VFS オペレーション
 |VFS オペレーション|CENTER:説明|CENTER:IUMFS|CENTER:UFS|h
 |vfs_mount|ファイルシステムをマウントする。mount(2)システムコールに対応。|○|○|
 |vfs_umount|ファイルシステムをアンマウントする。umount(2)システムコールに対応。|○|○|
 |vfs_root|ファイルシステムのルートの vnode を得る。|○|○|
 |vfs_statvfs|ファイルシステムの統計情報を得る。| |○|
 |vfs_vget|ファイルIDから vnode を得る。| |○|
 |vfs_sync|ファイルシステムをキャッシュをストレージデバイスに書き込む|○|○|
 |vfs_mountroot|システムのルートファイルシステムをマウントする。| |○|
 >○: サポート, △: 一部サポート、無印:未サポート
 
 VNODE オペレーション
 |VNODE オペレーション|CENTER:説明|CENTER:IUMFS|CENTER:UFS|h
 |vop_open|ファイルをオープンする。open(2)に対応|○|○|
 |vop_close|ファイルをクローズする。close(2)に対応|○|○|
 |vop_read|ファイルから読み込む。read(2)に対応|○|○|
 |vop_write|ファイルに書き込む。write(2)に対応|○|○|
 |vop_ioctl|ioctl処理を行う。ioctl(2)に対応| |○|
 |vop_setfl|ファイルロックを設定する| |○|
 |vop_getattr|ファイルの属性値をを得る|○|○|
 |vop_setattr|ファイルの属性値を設定する|△|○|
 |vop_access|ファイルのアクセス可能性をチェックする|△|○|
 |vop_lookup|ファイル名を検索する|○|○|
 |vop_create|ファイルを作成する。create(2) に対応|○|○|
 |vop_remove|ファイルを削除する. unlink(2) に対応|○|○|
 |vop_link|リンクを作成する。link(2) に対応| |○|
 |vop_rename|ファイル名を変更する。rename(2)に対応| |○|
 |vop_mkdir|ディレクトリを作成。mkdir(2)に対応|○|○|
 |vop_rmdir|デイレクトリを削除する。rmdir(2)に対応|○|○|
 |vop_readdir|ディレクトリエントリを読む。getdents(2)に対応||○|
 |vop_symlink|シンボリックリンクを作成する。symlink(2)に対応| |○|
 |vop_readlink|シンボリックリンクを得る。readlink(2)に対応| |○|
 |vop_fsync|キャッシュをストレージデバイスに書き込む。fsync(2)に対応|△|○|
 |vop_inactive|利用されていないvnodeの処理を行う。|○|○|
 |vop_fid|ファイルIDを得る。| |○|
 |vop_rwlock|vnode の Read/Write ロックを設定する| |○|
 |vop_rwunlock|vnode の Read/Write ロックを解除する| |○|
 |vop_seek|ファイルのシーク処理を行う。lseek(2)に対応|○|○|
 |vop_cmp|二つのvnodeの比較を行う|○|○|
 |vop_frlock|ファイルへのロック操作を行う| |○|
 |vop_space|vnode に関連する領域を開放する| |○|
 |vop_realvp|vnode が指す真のvnode を得る| |○|
 |vop_getpage|vnode に関連するページを得る| |○|
 |vop_putpage|変更されたページをストレージデバイスに書き込む| |○|
 |vop_map|ファイルをアドレス空間にマップする| |○|
 |vop_addmap|マップ数を増やす| |○|
 |vop_delmap|マップ数を減らす| |○|
 |vop_poll|ファイルのイベントの発生を待つ。poll(2)システムコールに対応| |○|
 |vop_dump|メモリデータをダンプする| |○|
 |vop_pathconf|ファイルシステムパラメータの設定を行う。pathconf(2)に対応| |?|
 |vop_pageio|スワップファイルに対するページ入出力処理を行う| |?|
 |vop_dumpctl|ダンプ処理に関するファイルシステムの処理を行う| |?|
 |vop_dispose|指定されたページをvnodeから開放する| |?|
 |vop_setsecattr|ACL の設定を行う| |○|
 |vop_getsecattr|ACL を得る| |○|
 |vop_shrlock|共有ロックの処理を行う| |?|
 >○: サポート, △: 一部サポート、無印:未サポート、?: 不明
 
 全部が必須では無いとはいえ、ファイルシステムとしてサポートすべき操作があまりにも多すぎます・・
 とても全てをサポートするファイルシステムを書くことはできないので、とりあえず「最低限」の操作を
 ができるようにすることにしました。簡単に言うと・・
 
 ''できること''
 -ファイルシステムのマウント・アンマウント
 -ファイルシステム上でファイルを作成・削除すること
 -ファイルシステム上でディレクトリを作成・削除すること
 -ファイルシステム上のファイルのオープン・クローズ
 -ファイルシステム上のファイルの読み込み・書き込み
 
 ''できないこと''
 -ファイルのメモリへのマップ(mmap)
 -ファイルシステム上のプログラムの実行
 -ページアウト
 -パーミッションによるアクセス制御(だれにでも、何でも許可されてしまう)
 -ファイルのオーナーの変更(常に root)
 -シンボリックリンクの作成
 -ACL の設定
 -などなどなど・・
 
 
 **IUMFS ファイルシステム用 mount コマンド [#l97688bf]
 
 IUMFS ファイルシステム専用の mount コマンドです。&br;
 まず一般的なお話しをすると、mount(1M) コマンド実行時に、-F オプションを使ってファイルシステムタイプを
 指定すると mount(1M) コマンドはそのファイルシステム固有の mount コマンドを探して、それを実行します。
 具体的には /usr/lib/fs/<ファイルシステムタイプ>/ というディレクトリの中から mount という名前の
 ファイルを探し、それを実行します。&br;
 mount(1M) コマンドは渡された引数をファイルシステム固有の mount コマンドに渡し、ファイル
 システム固有の mount コマンドは渡された引数を独自に解釈し、最終的には mount(2) システムコールを呼び出します。&br;
 IUMFS ファイルシステムでは、インストール時に /usr/lib/fs/iumfs/ というディレクトリを作成し、
 その中に mount という実行ファイルをコピーします。mount(1M)コマンドに -F iumfs というオプションを指定した
 場合、最終的にはこのコマンドが実行されまることになります。&br;
 ソースコードを見ていただくとわかりますが、中身は mount(2) システムコールを呼び出しているだけです。&br;
 
 iumfs_mount.c 
  main(int argc, char *argv[])
  {
     if (argc != 3){
         printf("Usage: %s -F iumfs strings mount_point\n", argv[0]);
         exit(0);
     }
     
     if ( mount(argv[1], argv[2], MS_DATA, "iumfs", NULL, 0) < 0 ){        
 	perror("mount");
         exit(0);
     }
     return(0);    
  }
 "iumfs" という文字列がファイルシステムタイプとして渡されるので、mount(2) システムコールは
 IUMFS ファイルシステムモジュール固有の VFS_MOUNT オペレーション (=iumfs_mount) を呼び出し、実際のマウント処理は
 この iumfs_mount() という関数内にて行われます。
 
 *インストール [#m6eb974b]
 **コンパイル&インストール [#p929f800]
 configure, make 実行すると環境に応じて 64bit/32bit のファイルシステムモジュールである iumfs と mount コマンドが作成されます。&br;
 コンパイル終了後、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=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" 
  -DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSOL10 -m64 -mcmodel=kernel -mno-red-zone 
  -D_KERNEL -I. iumfs.c -o iumfs.o
  gcc -c -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" 
  -DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSOL10 -m64 -mcmodel=kernel -mno-red-zone 
  -D_KERNEL -I. iumfs_vnode.c -o iumfs_vnode.o
  ld -dn -r iumfs.o iumfs_vnode.o -o iumfs
  gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" 
  -DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSOL10 -m64 iumfs_mount.c -o mount
  gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" 
  -DPACKAGE_BUGREPORT=\"\" -g -O2 -Wall -DOPENSOLARIS -DSOL10 -m64 fstest.c -o fstest
  
  # make install
  /bin/ginstall -c -m 0644 -o root -g sys iumfs /kernel/fs/amd64
  /usr/sbin/modload iumfs
  /bin/ginstall -c -d -m 0755 -o root -g bin /usr/lib/fs/iumfs
  /bin/ginstall -c -m 0755 -o root -g bin mount /usr/lib/fs/iumfs
  
 
 **アンインストール [#j86c74b9]
 
 ファイルシステムモジュールおよびコマンドのアンインストールは make uninstall で行います。
 
  # make uninstall
  /usr/sbin/modunload -i `modinfo |grep iumfs | awk '{print }'`
  rm /kernel/fs/amd64/iumfs
  rm /usr/lib/fs/iumfs/mount
  rm -rf /usr/lib/fs/iumfs
 
 IUMFS ファイルシステムが利用中(マウントされている)の場合、ファイルの削除は可能ですが、モジュール
 のアンロードは失敗します。この場合システムのリブート後に完全に削除されます。
 
  # make uninstall
  /usr/sbin/modunload -i `modinfo |grep iumfs | awk '{print }'`
  can't unload the module: Device busy
  *** Error code 16 (ignored)
  rm /kernel/fs/amd64/iumfs
  rm /usr/lib/fs/iumfs/mount
  rm -rf /usr/lib/fs/iumfs
 
 *使い方 [#j4dd0c0d]
 
 IUMFS ファイルシステムの利用方法についてご説明します。
 
 **ファイルシステムのマウント [#beb0be16]
 IUMFS ファイルシステムのマウントには通常の mount(1M) コマンドを利用します。
 
  Usage: mount -F iumfs strings mount_point
  
        strings : 任意の文字列
    mount_point : IUMFS ファイルシステムをマウントするマウントポイント
 
 strings は空白を含まなければどのような文字列でもかまいません。ただし、省略はできません。
 
 以下に /mnt ディレクトリに IUMFS ファイルシステムをマウントする例を示します。
 
  # /usr/sbin/mount -F iumfs hoge /mnt
  #
  
 確認
  
  # mount
  ...
  ...
  /mnt on hoge read/write/setuid/devices/dev=ffffffff on Thu Nov 10 00:20:14 2005
          ^^^^
 
 **ファイル・ディレクトリの作成・削除 [#p0d15888]
 
 あえて実行例を書くことも無いのですが、ファイルやディレクトリの作成・削除が行えます。もちろん、他の
 ファイルシステム上のファイルをコピーしてくることもできます。
 
 ディレクトリ情報の表示
  # cd /mnt
  # ls -lai
  合計 3
           1 drwxr-xr-x   1 root     root          64 11月 10日  00:37 .
        1514 drwxr-xr-x  26 root     root        1024 10月  9日  13:40 ..
 
 新規ファイルと新規ディレクトリの作成
  # echo "sample text" > file.txt
  # mkdir dir
  # ls -lai
  合計 4
           1 drwxr-xr-x   1 root     root         128 11月 10日  00:38 .
        1514 drwxr-xr-x  26 root     root        1024 10月  9日  13:40 ..
           4 drwxr-xr-x   1 root     root          64 11月 10日  00:38 dir
           3 -rw-r--r--   1 root     root          12 11月 10日  00:38 file.txt
 
 ファイルのオープン、読み込み
  # cat file.txt
  sample text
 
 ファイルとディレクトリの削除
  # rm file.txt
  # rm -r dir
  # ls -lia
  合計 3
          1 drwxr-xr-x   1 root     root          64 11月 10日  00:39 .
       1514 drwxr-xr-x  26 root     root        1024 10月  9日  13:40 ..
 
 他のファイルシステムからのファイルのコピー
  # cp /etc/motd /mnt
  # ls -lai
  合計 3
          1 drwxr-xr-x   1 root     root          96 11月 10日  00:48 .
       1514 drwxr-xr-x  26 root     root        1024 10月  9日  13:40 ..
          2 -rw-r--r--   1 root     root          54 11月 10日  00:48 motd
  # cat motd
  Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
 
 ** ファイルの属性変更 [#t0332e1f]
 
 touch コマンドや、chmod コマンドを使って、ファイルシステム上のファイルの更新日や、アクセス権を
 変更できます。ただし、アクセス権を変更しても実際にはアクセスの可否の判定には利用されていませんので、
 権限のない一般ユーザでもファイルに対する全ての操作が可能です。また、ファイルのオーナーの変更はサポートされていません。
 
  # cd /mnt
  # touch file.txt
  # ls -li file.txt
          3 -rw-r--r--   1 root     root           0 11月 10日  00:53 file.txt
 
 ファイルのアクセス権の変更
  # chmod 777 file.txt
  # ls -li file.txt
          3 -rwxrwxrwx   1 root     root           0 11月 10日  00:53 file.txt
 
 ファイルの更新日時を変更
  # touch file.txt
  # ls -li file.txt
          3 -rwxrwxrwx   1 root     root           0 11月 10日  00:54 file.txt
 
 ファイルのオーナーを変更
  # chown nobody file.txt
  chown: file.txt: サポートしていない操作です。
  #
 
 
 ** ファイルシステムのアンマウント [#n2844a54]
 
 IUMFS ファイルシステムのアンマウントには通常の umount(1M) コマンドを利用します。
  
  Usage: umount mount_point
  
      mount_point : ファイルシステムがマウントされているマウントポイント
 
 他のファイルシステムでもおなじですが、だれかがそのファイルシステム上のファイルを
 利用中の場合には BUSY が返り、umount(1M) は失敗します。
 
 アンマウントの成功例)
  # umount /mnt
  #
 
 ファイルシステムが利用中である為にアンマウントが失敗する例)
  # pwd
  /mnt
  # umount /mnt
  umount: /mnt 使用中です。
 
 ファイルシステムのアンマウント後は、ファイルシステム上に作成されたファイル・ディレクトリは
 自動的に削除されます。(カーネル空間内でファイルやディレクトリ用に確保されていた
 メモリの開放が行われます。)
 
 *今後の課題 [#ha3c7c3d]
 +これを応用して、ネットワーク上のリソースを利用できる擬似ファイルシステムを作る。&br;
 Linux 上ではいろいろあるみたいですが、Web や FTP サーバ上のファイルをマウントできれば
 面白いなと考えています。&br;&br;
 +対応するシステムコールを増やす&br;
 未対応のシステムコールは多いのですが、一番痛いのは mmap(2) のみ対応でしょうか・・対応
 しているものも、中途半端な実装のものが多いので(とくにアクセス制御がらみ)、それらも
 改善したいです。&br;&br;
 +%%32 bit kernel 環境のサポート%%&br;
 32bit Kernel 対応しました。OpenSolaris x86(32bit) で確認してます。
 
 #navi(Solaris で擬似ファイルシステムをつくろう)


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS