NILFSとは?
NILFS は 連続スナップショットをサポートするログ構造化ファイルシステム (Log-Structured Filesystem, LFS)です。 NILFS はスナップショットを自動かつ連続的に取得する機能を実装することにより、 間違って消したり上書きしたファイルを簡単に復活できるなど、 Linux を利用したシステムの信頼性と利用者の利便性の向上を実現しました。 NILFS は従来の LFS のように、 システムクラッシュ後 もしくはクリーンでないシャットダウン後にファイルシステムの一貫性を保証することができ、 ジャーナリングファイルシステムと同様に、短時間で復旧可能です。
NILFS は数秒おき、 もしくは同期書き込みの契機で(変化がない場合の除き) 多数のチェックポイントを生成します。 ユーザは連続的に生成されたチェックポイントから重要なバージョンを選択し、 後からそれをスナップショットに変更できます。
スナップショットはディスクが一杯になるまで生成可能で、 スナップショット数に制約はありません。各スナップショットは、 リードオンリーのファイルシステムとしてマウントできます。 スナップショットは書き込み可能なマウントポイントと同時のマウントできるので、 使用中に整合性のとれたバックアップを取るのに役立ちます。
スナップショット管理は簡単かつ高速で、 ユーザはファイルシステムレベルのスナップショットのメリットを手軽に享受できます。
NILFSの現在のメジャーバージョンは Version 2 (NILFS2 として参照)です。 NILFS2 には,複数のスナップショットを保持したまま不要な世代を消去する、 オンラインのガーベジコレクション機能が搭載されました。
この他に、NILFS には以下の特徴があります。
- B-tree ベースのファイル管理、 inode 管理
- システムクラッシュ後の高速な復旧
- 多数・巨大なファイルやディスクをサポートするための 64 ビットデータ構造
- 2038年以降も対応可能な 64ビットのタイムスタンプ
- ローダブルカーネルモジュール: カーネル全体の再コンパイルが不要
NILFS の名前は New Implementation of a Log-structured File System の頭文字に由来します。
NILFS を使ってみる
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 は停止します。
