意図

ハードリンクを使えないFileSystemやOSでPyDumpFSを動作させるために独自のFileSystemを持たせる

試案

試案1 素直に実装版

1ファイルないしは複数ファイルで構成。 複数ファイルに分ける場合は"root_node"テーブルは必要なく"directory_entry"と"file_entry"を格納するファイルをバックアップするごとに作成して、"data_entry"は使いまわすことで全体的な容量を削減する。

  1. create table root_node(
  2. id integer PRIMARY KEY AUTOINCREMENT,
  3. cdate integer not null default CURRENT_TIMESTAMP,
  4. root_directory integer not null REFERENCES directory_entry(id)
  5. );
  6. create table directory_entry(
  7. id integer PRIMARY KEY AUTOINCREMENT,
  8. name text not null,
  9. uid integer not null,
  10. gid integer not null,
  11. atime integer not null,
  12. mtime integer not null,
  13. ctime integer not null,
  14. mode blob not null,
  15. parent integer DEFAULT -1
  16. );
  17. create table file_entry(
  18. id integer PRIMARY KEY AUTOINCREMENT,
  19. name text not null,
  20. uid integer not null,
  21. gid integer not null,
  22. atime integer not null,
  23. mtime integer not null,
  24. ctime integer not null,
  25. mode blob not null,
  26. parent_directory integer not null REFERENCES directory_entry(id),
  27. data integer not null REFERENCES data_entry(id)
  28. );
  29. create table data_entry(
  30. id integer PRIMARY KEY AUTOINCREMENT,
  31. hash_md5 blob not null,
  32. hash_sha1 blob not null,
  33. size integer not null,
  34. rdata blob,
  35. unique (hash_md5,hash_sha1)
  36. );
  37. create index directory_tree_index on directory_entry(parent);
  38. create index directory_file_index on file_entry(parent_directory);
  39. create index directory_name on directory_entry(name);
  40. create index file_name on file_entry(name);

試案2 ファイルを適当なブロックに分けて格納版

1ファイルないしは複数ファイルで構成。 複数ファイルに分ける場合は"root_node"テーブルは必要なく"directory_entry"と"file_entry"を格納するファイルをバックアップするごとに作成して、"data_list_entry"と"data_blk_entry"は使いまわすことで全体的な容量を削減する。

ブロックに分ける理由は、更なる容量削減のため。 別ファイルであってもブロック単位では一致していればそのブロックは共有することで使用容量を削減する。 ブロックサイズは熟慮の必要あり。

  1. create table root_node(
  2. id integer PRIMARY KEY AUTOINCREMENT,
  3. cdate integer not null default CURRENT_TIMESTAMP,
  4. root_directory integer not null REFERENCES directory_entry(id)
  5. );
  6. create table directory_entry(
  7. id integer PRIMARY KEY AUTOINCREMENT,
  8. name text not null,
  9. uid integer not null,
  10. gid integer not null,
  11. atime integer not null,
  12. mtime integer not null,
  13. ctime integer not null,
  14. mode blob not null,
  15. parent integer DEFAULT -1
  16. );
  17. create table file_entry(
  18. id integer PRIMARY KEY AUTOINCREMENT,
  19. name text not null,
  20. uid integer not null,
  21. gid integer not null,
  22. atime integer not null,
  23. mtime integer not null,
  24. ctime integer not null,
  25. size integer not null,
  26. mode blob not null,
  27. parent_directory integer not null REFERENCES directory_entry(id) default -1,
  28. data integer not null REFERENCES data_list_entry(id)
  29. );
  30. create table data_list_entry(
  31. id integer PRIMARY KEY AUTOINCREMENT,
  32. rdata_blk1 integer not null REFERENCES data_blk_entry(id) default -1,
  33. rdata_blk2 integer not null REFERENCES data_blk_entry(id) default -1,
  34. rdata_blk3 integer not null REFERENCES data_blk_entry(id) default -1,
  35. rdata_blk4 integer not null REFERENCES data_blk_entry(id) default -1,
  36. rdata_blk5 integer not null REFERENCES data_blk_entry(id) default -1,
  37. next_list integer default -1
  38. );
  39. create table data_blk_entry(
  40. id integer PRIMARY KEY AUTOINCREMENT,
  41. hash_md5 blob not null,
  42. hash_sha1 blob not null,
  43. rdata blob,
  44. size integer not null,
  45. unique (hash_md5,hash_sha1)
  46. );
  47. create index directory_tree_index on directory_entry(parent);
  48. create index directory_file_index on file_entry(parent_directory);
  49. create index directory_name on directory_entry(name);
  50. create index file_name on file_entry(name);
  51. create index data_list_link on data_list_entry(next_list);

