What is NILFS?

NILFS は Linux カーネル 2.6 向けに開発しているログ構造化ファイルシステム (Log-Structured Filesystem, LFS)です. NILFS はスナップショットを自動かつ連続的に取得する機能を実装することにより, 間違って消したり上書きしたファイルを簡単に復活できるなど, Linux を利用したシステムの信頼性と利用者の利便性の向上を実現しました. ログ構造化ファイルシステムでは, メタデータを含むすべてのファイルシステムデータが ログのような形式で記録され, 上書きされることなく追記されます. LFSのこういった性質は,過去のデータや名前空間などのメタデータを保持する のに適しているだけでなく、ジャーナリングファイルシステムのように システムクラッシュ後もしくはクリーンでないシャットダウン後に一貫性を 保証したり、SSDなどのフラッシュディスクで性能を引き出すのに効果があります.

この他に,NILFS には以下の特徴があります

NILFS の名前は New Implementation of a Log-structured File System の頭文字に由来します.

What is NILFS version 2?

NILFS Version 2 (NILFS2) は実用性を向上させた NILFS の新版です. NILFS2 には,複数のスナップショットを保持したまま不要な世代を消去する, オンラインのガーベジコレクション機能が搭載されました.

NILFS2 で自動かつ連続的に取得されているチェックポイント (ファイルシステムの首尾一貫している状態) は後からスナップショットとして保存することができます. チェックポイントは一定期間 (設定で変更可能) は決して消去されません. その間に必要な世代を示すチェックポイントをスナップショットとします. スナップショットとなっていないチェックポイントはガーベジコレクタによって消去され, 空いたディスク領域は再利用されます.

Using NILFS

NILFS version 2 の使い方を例を用いながら説明します.

  1. ``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 !! 
    
  2. ``mount''コマンドでマウントする

    # mkdir /nilfs
    # mount -t nilfs2 /dev/sdb1 /nilfs
    

    この際、外部マウントプログラム(``mount.nilfs2'')を通じて ガーベジコレクタが起動されます. GCは、``nilfs_cleanerd''という名前のユーザランドの デーモンとして実装されています.

  3. NILFS のマウントポイントを通常通り使う

    通常のPOSIX ファイルシステムとして使うことができます.

  4. スナップショットを作成する

    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 の挙動を調整することができます.

  5. スナップショットをマウントする

    スナップショットはリードオンリーのファイルシステムとしてマウントできます. スナップショットをマウントするには、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)
    

    「現在」のファイルシステムとスナップショットは独立にマウントできるので、 オンラインバックアップが可能です.

  6. スナップショットもしくは「現在」のマウントポイントをアンマウント.

    # umount /nilfs
    # umount /nilfs-cp
    

    「現在」のマウントポイントをアンマウントすると、そのパーティションの GC は停止します.