読者です 読者をやめる 読者になる 読者になる

覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。 twitter: @yyoshikaw

fuse-jna - Javaで作る仮想ファイルシステム

fuse-jnaとは

FUSEを用いたファイルシステムをJavaで実装可能とするためのライブラリがいくつか存在していますが、その中の一つにfuse-jnaが存在しています

"fuse-jna"というライブラリのその名の通りですが、JNAと組み合わせて利用します

 


fuse-jnaを使用した仮想ファイルシステムの実装

  • 必須ライブラリ
    • fuse-jna.jar
    • jna-X.X.X.jar
  • 実装方法
    • net.fusejna.util.FuseFilesystemAdapterFullを継承したクラスを作成し、必要なメソッドをオーバーライドする
  • 実装可能なメソッド
    • net.fusejna.util.FuseFilesystemAdapterFullのオーバーライド可能なメソッドは以下の通り
No.メソッド名概要引数戻り値備考
1 access 対象のパスに対応するファイルが指定のアクセス権を許可するかどうかをチェックする ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●int access ‥ チェックするアクセス権
正常時(許可する場合):
0
エラー時(許可しない場合):
エラーコード
具体的な実装無しでもFUSEとして動作する

FuseFilesystemAdapterFullのデフォルト実装は、ENOSYS(実装無し)のreturn
2 bmap 対象のパスに対応するファイルのブロック番号を返却する ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●FileInfoWrapper info ‥ 対象ファイル操作についての各種情報(モード等)
具体的な実装無しでもFUSEとして動作する
3 chmod 対象のパスに対応するファイルのアクセス権を変更する ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●ModeWrapper mode ‥ 対象ファイルへ設定するアクセス権
正常時:
0
エラー時:
エラーコード
 
4 chown 対象のパスに対応するファイルのユーザとグループを変更する ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●long uid ‥ 対象ファイルへ設定するユーザID
●long gid ‥ 対象ファイルへ設定するグループID
正常時:
0
エラー時:
エラーコード
※引数のユーザID、グループIDの指定が無い呼び出しの場合は、引数のuid、gidに -1 がセットされて本関数が呼び出される。
5 create 対象のパスに対応するファイルを生成してオープンする
(対象ファイルが存在しない場合は、指定のモードでファイルを生成してオープンする)
●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●ModeWrapper mode ‥ 対象ファイルへ設定するアクセス権
●FileInfoWrapper info ‥ 対象ファイル操作についての各種情報(モード等)
正常時:
0
エラー時:
エラーコード
create実行後に呼び出されるメソッドでファイルハンドルの値を利用する場合は、本メソッドでファイルハンドル(fh)に値を設定する必要がある
6 fgetattr オープンされているファイルの属性情報を取得する ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●StatWrapper stat ‥ 対象ファイルの属性情報を設定する(OUTパラメータ)
●FileInfoWrapper info ‥ 対象ファイル操作についての各種情報(モード等)
正常時:
0
エラー時:
エラーコード
FuseFilesystemAdapterFullの
デフォルト実装はgetattrメソッドへ処理を委譲している
7 flush キャッシュデータのフラッシュを行う ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●FileInfoWrapper info ‥ 対象ファイル操作についての各種情報(モード等)
正常時:
0
エラー時:
エラーコード
flushはopen(create)したファイルに対して複数回呼ばれる(ファイルのcloseの判定としては利用できない)
8 fsync メモリ上にあるファイルの内容をストレージデバイス上のものと同期させる ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●int datasync ‥ メタデータをフラッシュするか?(0以外を指定するとメタデータをフラッシュしない)
●FileInfoWrapper info ‥ 対象ファイル操作についての各種情報(モード等)
正常時:
0
エラー時:
エラーコード
具体的な実装無しでもFUSEとして動作する
9 fsyncdir 対象のパスに対応するディレクトリ内のコンテンツを同期化する ●String path ‥ 操作対象ディレクトリのパス(FUSE上のフルパス)
●int datasync ‥ メタデータをフラッシュするか?(0以外を指定するとメタデータをフラッシュしない)
●FileInfoWrapper info ‥ 対象ファイル操作についての各種情報(モード等)
正常時:
0
エラー時:
エラーコード
 