試案3 実データはデータベースの外に格納版

ファイル情報はデータベース内に保持するが、実データは何らかのハッシュをファイル名にして管理。 ファイル数が多くなることが予想されるので適当にディレクトリで分割。 そこにたどり着くパス名全体でハッシュ値を表すようにする。

ex.)ハッシュが"9f6e6800c"で3段のディレクトリに分けるなら"./9f/6e/68/00c"といったパスになる

実データは適当な大きさのブロックで分割。

  1. create table root_node(
  2. id integer PRIMARY KEY AUTOINCREMENT,
  3. cdate integer not null default CURRENT_TIMESTAMP,
  4. root_directory integer not null REFERENCES directory_entry(id)
  5. );
  6. create table directory_entry(
  7. id integer PRIMARY KEY AUTOINCREMENT,
  8. name text not null,
  9. uid integer not null,
  10. gid integer not null,
  11. atime integer not null,
  12. mtime integer not null,
  13. ctime integer not null,
  14. mode blob not null,
  15. parent integer DEFAULT -1
  16. );
  17. create table file_entry(
  18. id integer PRIMARY KEY AUTOINCREMENT,
  19. name text not null,
  20. uid integer not null,
  21. gid integer not null,
  22. atime integer not null,
  23. mtime integer not null,
  24. ctime integer not null,
  25. size integer not null,
  26. mode blob not null,
  27. parent_directory integer not null REFERENCES directory_entry(id) default -1,
  28. data integer not null REFERENCES data_list_entry(id)
  29. );
  30. create table data_list_entry(
  31. id integer PRIMARY KEY AUTOINCREMENT,
  32. rdata_hash1 text not null,
  33. rdata_hash2 text,
  34. rdata_hash3 text,
  35. rdata_hash4 text,
  36. next_list integer default -1
  37. );
  38. create index directory_tree_index on directory_entry(parent);
  39. create index directory_file_index on file_entry(parent_directory);
  40. create index directory_name on directory_entry(name);
  41. create index file_name on file_entry(name);
  42. create index data_list_link on data_list_entry(next_list);

試案4 他のFileSystemを参考に版

ディレクトリツリーの有向グラフの向きが上述の3つとは逆。 inode_num==0がルートディレクトリ。 ファイル名はリンクリストで管理。

  1. create table inode(
  2. inode_num integer not null,
  3. rev_id integer not null,
  4. uid integer not null,
  5. gid integer not null,
  6. atime integer not null,
  7. mtime integer not null,
  8. ctime integer not null,
  9. dev_num integer not null,
  10. nlink integer not null,
  11. size integer not null,
  12. mode blob not null,
  13. data_id integer not null
  14. );
  15. create table d_data(
  16. id integer PRIMARY KEY AUTOINCREMENT,
  17. fname1 text not null,
  18. inum1 integer not null,
  19. fname2 text,
  20. inum2 integer,
  21. fname3 text,
  22. inum3 integer,
  23. fname4 text,
  24. inum4 integer,
  25. next_id integer
  26. );
  27. create table f_data(
  28. id integer PRIMARY KEY AUTOINCREMENT,
  29. rdata_hash1 text not null,
  30. rdata_hash2 text,
  31. rdata_hash3 text,
  32. rdata_hash4 text,
  33. next_id integer default -1
  34. );
  35. create index inode_num_index on inode(inode_num);