開始行:
#norelated
*olaris で擬似ファイルシステムをつくろう/其の1
*目次 [#ze77b5e0]
#contents
*ご注意 [#aa5317fc]
ここで紹介しているプログラムは、カーネルモジュールを含ん...
*概要 [#ld1aa9f9]
今回は Solaris 上でマウントが可能な自作の擬似ファイルシス...
擬似ファイルシステムとは、ハードディスクなどの実際のスト...
のことで、Solaris 上では NFS、procfs、tmpfs などがありま...
は NFS(Network File System)ではないかと思います。NFS は...
あたかもローカルディスクにあるよう見せ、読み込み、書き込...
擬似ファイルシステムのひとつです。(これに対して対して UF...
ディスクファイルシステム、レギュラーファイルシステムと呼...
ここでご紹介する擬似ファイルシステム IUMFS も実際のストレ...
上のファイルはメモリに保持されます。そのため、システムが...
上のファイルは全てなくなってしまいます。そういった意味で...
かと思います。&br;
現時点ではほとんど使い道の無いファイルシステムですが、今...
をマウントしてローカルファイルのようにして利用できるファ...
*ソースファイルとダウンロード [#o62568f8]
>ソースファイル: [[iumfs-tmpfs.tar.gz>https://github.com/...
|>|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)|S...
|CENTER:|CENTER:|CENTER:|CENTER:|CENTER:|c
|Solaris9以前|?|?|?|?|
|Solaris10|-|○|?|?|
|OpenSolaris|-|?|○|○|
>>○:動作確認済み ×:動作不可 ?:未確認 -:該当なし&br;
*プログラムの解説 [#j182d8eb]
**IUMFS ファイルシステムモジュール [#z24a7e8c]
***カーネルインターフェース [#yccc9687]
Solaris 上のファイルシステムは、デバイスドライバや、STREA...
カーネルモジュールとして実装されています。ローダブルなカ...
とのインターフェースさえ実装していれば、デバイスドライバ...
し、カーネルにロードすることが可能になるはずです。
しかし問題となるのがこの「カーネルとのインターフェース」...
デバイスドライバや、STREAMS モジュールについては [[Sun の...
カーネルインターフェースが文書化されており、開発者はカー...
に必要な要件を得ることができます。(英語しか無いですがそ...
ファイルシステムについてはそのインターフェースが公開され...
どのような要件を満たさなければならないのかがまったくわか...
このように、ファイルシステムを自作するには厳しい状況なの...
「[[UNIX カーネルの魔法>http://www.amazon.co.jp/gp/redire...
「UNIX カーネルの魔法」は Solaris に特化したものでは無い...
SVR4(System V Release 4) について説明した本で、実際のコー...
の実装方法について書かれており、SVR4 システム上のファイル...
その機能)について知ることができます。&br;
「SOLARIS インターナル」は名前のとおり、Solaris のカーネ...
ファイルシステムを含めた実際の Solaris カーネルのコードに...
これ以外にも、以下に示す各種ヘッダーファイルから、カーネ...
エントリポイント等を推測することもできます。
|sys/modctl.h|ファイルシステムモジュール用リンケージ構造...
|sys/vfs.h|VFS オペレーション|
|sys/vnode.h|VNODE オペレーション|
このファイルシステムを作成しようと思い立った時は、Solaris...
コードが参照可能なものとしては XFS ぐらいしかなかったので...
[[オープン Solaris>http://opensolaris.org]]で Solairs 10 ...
る Nevada ベースですが)を参照することができます。これは...
***コンフィギュレーションエントリポイント [#odc7ed5c]
[[Solaris でファイアーウォールを作ろう]]や、[[Solaris で ...
デバイスドライバや、STREAM モジュールのコードをご紹介して...
ファイルシステムモジュールも、カーネルからのエントリポイ...
_init(9E), _info(9E), _fini(9E) になります。
|_init(9E)| モジュールの初期化ルーチン|
|_info(9E)| モジュール情報取得ルーチン|
|_fini(9E)| モジュール終了処理ルーチン|
カーネルが、ロードしようとしているモジュールがドライバな...
いるのが、_init(9E) 内で mod_install(9F) に渡している mod...
カーネルは、この modlinkage 構造体からリンクされている m...
リンケージ構造体 sys/modctl.h参照)からモジュールがファイ...
またそのファイルシステムモジュールでサポートされている操...
_init()
{
int err;
err = mod_install(&modlinkage);
^^^^^^^^^^^^^^^^^^^^^^^^^
return (err);
}
・・・と、ここまでの流れは Solaris 9 と Solaris 10 で同じ...
とそれ以前の Solaris(少なくとも Solaris 9)の実装が異な...
上でファイルシステムを書けば、それを Solaris 10 でも動か...
Solaris 10 のヘッダーファイル(sys/vfs.h、sys/vnode.h)を...
構造体が変更されていて、この構造体から参照されるデータ構...
のヘッダーファイルのコメントを見る限り、これらの変更は、...
構造体への依存性を無くし、カーネル側が変更されてもファイ...
が必要ないようにすることが目的のようです。(具体的には vf...
ファイルシステムからの直接の確保・開放を禁止し、カーネル...
のみ確保・開放
を行い、またこれらの構造体のメンバーの参照も一部に限定し...
場合にもファイルシステム側に影響ないようになっているよう...
以下に 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 構造体がメンバー...
のなかに、VFS オペレーション(mount や umount など)へのポ...
これに対して、Solaris 10 では modlinkage 構造体からは VFS...
いません。それでは、Solaris 10 ではどうやってカーネルがこ...
へのポインターを知るのでしょう?実は Solaris 10 では初期...
の中でvfs_setfsops() という関数に iumfs_vfs_ops_def_array...
オペレーションのリストををカーネルに伝え、カーネル自身が ...
側にのそのポインタを返しているのです。
err = vfs_setfsops(fstype, iumfs_vfs_ops_def_arra...
~~~~~~~~~~~~~~~~~~~~~~...
カーネルに渡す VFS カーネルが作成した
オペレーションがリスト vfsops構造体のポインタ
された配列 がセットされる
ここで紹介している IUMFS ファイルシステムでは 「SOL10」が...
モジュールが Solaris 10 用か Solaris 用9 かを判断しこれら...
***VFS オペレーションと VNODE オペレーション [#fa0ce7ea]
概要のところでお話したように、Solaris には大きく分けて「...
「ディスクファイルシステム」の2種類のファイルシステムがあ...
PROCFS ・・などさまざまなファイルシステムが存在します。こ...
ファイルシステムモジュールとして存在し、それぞれ独自に実...
各ファイルシステム独自の実装をカーネルから隠蔽するため、V...
というレイヤが設けられており、ファイルシステムへの操作は...
各ファイルシステムもVFS のフレームワークにのっとって、VFS...
独自に実装しています。たとえば、ユーザプロセスからあるフ...
場合、カーネルは VFS のフレームワークを介してファイルシス...
VFS インターフェースはファイルシステム自体を操作(mount/u...
ですが、同様にファイルシステム上に存在するファイルへの操...
VNODE というインターフェースが存在し、各ファイルシステム...
以下に本 IUMFS ファイルシステムが現在サポートしている VFS...
をリストします。(比較のため、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|キャッシュをストレージデバイスに書き込む。fsyn...
|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|ファイルシステムパラメータの設定を行う。pat...
|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) コマンド実行時に、-...
指定すると mount(1M) コマンドはそのファイルシステム固有の...
具体的には /usr/lib/fs/<ファイルシステムタイプ>/ というデ...
ファイルを探し、それを実行します。&br;
mount(1M) コマンドは渡された引数をファイルシステム固有の ...
システム固有の mount コマンドは渡された引数を独自に解釈し...
IUMFS ファイルシステムでは、インストール時に /usr/lib/fs/...
その中に mount という実行ファイルをコピーします。mount(1M...
場合、最終的にはこのコマンドが実行されまることになります...
ソースコードを見ていただくとわかりますが、中身は mount(2)...
iumfs_mount.c
main(int argc, char *argv[])
{
if (argc != 3){
printf("Usage: %s -F iumfs strings mount_point\n"...
exit(0);
}
if ( mount(argv[1], argv[2], MS_DATA, "iumfs", NULL, ...
perror("mount");
exit(0);
}
return(0);
}
"iumfs" という文字列がファイルシステムタイプとして渡され...
IUMFS ファイルシステムモジュール固有の VFS_MOUNT オペレー...
この iumfs_mount() という関数内にて行われます。
*インストール [#m6eb974b]
**コンパイル&インストール [#p929f800]
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
ld -dn -r iumfs.o iumfs_vnode.o -o iumfs
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...
/usr/sbin/modload 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...
**アンインストール [#j86c74b9]
ファイルシステムモジュールおよびコマンドのアンインストー...
# make uninstall
/usr/sbin/modunload -i `modinfo |grep iumfs | awk '{prin...
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 '{prin...
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 T...
^^^^
**ファイル・ディレクトリの作成・削除 [#p0d15888]
あえて実行例を書くことも無いのですが、ファイルやディレク...
ファイルシステム上のファイルをコピーしてくることもできま...
ディレクトリ情報の表示
# cd /mnt
# ls -lai
合計 3
1 drwxr-xr-x 1 root root 64 11月...
1514 drwxr-xr-x 26 root root 1024 10月...
新規ファイルと新規ディレクトリの作成
# echo "sample text" > file.txt
# mkdir dir
# ls -lai
合計 4
1 drwxr-xr-x 1 root root 128 11月...
1514 drwxr-xr-x 26 root root 1024 10月...
4 drwxr-xr-x 1 root root 64 11月...
3 -rw-r--r-- 1 root root 12 11月...
ファイルのオープン、読み込み
# cat file.txt
sample text
ファイルとディレクトリの削除
# rm file.txt
# rm -r dir
# ls -lia
合計 3
1 drwxr-xr-x 1 root root 64 11月 ...
1514 drwxr-xr-x 26 root root 1024 10月 ...
他のファイルシステムからのファイルのコピー
# cp /etc/motd /mnt
# ls -lai
合計 3
1 drwxr-xr-x 1 root root 96 11月 ...
1514 drwxr-xr-x 26 root root 1024 10月 ...
2 -rw-r--r-- 1 root root 54 11月 ...
# cat motd
Sun Microsystems Inc. SunOS 5.10 Generic January ...
** ファイルの属性変更 [#t0332e1f]
touch コマンドや、chmod コマンドを使って、ファイルシステ...
変更できます。ただし、アクセス権を変更しても実際にはアク...
権限のない一般ユーザでもファイルに対する全ての操作が可能...
# cd /mnt
# touch file.txt
# ls -li file.txt
3 -rw-r--r-- 1 root root 0 11月 ...
ファイルのアクセス権の変更
# chmod 777 file.txt
# ls -li file.txt
3 -rwxrwxrwx 1 root root 0 11月 ...
ファイルの更新日時を変更
# touch file.txt
# ls -li file.txt
3 -rwxrwxrwx 1 root root 0 11月 ...
ファイルのオーナーを変更
# 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]
+これを応用して、ネットワーク上のリソースを利用できる擬似...
Linux 上ではいろいろあるみたいですが、Web や FTP サーバ上...
面白いなと考えています。&br;&br;
+対応するシステムコールを増やす&br;
未対応のシステムコールは多いのですが、一番痛いのは mmap(2...
しているものも、中途半端な実装のものが多いので(とくにア...
改善したいです。&br;&br;
+%%32 bit kernel 環境のサポート%%&br;
32bit Kernel 対応しました。OpenSolaris x86(32bit) で確認...
終了行:
#norelated
*olaris で擬似ファイルシステムをつくろう/其の1
*目次 [#ze77b5e0]
#contents
*ご注意 [#aa5317fc]
ここで紹介しているプログラムは、カーネルモジュールを含ん...
*概要 [#ld1aa9f9]
今回は Solaris 上でマウントが可能な自作の擬似ファイルシス...
擬似ファイルシステムとは、ハードディスクなどの実際のスト...
のことで、Solaris 上では NFS、procfs、tmpfs などがありま...
は NFS(Network File System)ではないかと思います。NFS は...
あたかもローカルディスクにあるよう見せ、読み込み、書き込...
擬似ファイルシステムのひとつです。(これに対して対して UF...
ディスクファイルシステム、レギュラーファイルシステムと呼...
ここでご紹介する擬似ファイルシステム IUMFS も実際のストレ...
上のファイルはメモリに保持されます。そのため、システムが...
上のファイルは全てなくなってしまいます。そういった意味で...
かと思います。&br;
現時点ではほとんど使い道の無いファイルシステムですが、今...
をマウントしてローカルファイルのようにして利用できるファ...
*ソースファイルとダウンロード [#o62568f8]
>ソースファイル: [[iumfs-tmpfs.tar.gz>https://github.com/...
|>|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)|S...
|CENTER:|CENTER:|CENTER:|CENTER:|CENTER:|c
|Solaris9以前|?|?|?|?|
|Solaris10|-|○|?|?|
|OpenSolaris|-|?|○|○|
>>○:動作確認済み ×:動作不可 ?:未確認 -:該当なし&br;
*プログラムの解説 [#j182d8eb]
**IUMFS ファイルシステムモジュール [#z24a7e8c]
***カーネルインターフェース [#yccc9687]
Solaris 上のファイルシステムは、デバイスドライバや、STREA...
カーネルモジュールとして実装されています。ローダブルなカ...
とのインターフェースさえ実装していれば、デバイスドライバ...
し、カーネルにロードすることが可能になるはずです。
しかし問題となるのがこの「カーネルとのインターフェース」...
デバイスドライバや、STREAMS モジュールについては [[Sun の...
カーネルインターフェースが文書化されており、開発者はカー...
に必要な要件を得ることができます。(英語しか無いですがそ...
ファイルシステムについてはそのインターフェースが公開され...
どのような要件を満たさなければならないのかがまったくわか...
このように、ファイルシステムを自作するには厳しい状況なの...
「[[UNIX カーネルの魔法>http://www.amazon.co.jp/gp/redire...
「UNIX カーネルの魔法」は Solaris に特化したものでは無い...
SVR4(System V Release 4) について説明した本で、実際のコー...
の実装方法について書かれており、SVR4 システム上のファイル...
その機能)について知ることができます。&br;
「SOLARIS インターナル」は名前のとおり、Solaris のカーネ...
ファイルシステムを含めた実際の Solaris カーネルのコードに...
これ以外にも、以下に示す各種ヘッダーファイルから、カーネ...
エントリポイント等を推測することもできます。
|sys/modctl.h|ファイルシステムモジュール用リンケージ構造...
|sys/vfs.h|VFS オペレーション|
|sys/vnode.h|VNODE オペレーション|
このファイルシステムを作成しようと思い立った時は、Solaris...
コードが参照可能なものとしては XFS ぐらいしかなかったので...
[[オープン Solaris>http://opensolaris.org]]で Solairs 10 ...
る Nevada ベースですが)を参照することができます。これは...
***コンフィギュレーションエントリポイント [#odc7ed5c]
[[Solaris でファイアーウォールを作ろう]]や、[[Solaris で ...
デバイスドライバや、STREAM モジュールのコードをご紹介して...
ファイルシステムモジュールも、カーネルからのエントリポイ...
_init(9E), _info(9E), _fini(9E) になります。
|_init(9E)| モジュールの初期化ルーチン|
|_info(9E)| モジュール情報取得ルーチン|
|_fini(9E)| モジュール終了処理ルーチン|
カーネルが、ロードしようとしているモジュールがドライバな...
いるのが、_init(9E) 内で mod_install(9F) に渡している mod...
カーネルは、この modlinkage 構造体からリンクされている m...
リンケージ構造体 sys/modctl.h参照)からモジュールがファイ...
またそのファイルシステムモジュールでサポートされている操...
_init()
{
int err;
err = mod_install(&modlinkage);
^^^^^^^^^^^^^^^^^^^^^^^^^
return (err);
}
・・・と、ここまでの流れは Solaris 9 と Solaris 10 で同じ...
とそれ以前の Solaris(少なくとも Solaris 9)の実装が異な...
上でファイルシステムを書けば、それを Solaris 10 でも動か...
Solaris 10 のヘッダーファイル(sys/vfs.h、sys/vnode.h)を...
構造体が変更されていて、この構造体から参照されるデータ構...
のヘッダーファイルのコメントを見る限り、これらの変更は、...
構造体への依存性を無くし、カーネル側が変更されてもファイ...
が必要ないようにすることが目的のようです。(具体的には vf...
ファイルシステムからの直接の確保・開放を禁止し、カーネル...
のみ確保・開放
を行い、またこれらの構造体のメンバーの参照も一部に限定し...
場合にもファイルシステム側に影響ないようになっているよう...
以下に 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 構造体がメンバー...
のなかに、VFS オペレーション(mount や umount など)へのポ...
これに対して、Solaris 10 では modlinkage 構造体からは VFS...
いません。それでは、Solaris 10 ではどうやってカーネルがこ...
へのポインターを知るのでしょう?実は Solaris 10 では初期...
の中でvfs_setfsops() という関数に iumfs_vfs_ops_def_array...
オペレーションのリストををカーネルに伝え、カーネル自身が ...
側にのそのポインタを返しているのです。
err = vfs_setfsops(fstype, iumfs_vfs_ops_def_arra...
~~~~~~~~~~~~~~~~~~~~~~...
カーネルに渡す VFS カーネルが作成した
オペレーションがリスト vfsops構造体のポインタ
された配列 がセットされる
ここで紹介している IUMFS ファイルシステムでは 「SOL10」が...
モジュールが Solaris 10 用か Solaris 用9 かを判断しこれら...
***VFS オペレーションと VNODE オペレーション [#fa0ce7ea]
概要のところでお話したように、Solaris には大きく分けて「...
「ディスクファイルシステム」の2種類のファイルシステムがあ...
PROCFS ・・などさまざまなファイルシステムが存在します。こ...
ファイルシステムモジュールとして存在し、それぞれ独自に実...
各ファイルシステム独自の実装をカーネルから隠蔽するため、V...
というレイヤが設けられており、ファイルシステムへの操作は...
各ファイルシステムもVFS のフレームワークにのっとって、VFS...
独自に実装しています。たとえば、ユーザプロセスからあるフ...
場合、カーネルは VFS のフレームワークを介してファイルシス...
VFS インターフェースはファイルシステム自体を操作(mount/u...
ですが、同様にファイルシステム上に存在するファイルへの操...
VNODE というインターフェースが存在し、各ファイルシステム...
以下に本 IUMFS ファイルシステムが現在サポートしている VFS...
をリストします。(比較のため、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|キャッシュをストレージデバイスに書き込む。fsyn...
|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|ファイルシステムパラメータの設定を行う。pat...
|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) コマンド実行時に、-...
指定すると mount(1M) コマンドはそのファイルシステム固有の...
具体的には /usr/lib/fs/<ファイルシステムタイプ>/ というデ...
ファイルを探し、それを実行します。&br;
mount(1M) コマンドは渡された引数をファイルシステム固有の ...
システム固有の mount コマンドは渡された引数を独自に解釈し...
IUMFS ファイルシステムでは、インストール時に /usr/lib/fs/...
その中に mount という実行ファイルをコピーします。mount(1M...
場合、最終的にはこのコマンドが実行されまることになります...
ソースコードを見ていただくとわかりますが、中身は mount(2)...
iumfs_mount.c
main(int argc, char *argv[])
{
if (argc != 3){
printf("Usage: %s -F iumfs strings mount_point\n"...
exit(0);
}
if ( mount(argv[1], argv[2], MS_DATA, "iumfs", NULL, ...
perror("mount");
exit(0);
}
return(0);
}
"iumfs" という文字列がファイルシステムタイプとして渡され...
IUMFS ファイルシステムモジュール固有の VFS_MOUNT オペレー...
この iumfs_mount() という関数内にて行われます。
*インストール [#m6eb974b]
**コンパイル&インストール [#p929f800]
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
ld -dn -r iumfs.o iumfs_vnode.o -o iumfs
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...
/usr/sbin/modload 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...
**アンインストール [#j86c74b9]
ファイルシステムモジュールおよびコマンドのアンインストー...
# make uninstall
/usr/sbin/modunload -i `modinfo |grep iumfs | awk '{prin...
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 '{prin...
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 T...
^^^^
**ファイル・ディレクトリの作成・削除 [#p0d15888]
あえて実行例を書くことも無いのですが、ファイルやディレク...
ファイルシステム上のファイルをコピーしてくることもできま...
ディレクトリ情報の表示
# cd /mnt
# ls -lai
合計 3
1 drwxr-xr-x 1 root root 64 11月...
1514 drwxr-xr-x 26 root root 1024 10月...
新規ファイルと新規ディレクトリの作成
# echo "sample text" > file.txt
# mkdir dir
# ls -lai
合計 4
1 drwxr-xr-x 1 root root 128 11月...
1514 drwxr-xr-x 26 root root 1024 10月...
4 drwxr-xr-x 1 root root 64 11月...
3 -rw-r--r-- 1 root root 12 11月...
ファイルのオープン、読み込み
# cat file.txt
sample text
ファイルとディレクトリの削除
# rm file.txt
# rm -r dir
# ls -lia
合計 3
1 drwxr-xr-x 1 root root 64 11月 ...
1514 drwxr-xr-x 26 root root 1024 10月 ...
他のファイルシステムからのファイルのコピー
# cp /etc/motd /mnt
# ls -lai
合計 3
1 drwxr-xr-x 1 root root 96 11月 ...
1514 drwxr-xr-x 26 root root 1024 10月 ...
2 -rw-r--r-- 1 root root 54 11月 ...
# cat motd
Sun Microsystems Inc. SunOS 5.10 Generic January ...
** ファイルの属性変更 [#t0332e1f]
touch コマンドや、chmod コマンドを使って、ファイルシステ...
変更できます。ただし、アクセス権を変更しても実際にはアク...
権限のない一般ユーザでもファイルに対する全ての操作が可能...
# cd /mnt
# touch file.txt
# ls -li file.txt
3 -rw-r--r-- 1 root root 0 11月 ...
ファイルのアクセス権の変更
# chmod 777 file.txt
# ls -li file.txt
3 -rwxrwxrwx 1 root root 0 11月 ...
ファイルの更新日時を変更
# touch file.txt
# ls -li file.txt
3 -rwxrwxrwx 1 root root 0 11月 ...
ファイルのオーナーを変更
# 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]
+これを応用して、ネットワーク上のリソースを利用できる擬似...
Linux 上ではいろいろあるみたいですが、Web や FTP サーバ上...
面白いなと考えています。&br;&br;
+対応するシステムコールを増やす&br;
未対応のシステムコールは多いのですが、一番痛いのは mmap(2...
しているものも、中途半端な実装のものが多いので(とくにア...
改善したいです。&br;&br;
+%%32 bit kernel 環境のサポート%%&br;
32bit Kernel 対応しました。OpenSolaris x86(32bit) で確認...
ページ名: