NILFS は Linux カーネル 2.6 向けに開発しているログ構造化ファイルシステム (Log-Structured Filesystem, LFS)です. NILFS はスナップショットを自動かつ連続的に取得する機能を実装することにより, 間違って消したり上書きしたファイルを簡単に復活できるなど, Linux を利用したシステムの信頼性と利用者の利便性の向上を実現しました. ログ構造化ファイルシステムでは, メタデータを含むすべてのファイルシステムデータが ログのような形式で記録され, 上書きされることなく追記されます. LFSのこういった性質は,過去のデータや名前空間などのメタデータを保持する のに適しているだけでなく、ジャーナリングファイルシステムのように システムクラッシュ後もしくはクリーンでないシャットダウン後に一貫性を 保証したり、SSDなどのフラッシュディスクで性能を引き出すのに効果があります.
この他に,NILFS には以下の特徴があります
- スナップショットと共存したガーベジコレクション機能 (Version 2 で実現)
- システムクラッシュ後の高速な復旧
- B-tree ベースのファイル管理, inode 管理
- 多数・巨大なファイルやディスクをサポートするための 64 ビットデータ構造
- ローダブルカーネルモジュール: カーネル全体の再コンパイルが不要
NILFS の名前は New Implementation of a Log-structured File System の頭文字に由来します.
NILFS Version 2 (NILFS2) は実用性を向上させた NILFS の新版です. NILFS2 には,複数のスナップショットを保持したまま不要な世代を消去する, オンラインのガーベジコレクション機能が搭載されました.
NILFS2 で自動かつ連続的に取得されているチェックポイント (ファイルシステムの首尾一貫している状態) は後からスナップショットとして保存することができます. チェックポイントは一定期間 (設定で変更可能) は決して消去されません. その間に必要な世代を示すチェックポイントをスナップショットとします. スナップショットとなっていないチェックポイントはガーベジコレクタによって消去され, 空いたディスク領域は再利用されます.
NILFS version 2 の使い方を例を用いながら説明します.
-
``mkfs''でディスクパーティションをフォーマット
例えば # mkfs -t nilfs2 /dev/sdb1 mkfs.nilfs2 ver 2.0 Start writing file system initial data to the device Blocksize:4096 Device:/dev/sdb1 Device Size:73402366464 File system initialization succeeded !! -
``mount''コマンドでマウントする
# mkdir /nilfs # mount -t nilfs2 /dev/sdb1 /nilfs
この際、外部マウントプログラム(``mount.nilfs2'')を通じて ガーベジコレクタが起動されます. GCは、``nilfs_cleanerd''という名前のユーザランドの デーモンとして実装されています.
-
NILFS のマウントポイントを通常通り使う
通常のPOSIX ファイルシステムとして使うことができます.
-
スナップショットを作成する
NILFS は(変更がある限り)一定間隔で、または同期書き込みの契機で チェックポイントを作ります. 各チェックポイントは NILFS ファイルシステムの一貫した状態を保持しており、 多数のチェックポイントが連続的に生成されます. チェックポイント及びスナップショットの数には実質的に制限はありません.
これらチェックポイントの一覧は、 ``lscp''コマンドで出力することができます.
$ lscp CNO DATE TIME MODE SKT NBLKINC ICNT 1 2008-05-08 14:45:49 cp - 11 3 2 2008-05-08 14:50:22 cp - 200523 81 3 2008-05-08 20:40:34 cp - 136 61 4 2008-05-08 20:41:20 cp - 187666 1604 5 2008-05-08 20:41:42 cp - 51 1634 6 2008-05-08 20:42:00 cp - 37 1653 7 2008-05-08 20:42:42 cp - 272146 2116 8 2008-05-08 20:43:13 cp - 264649 2117 9 2008-05-08 20:43:44 cp - 285848 2117 10 2008-05-08 20:44:16 cp - 139876 7357スナップショットは、 GCによって削除されないよう印付けられたチェックポイントです. スナップショットは ``mkcp''コマンドで現在のスナップショットを直接作ることもできますし、 既存のチェックポイントをスナップショットにすることもできます. チェックポイントとスナップショットは、 以下に挙げたユーザランドのコマンドで管理します.
lscp チェックポイントの一覧を表示する mkcp チェックポイントを作成する mkcp -s スナップショットを作成する chcp 既存のチェックポイントをスナップショットに変更する もしくはその反対 rmcp 指定されたチェックポイントを削除(無効化)する以下の例では、 チェックポイント番号が2になっている既存チェックポイントを しばらくたってからスナップショットに変更しています.
$ sudo chcp ss 2 $ lscp CNO DATE TIME MODE SKT NBLKINC ICNT 1 2008-05-08 14:45:49 cp - 11 3 2 2008-05-08 14:50:22 ss - 200523 81 3 2008-05-08 20:40:34 cp - 136 61 4 2008-05-08 20:41:20 cp - 187666 1604 5 2008-05-08 20:41:42 cp - 51 1634 6 2008-05-08 20:42:00 cp - 37 1653 7 2008-05-08 20:42:42 cp - 272146 2116 8 2008-05-08 20:43:13 cp - 264649 2117 9 2008-05-08 20:43:44 cp - 285848 2117 10 2008-05-08 20:44:16 cp - 139876 7357 11 2008-05-08 21:05:23 cp - 10 7357最近のチェックポイントは ``protection_period'' という GC パラメータ で与えられる期間 GC から保護されています. つまり GC は、生成時刻からの寿命が秒単位で protection_period の値以下のチェックポイントを削除しません.
protection_period を含む GC のパラメータは /etc/nilfs_cleanerd.conf という設定ファイルに記述されており、 このファイルを書き換えることで GC の挙動を調整することができます.
-
スナップショットをマウントする
スナップショットはリードオンリーのファイルシステムとしてマウントできます. スナップショットをマウントするには、read-only オプション(``-r'' もしくは``-o ro'')とチェックポイント番号を与える ``cp'' オプションを指定します.
# mount -t nilfs2 -r -o cp=2 /dev/sdb1 /nilfs-cp # df -t nilfs2 Filesystem 1K-blocks Used Available Use% Mounted on /dev/sdb1 71679996 3203068 64888832 5% /nilfs /dev/sdb1 71679996 3203068 64888832 5% /nilfs-cp # mount -t nilfs2 /dev/sdb1 on /nilfs type nilfs2 (rw,gcpid=13296) /dev/sdb1 on /nilfs-cp type nilfs2 (ro,cp=2)
「現在」のファイルシステムとスナップショットは独立にマウントできるので、 オンラインバックアップが可能です.
-
スナップショットもしくは「現在」のマウントポイントをアンマウント.
# umount /nilfs # umount /nilfs-cp
「現在」のマウントポイントをアンマウントすると、そのパーティションの GC は停止します.
