- 目的
- 概要
- テーブル構成
- 各システムコールでの動作
- getattr(path)
- readlink(path)
- readdir(path,count)
- mknod(path,mode,dev)
- mkdir
- unlink(path)
- rmdir(path)
- symlink(targetPath,linkPath)
- rename(oldPath,newPath)
- link
- chmod(path,mode)
- chown
- truncate(path,length)
- utime(path,times)
- open(path,flags)
- read(path,length,offset)
- write(path,buf,offset)
- release(path,flags)
- statfs()
- fsync()
- create
- opendir
- releasedir
- fsyncdir
- flush(path)
- fgetattr
- ftruncate
- getxattr
- listxattr
- setxattr
- removexattr
- access
- lock
- utimens
- bmap
- fsinit
- fsdestroy
目的
- 各種データのアーカイブ(保管)
- 大量のデータを少ない容量で保管
概要
- 実データの変更履歴を全て保存
- ブロック単位でデータ圧縮(圧縮法にbz2を使用)
- i-nodeにリビジョン番号を持たせることで同じi-nodeのファイルの履歴を保持
- データ構造は自作せずSQLiteを用いることで代替
- FUSEを使用してFileSystemを実装
テーブル構成
- Inode
他のファイルシステムにおいてi-nodeとなる構造体
| inode_num | i-node番号 |
| rev_id | リビジョン番号 |
| uid | オーナーのUID |
| gid | オーナーのGID |
| atime | 最終アクセス時間 |
| mtime | 最終更新時間 |
| ctime | メタデータの最終更新時間 |
| size | ファイルサイズ |
| mode | 保護モード |
| dev | デバイス番号(特殊ファイルのときのみ、通常のファイルのときは0) |
- Dentry
ディレクトリ内のファイルの名前とi-node番号の組
| parent | ディレクトリのInodeエントリ番号 |
| filename | ファイル名 |
| inode_num | i-node番号 |
- RawData
実データを保存するブロックを表す
| hash_sha256 | このブロックのデータのsha256 |
| data | このブロックのデータをbz2で圧縮した後base64エンコードしたもの |
- DataList
ファイルを構成するブロックのリスト
| parent | ファイルのInodeエントリ番号 |
| series | ファイル内での番号(0スタート) |
| data | RawDataエントリ番号 |
各システムコールでの動作
getattr(path)
stat(2)と同じ。
stat構造体を返す。
stat構造体を返す。
readlink(path)
シンボリックリンクのリンク先のパスを返す。
readdir(path,count)
このcountは大抵の場合無意味。
このディレクトリに含まれるファイル名とi-node番号の組を返す。
このディレクトリに含まれるファイル名とi-node番号の組を返す。
mknod(path,mode,dev)
pathで指定されたパスを持つファイルを生成する。modeがS_IFCHRとS_IFBLK以外ならdevは無視する。S_IFCHRとS_IFBLKならdevは作成するデバイスファイルのメジャー番号とマイナー番号。
mkdir
unlink(path)
ファイルの削除。親ディレクトリのディレクトリエントリの修正。
rmdir(path)
ディレクトリの削除。親ディレクトリのディレクトリエントリを修正。
symlink(targetPath,linkPath)
modeにstat.S_IFLNKフラグを立てたファイルを作成
rename(oldPath,newPath)
ファイル名の変更。親ディレクトリのディレクトリエントリを修正。
link
chmod(path,mode)
対象ファイルの保護モードを変更。
chown
truncate(path,length)
指定した長さにファイルを切り詰める
utime(path,times)
utimeを更新
open(path,flags)
辞書openfilesにエントリがなければ追加しエントリがあれば参照カウンタを増やす
read(path,length,offset)
ファイルのoffsetの位置からlengthだけ読んで返す。
write(path,buf,offset)
ファイルに書き込む
release(path,flags)
辞書openfilesの該当エントリの参照カウンタを減らす
statfs()
ファイルシステム自体のstat。
以下の6つの要素を持ったタプルを返す;
以下の6つの要素を持ったタプルを返す;
- ブロックサイズ バイト単位のブロックサイズ
- 全ブロック数 確保しているブロック数
- 空きブロック数 使われていないブロック数
- 全ファイル数 確保しているi-node数
- 空きファイル数 使用していないi-node数
- ファイル名の長さ ファイル名に使える最大長さ
未定義ならその要素を0にして返す
fsync()
現在のトランザクションをコミットし、新しいトランザクションを始める。
create
opendir
releasedir
fsyncdir
flush(path)
何もしない