NILFSとは?

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

NILFS は変化が全くない場合を除き、数秒から数十秒の間隔で、 もしくは更新量が多い場合はよりこまめに、チェックポイントを生成します。 ユーザは生成された数多くのチェックポイントの中から任意のものを選択し、 後からそれをスナップショットに変更できます。 スナップショットはチェックポイントに戻されるまでは維持され続けます。

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

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

NILFSの現在のメジャーバージョンは Version 2 (NILFS2 として参照)です。 NILFS2 には、複数のスナップショットを保持したまま、 参照されなくなったブロックを回収し空き領域として再利用可能にする、 オンラインのガーベジコレクション機能が搭載されました。

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

  • B-tree ベースのファイル管理、 inode 管理
  • システムクラッシュ後の高速な復旧
  • 多数・巨大なファイルやディスクをサポートするための 64 ビットデータ構造
  • 2038年以降も対応可能な 64ビットのタイムスタンプ
  • オンラインリサイズ: マウント中のファイルシステムの動的拡張・縮小の両方に対応

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

NILFS を使ってみる

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

  1. mkfs(8) でディスクパーティションをフォーマット

    例えば
    # 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(8) コマンドでマウントする

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

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

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

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

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

    NILFS は(変更がある限り)一定間隔で、または同期書き込みの契機で チェックポイントを作ります。 各チェックポイントは NILFS ファイルシステムの一貫した状態を保持しており、 多数のチェックポイントが連続的に生成されます。 チェックポイント及びスナップショットの数には実質的に制限はありません。

    これらチェックポイントの一覧は、 lscp(1) コマンドで出力することができます。

    $ lscp
           CNO        DATE     TIME  MODE  FLG      BLKCNT       ICNT
             1  2024-03-16 23:49:26   cp    -            4          1
             2  2024-03-16 23:49:44   cp    -            4          1
             3  2024-03-16 23:50:55   cp    -         3208        625
             4  2024-03-16 23:51:18   cp    -         2207        506
             5  2024-03-16 23:51:23   cp    -         2204        503
             6  2024-03-16 23:51:29   cp    -         2684        829
             7  2024-03-16 23:51:34   cp    -         2784        761
             8  2024-03-16 23:51:39   cp    -         2777        789
             9  2024-03-16 23:51:44   cp    -         3250        644
    

    スナップショットは、 GCによって削除されないよう印付けられたチェックポイントです。 スナップショットは mkcp(8) コマンドで現在のスナップショットを直接作ることもできますし、 既存のチェックポイントをスナップショットにすることもできます。 チェックポイントとスナップショットは、 以下に挙げたユーザランドのコマンドで管理します。

     lscp     チェックポイントの一覧を表示する
     mkcp     チェックポイントを作成する
     mkcp -s  スナップショットを作成する
     chcp     既存のチェックポイントをスナップショットに変更する
              もしくはその反対
     rmcp     指定されたチェックポイントを削除(無効化)する
    

    以下の例では、 チェックポイント番号が2になっている既存チェックポイントを しばらくたってからスナップショットに変更しています。

    $ sudo chcp ss 2
    $ lscp
           CNO        DATE     TIME  MODE  FLG      BLKCNT       ICNT
             1  2024-03-16 23:49:26   cp    -            4          1
             2  2024-03-16 23:49:44   ss    -            4          1
             3  2024-03-16 23:50:55   cp    -         3208        625
             4  2024-03-16 23:51:18   cp    -         2207        506
             5  2024-03-16 23:51:23   cp    -         2204        503
             6  2024-03-16 23:51:29   cp    -         2684        829
             7  2024-03-16 23:51:34   cp    -         2784        761
             8  2024-03-16 23:51:39   cp    -         2777        789
             9  2024-03-16 23:51:44   cp    -         3250        644
            10  2024-03-16 23:51:49   cp    -         3187        624
    

    最近のチェックポイントは ``protection_period'' という GC パラメータ で与えられる期間 GC から保護されています。 つまり GC は、生成時刻からの寿命が秒単位で protection_period の値以下のチェックポイントを削除しません。

    protection_period を含む GC のパラメータは /etc/nilfs_cleanerd.conf(5) という設定ファイルに記述されており、 このファイルを書き換えることで GC の挙動を調整することができます。

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

    スナップショットはリードオンリーのファイルシステムとしてマウントできます。 スナップショットをマウントするには、read-only オプション (``-r'' もしくは ``-o ro'') とチェックポイント番号を与える ``cp'' オプションを指定します。

    # mkdir -p /mnt/snapshot
    # mount -t nilfs2 -r -o cp=2 /dev/sdb1 /mnt/snapshot
    # df -at nilfs2
    ファイルシス   1K-ブロック  使用  使用可 使用% マウント位置
    /dev/sdb1          4186108 49148 3923968    2% /mnt/nilfs
    /dev/sdb1          4186108 49148 3923968    2% /mnt/snapshot
    # mount -t nilfs2
    /dev/sdb1 on /mnt/nilfs type nilfs2 (rw,relatime)
    /dev/sdb1 on /mnt/snapshot type nilfs2 (ro,relatime,cp=2)
    

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

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

    # umount /mnt/nilfs
    # umount /mnt/snapshot
    

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

  • follow NILFS in RSS
  • follow NILFS in feedly
  • follow NILFS in inoReader