10 ftruncate 対象のパスに対応するファイルのサイズを指定されたファイルサイズに変更(拡張or切り詰め)する ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●long offset ‥ 変更後のファイルサイズ(バイト)
●FileInfoWrapper info ‥ 対象ファイル操作についての各種情報(モード等)
正常時:
0
エラー時:
エラーコード
FuseFilesystemAdapterFullの
デフォルト実装はtruncateメソッドへ処理を委譲している
11 getattr 対象のパスに対応するファイルの属性情報を取得して引数(stat)にセットして返す ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●StatWrapper stat ‥対象ファイルの属性情報を設定する(OUTパラメータ)
正常時:
0
エラー時:
エラーコード
statで取得できる属性情報を取得して返却するイメージ
ファイル操作においてこのAPIが呼び出されないことは無いと思われる(ので非常に重要なものと考えられる)
12 getxattr 対象のパスに対応するファイルの拡張属性を返却する ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●String xattr ‥ ?
●ByteBuffer buf ‥ ?
●long size ‥ ?
●XattrFiller filler ‥ ?
●long position ‥ ?
正常時:
0
エラー時:
エラーコード
具体的な実装無しでもFUSEとして動作する

FuseFilesystemAdapterFullのデフォルト実装は、ENOSYS(実装無し)のreturn
13 link 対象のパスに対応するファイルのハードリンクを作成する ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●String target ‥ ハードリンクを作成する先の新しいパス(FUSE上のフルパス)
正常時:
0
エラー時:
エラーコード
 
14 listxattr 対象のパスに対応するファイルに紐づけられた拡張属性の名前リストを取得する ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●XattrListFiller filler ‥ 拡張属性の名前を格納するオブジェクト(OUTパラメータ)
正常時:
0
エラー時:
エラーコード
具体的な実装無しでもFUSEとして動作する

FuseFilesystemAdapterFullのデフォルト実装は、ENOSYS(実装無し)のreturn
15 lock 対象のパスに対応するファイルに対するロック操作を実行する ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●FileInfoWrapper info ‥ 対象ファイル操作についての各種情報(モード等)
●FlockCommand command ‥ fcntlのF_GETLK, F_SETLK, F_SETLKWに対応する値が指定される
●FlockWrapper flock ‥ 対象ファイルへ設定するロックの情報
正常時:
0
エラー時:
エラーコード
具体的な実装無しでもFUSEとして動作する

FuseFilesystemAdapterFullのデフォルト実装は、ENOSYS(実装無し)のreturn
16 mkdir 対象のパスに対応するディレクトリを作成する ●String path ‥ 操作対象ディレクトリのパス(FUSE上のフルパス)
●ModeWrapper mode ‥ 対象ディレクトリへ設定するアクセス権
正常時:
0
エラー時:
エラーコード
 
17 mknod 対象のパスに対応する特殊ファイル(Special file)や通常のファイルを作成する ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●ModeWrapper mode ‥ 対象ファイルへ設定するアクセス権
●long dev ‥作成する特殊ファイルの番号
正常時:
0
エラー時:
エラーコード
FuseFilesystemAdapterFullの
デフォルト実装はcreateメソッドへ処理を委譲している
18 open 対象のパスに対応する既存ファイルをオープンする ●String path ‥ 操作対象ファイルのパス(FUSE上のフルパス)
●FileInfoWrapper info ‥ 対象ファイル操作についての各種情報(モード等)
正常時(ファイルのopenを許可する場合):
0
エラー時(ファイルのopenを許可しない場合):
エラーコード
O_CREAT, O_EXCL,O_TRUNC指定で呼び出されることは無い

