NILFSとは?

NILFS は 連続スナップショットをサポートするログ構造化ファイルシステム (Log-Structured Filesystem, LFS)です。 NILFS はスナップショットを自動かつ連続的に取得する機能を実装することにより、 間違って消したり上書きしたファイルを簡単に復活できるなど、 Linux を利用したシステムの信頼性と利用者の利便性の向上を実現しました。 NILFS は従来の LFS のように、 システムクラッシュ後 もしくはクリーンでないシャットダウン後にファイルシステムの一貫性を保証することができ、 ジャーナリングファイルシステムと同様に、短時間で復旧可能です。

NILFS は数秒おき、 もしくは同期書き込みの契機で(変化がない場合の除き) 多数のチェックポイントを生成します。 ユーザは連続的に生成されたチェックポイントから重要なバージョンを選択し、 後からそれをスナップショットに変更できます。

スナップショットはディスクが一杯になるまで生成可能で、 スナップショット数に制約はありません。各スナップショットは、 リードオンリーのファイルシステムとしてマウントできます。 スナップショットは書き込み可能なマウントポイントと同時のマウントできるので、 使用中に整合性のとれたバックアップを取るのに役立ちます。

スナップショット管理は簡単かつ高速で、 ユーザはファイルシステムレベルのスナップショットのメリットを手軽に享受できます。

NILFSの現在のメジャーバージョンは Version 2 (NILFS2 として参照)です。 NILFS2 には,複数のスナップショットを保持したまま不要な世代を消去する、 オンラインのガーベジコレクション機能が搭載されました。

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

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

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 は停止します。