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 の使い方を例を用いながら説明します。
-
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 !!
-
mount(8) コマンドでマウントする
# mkdir -p /mnt/nilfs # mount -t nilfs2 /dev/sdb1 /mnt/nilfs
この際、外部マウントプログラム(mount.nilfs2(8))を通じて ガーベジコレクタが起動されます。 GCは、 nilfs_cleanerd(8) という名前のユーザランドの デーモンとして実装されています。
-
NILFS のマウントポイントを通常通り使う
通常のPOSIX ファイルシステムとして使うことができます。
-
スナップショットを作成する
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 の挙動を調整することができます。
-
スナップショットをマウントする
スナップショットはリードオンリーのファイルシステムとしてマウントできます。 スナップショットをマウントするには、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)
「現在」のファイルシステムとスナップショットは独立にマウントできるので、 オンラインバックアップが可能です。
-
スナップショットもしくは「現在」のマウントポイントをアンマウント。
# umount /mnt/nilfs # umount /mnt/snapshot
「現在」のマウントポイントをアンマウントすると、そのパーティションの GC は停止します。
Copyright © 2014 - 2024, NILFS コミュニティ