open実行後に呼び出されるメソッドでファイルハンドルの値を利用する場合は、本メソッドでファイルハンドル(fh)に値を設定する必要がある
19 opendir 本メソッドで処理対象となっているファイルハンドルがreaddir,fsyncdir,releasedirに渡される ●String path ‥ 操作対象ディレクトリのパス(FUSE上のフルパス)
●FileInfoWrapper info ‥対象ディレクトリ操作についての各種情報(モード等)
正常時(ディレクトリのopenを許可する場合):
0
エラー時(ディレクトリのopenを許可しない場合):
エラーコード
具体的な実装無しでもFUSEとして動作する
opendir実行後に呼び出されるメソッドでファイルハンドルの値を利用する場合は、本メソッドでファイルハンドル(fh)に値を設定する必要がある
20 read 対象のパスに対応するファイルからデータを読み込み指定のバッファへ格納して返却する ●String path ‥ 読み込むファイルのパス(FUSE上のフルパス)
●ByteBuffer buffer ‥ 対象ファイルから読み込んだデータを書き込むバッファ(OUTパラメータ)
●long size ‥ 対象ファイルから読み込むデータのサイズ(byte)
●long offset ‥ 対象ファイルの読み込み位置(先頭からのバイト数)
●FileInfoWrapper info ‥ 対象ファイル操作についての各種情報(モード等)
正常時:
読み込んだデータサイズ
(ファイルの終端の場合は0を返却する)
エラー時:
エラーコード
 
21 readdir fillerに操作対象ディレクトリ直下のファイルのパスを格納する ●String path ‥ 操作対象ディレクトリのパス(FUSE上のフルパス)
●DirectoryFiller filler ‥ ディレクトリ以外のファイルのファイル名を格納する(OUTパラメータ)
正常時:
0
エラー時:
エラーコード
 
22 readlink 対象のパスに対応するシンボリックリンクの値を取得する ●String path ‥ 操作対象シンボリックリンクのパス(FUSE上のフルパス)
●ByteBuffer buffer ‥ 象ファイルから読み込んだデータを書き込むバッファ(OUTパラメータ)
●long size ‥ 対象ファイルから読み込むデータのサイズ(byte)
正常時:
読み込んだデータサイズ
エラー時:
エラーコード
 
23 release オープンされたファイルを開放する ●String path ‥ 読み込むファイルのパス(FUSE上のフルパス)
●FileInfoWrapper info ‥ 対象ファイル操作についての各種情報(モード等)
正常時:
0
エラー時:
エラーコード
本メソッドはopenしたファイルに対して1回だけ呼ばれる
(具体的な実装無しでもFUSEとして動作する)
24 releasedir オープンされたディレクトリを開放する ●String path ‥ 操作対象ディレクトリのパス(FUSE上のフルパス)
●FileInfoWrapper info ‥ 対象ディレクトリ操作についての各種情報(モード等)
正常時:
0
エラー時:
エラーコード
具体的な実装無しでもFUSEとして動作する
25 removexattr 対象のパスに対応するファイルの拡張属性を削除する ●String path ‥ 操作対象ファイルのパス(FUSE上のフルパス)
●String xattr ‥ 削除対象の拡張属性のな名称
正常時:
0
エラー時:
エラーコード
具体的な実装無しでもFUSEとして動作する

FuseFilesystemAdapterFullのデフォルト実装は、ENOSYS(実装無し)のreturn
26 rename 対象のパスに対応するファイルをリネームする ●String oldpath ‥ 変更元のパス(FUSE上のフルパス)
●String newName ‥ 変更先のパス(FUSE上のフルパス)
正常時:
0
エラー時:
エラーコード
一般的にrenameシステムコールはファイル操作の中でも最も複雑で、実装側からすると気を使うことが多く頭が痛い機能と言われる。
システムコールのrenameのEINVAL、ENOTDIR、EISDIRが発生するケースに該当する呼び出しは行われない(事前にガードされる)
27 rmdir 対象のパスに対応するディレクトリを削除する ●String path ‥ 操作対象ディレクトリのパス(FUSE上のフルパス) 正常時:
0
エラー時:
エラーコード
(システムコールと同様とすると)pathのディレクトリは空(. , .. 以外には含まない)でなければならない
システムコールのrmdirと異なってpathに"/", ".", ".."等を渡されて呼び出されることは無い。(FUSE-API実行前に事前にはじかれる)
28 setxattr 対象のパスに対応するファイルに指定された拡張属性の値を設定する ●String path ‥ 操作対象ファイルのパス(FUSE上のフルパス)
●String xattr ‥ ?
●ByteBuffer buf ‥ ?
●long size ‥ ?
●int flags ‥ ?
●long position ‥ ?
正常時:
0
エラー時:
エラーコード
具体的な実装無しでもFUSEとして動作する

FuseFilesystemAdapterFullのデフォルト実装は、ENOSYS(実装無し)のreturn
29 statfs 対象ファイルシステムの統計を取得する ●String path ‥ マウントされたファイルシステムにあるファイルのパス(FUSE上のフルパス)
●StatvfsWrapper wrapper ‥ 統計情報を設定するオブジェクト(OUTパラメータ)
正常時:
0
エラー時:
エラーコード
 
30 symlink 対象のパスに対応するファイルのシンボリックリンクを作成する ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●String target ‥ シンボリックリンクを作成する先の新しいパス(FUSE上のフルパス)
正常時:
0
エラー時:
エラーコード
 
31 truncate 対象のパスに対応するファイルのサイズを指定されたファイルサイズに変更(拡張or切り詰め)する ●String path ‥ 操作対象のファイルのパス(FUSE上のフルパス)
●long offset ‥ 変更後のファイルサイズ(バイト)
正常時:
0
エラー時:
エラーコード
 
32 unlink 対象のパスに対応するファイルを削除する ●String path ‥ 操作対象ファイルのパス(FUSE上のフルパス) 正常時:
0
エラー時:
エラーコード
 
33 utimens 対象のパスに対応するファイルの最終アクセス時刻(atime)と最終変更時刻(mtime)を変更する ●String path ‥ 操作対象ファイルのパス(FUSE上のフルパス)
●TimeBufferWrapper wrapper ‥ 対象ファイルへ設定する時刻情報
正常時:
0
エラー時:
エラーコード
FuseFilesystemAdapterFullのデフォルト実装は、ENOSYS(実装無し)のreturn
34 write 対象のパスに対応するファイルへ指定のバッファのデータを書き込む ●String path ‥書き込み先のファイルのパス(FUSE上のフルパス)
●ByteBuffer buf ‥対象ファイルへ書き込むデータ
●long bufSize ‥対象ファイルへ書き込むデータのサイズ(byte)
●long writeOffset ‥対象ファイルの書き込み位置(先頭からのバイト数)
●FileInfoWrapper info ‥対象ファイル操作についての各種情報(モード等)
正常時:
引数のbufSize
(何も書き込まなかった場合は0を返却する)
エラー時:
エラーコード
 
35 init ファイルシステムの初期化処理を行う(mount実行時に呼び出される) - - 具体的な実装無しでもFUSEとして動作する
36 destroy ファイルシステムのクリーンアップ処理を行う - - 具体的な実装無しでもFUSEとして動作する
37 getName 対象のファイルシステムの名称を返却する - FUSEの名称(小文字)を返却する (FUSE-APIとは直接関係は無い)
38 getOptions 対象のファイルシステムのmount時に指定するfuseのオプションを格納した配列を返却する - FUSEに指定するオプションを格納した配列
(指定するオプションが無ければnull)
(FUSE-APIとは直接関係は無い)
39 beforeMount mount実行時の前処理を実行する ●File mountPoint ‥ mountで指定したマウントポイントを表すファイルオブジェクト - (FUSE-APIとは直接関係は無い)
40 afterUnmount unmount実行時の前処理を実行する ●File mountPoint ‥ mountで指定したマウントポイントを表すファイルオブジェクト - (FUSE-APIとは直接関係は無い)
41 beforeUnmount unmount実行時の後処理を実行する ●File mountPoint ‥ mountで指定したマウントポイントを表すファイルオブジェクト - (FUSE-APIとは直接関係は無い)
  • 各メソッドは同名のFUSE-APIにマッピングされるイメージ(getName, getOptions, beforeMount, afterUnmount, beforeUnmount は除く)

補足

  • JNAによって実現される仮想ファイルシステムである関係上、必ずしも高速には動作しません。求められる仮想ファイルシステムの要件によっては応答速度の関係で厳しい場合もあります。
  • JNAの実装系での応答速度を改善するためにJNRでの実装系のライブラリが存在しています。

 


 

関連エントリ