FAQ

  1. GC を手動で行いたいのですが。

    インストールされている nilfs-utils パッケージに nilfs-clean コマンドが含まれている場合には, そのコマンドを実行して下さい:

    # nilfs-clean [device]
    

    このコマンドはワンパスの GC を開始させます。

  2. NILFSがディスクフルになりました。ファイルを削除したのに, ディスク空き容量が増えません。

    以下のように -p オプションを指定して nilfs-clean コマンドを起動して GC を行って下さい:

    # nilfs-clean -p 1s device
    

    nilfs-clean コマンドが利用できない場合は、ファイルシステムを ``pp'' オプションを使ってリマウントしてみて下さい:

    # mount -t nilfs2 -o remount,pp=1 device mount-point
    

    nilfs_cleanerd は 経過時間が protection-period 以下のチェックポイントを削除しません。上記オプションは、この protection-period を一秒に短縮し、nilfs_cleanerd が削除されたファイルを保持しているチェックポイントを解放できるようにします。 (スナップショットは protection-period とは無関係に保護されます)

    protection-period の値は /etc/nilfs_cleanerd.conf で定義されており、そのデフォルト値は一時間に設定されています。

  3. GC をオフにする方法は ?

    ``nogc'' オプションを指定してマウントを行います:

    # mount -t nilfs2 -o nogc device mount-point
    

    remount でマウント中に GC を無効化することもできます:

    # mount -t nilfs2 -o remount,nogc device mount-point
    

    これにより nilfs_cleanerd プロセスが kill されます。 GC を再度起動する場合は、nogc オプションを指定せず、 単に remount を行います:

    # mount -t nilfs2 -o remount device mount-point
    
  4. df コマンドによるディスク使用量は、 過去のデータを含んでいるように思われます。 「現在のファイルシステム」のディスク使用量を取得するには どうすれば良いでしょうか?

    新しい nilfs-utils パッケージの lscp コマンドは、 ブロックの増分を表示する代わりに、 各チェックポイントのブロックカウントを出力する '-b' オプションをサポートしています。 以下の例では、``BLKCNT'' フィールドに、最新のチェックポイントの使用ブロック数が表示されています:

    $ lscp -b -r -n 1
             CNO        DATE     TIME  MODE  FLG      BLKCNT       ICNT
         1863279  2012-03-18 17:07:34   cp    -      5902745     669595
    

    しかしながら、 互換性上の理由でこの機能はデフォルトでは有効になっていません。 正確な値を取得するには、以下のように block_count 機能を mkfs 実行時に有効にしておかなければいけません:

    $ mkfs -t nilfs2 -O block_count device
    

    この機能に対応していない古い NILFS のカーネルモジュールは、 block_count 機能が有効になったパーティションは read-only でしかマウントできません。

  5. NILFSボリュームをリサイズできますか?

    はい、ボリュームサイズの拡大と縮小の両方が可能です。 操作は nilfs-resize コマンドを通じて行います。 この機能は Linux 3.0 以降でのみ利用可能です。 マウントしていないファイルシステムのリサイズは、 現時点で未サポートです。

    詳しくは、nilfs-resize(8) のマニュアルページをご覧下さい。

  6. NILFSボリュームのラベルや UUID の取得・設定・変更はどうやればできますか ?

    nilfs-tune コマンドを使うことで可能です。 詳しくは、nilfs-tune(8) のマニュアルページをご覧下さい。

  7. ".nilfs" ファイルの役割は何ですか? 削除できますか?

    .nilfs は cleanerd と他のユーティリティの排他制御のために利用されていました。 このファイルは、nilfs-utils 2.1 以降では使われておらず、 削除可能です。 mkfs.nilfs2 は今もこのファイルを生成しますが、 それは古い環境でも問題なく利用できるようにするためです。

    .nilfs は通常ファイルであり、 NILFS2 のカーネルモジュールはこのファイルには依存しません。

  8. cleanerd (もしくは chcpコマンド, mkcp コマンド)が ``cannot open nilfs on /dev/xxx: Function not implemented'' というエラーで失敗します。

    tmpfs (元 shm fs)が /dev/shm にマウントされていることを確認下さい。 POSIXセマフォは、/dev/shm 上のファイルシステムが tmpfs でない場合には利用できず、上記のエラーを引き起こします。

    システムによっては、tmpfs の代わりに ramfs を用いている場合があります。 tmpfs を有効にするためには、 カーネルのコンフィギュレーションを変更し、 カーネルを再構築しなければいけない場合があります。

  9. lscp コマンドや cleanerd が ``Inappropriate ioctl for device'' というエラーで失敗します。

    NILFS は、32-bit 64-bit間の互換性の問題を解消するために、 Linuxカーネル統合前に、 一度 ioctlのインタフェースを変更しています。 Debian 5.0 (lenny) や Ubuntu 9.04 (Jaunty)もしくはそれ以前に 含まれるユーティリティパッケージ(nilfs2-tools)は、 この変更前のものであるため、現在の NILFS と組み合せて使用するとこのエラーが発生します。

    この問題を避けるには、本サイトで提供している nilfs-utils の最新版を御利用下さい。 (ソースからのコンパイル、インストールが必要です)

  10. mount が ``cannot find or load nilfs2 filesystem'' というエラーで失敗します。

    このエラーは、通常 nilfs2 ファイルシステムがシステムに登録されていない場合に生じます。 lsmod コマンドで、nilfs2 モジュールがロードされているか確認して下さい。もしなければ、 insmod コマンドを使って手動でモジュールをロードするか、 depmod コマンドで /lib/modules/kernel-version 配下のモジュール依存関係ファイルを更新することをお試し下さい。

    # lsmod | grep nilfs2
    # insmod /path-to/nilfs2.ko
    
  11. /etc/mtab がシンボリックリンクになっていて、mount がアボートします:

    # mount -t nilfs2 /dev/sdb1 /nilfs
    Please remount the partition with -f option after making /etc/mtab writable.
    nilfs_cleanerd not started
    # ls -la /etc/mtab
    lrwxrwxrwx. 1 root root 12 Aug  6  2011 /etc/mtab -> /proc/mounts
    

    libmount オプションを指定して、nilfs-utils パッケージをソースからコンパイル・インストールしてみて下さい:

    $ cd nilfs-utils
    $ ./configure --enable-libmount
    $ make
    $ sudo make install
    

    コンパイルには libmount-devel パッケージが必要になるかもしれません。

  12. ハングしました。

    以下の方法でカーネルの magic sysrq 機能を使ってスタックダンプを取得し、 送っていただけると助かります。 御協力宜しくお願いします。

    # echo t > /proc/sysrq-trigger
    # dmesg
    
  13. NILFS がコンパイルされません。

    menuconfig で以下のオプションを設定して下さい。

    カーネル2.6.32以降:

     # cd linux-2.6.x
     # make menuconfig
         General setup --->
            [*] Prompt for development and/or incomplete code/drives
         File systems --->
            <M> NILFS2 file system support (EXPERIMENTAL)
         Library routines --->
            -*- CRC32 functions
    

    カーネル2.6.30と2.6.31:

     # cd linux-2.6.x
     # make menuconfig
         General setup --->
            [*] Prompt for development and/or incomplete code/drives
         File systems --->
            [*] Miscellaneous filesystems --->
                <M> NILFS2 file system support (EXPERIMENTAL)
         Library routines --->
            -*- CRC32 functions
    
  14. 2.6.29以前のLinux カーネルのソースツリーでNILFSをコンパイルできますか?

    Oleg Volkovさん提供のパッチで、nilfs2 のモジュールパッケージを Linux のソースツリーでコンパイルできるようになります。 手順は以下のとおりです。

    # cd /usr/src/
    # wget http://www.nilfs.org/download/nilfs-2.0.12.tar.bz2
    # wget http://www.nilfs.org/pub/patch/nilfs-in-tree-build.patch
    # tar -jxf nilfs-2.0.12.tar.bz2
    # mv nilfs-2.0.12/fs linux/fs/nilfs
    # rm -rf nilfs-2.0.12
    # cd linux
    # patch -p 1 < ../nilfs-in-tree-build.patch
    # make menuconfig
    
    File systems  --->
     <*> NILFS
    
    # make
    # make install
    

    パッチは, http://www.nilfs.org/pub/patch/nilfs-in-tree-build.patch. から取得できます。 (Oleg Volkov さん, パッチ提供ありがとうございます。)

  15. diff コマンドで, 読み込み専用でマウントしたスナップショットのファイルと現在のファイルを比較したのですが, あるはずの差分が報告されません。

    diff コマンドは, 2つのファイル (またはディレクトリ) の所属するブロックデバイスとその inode 番号が一致すると, 実体が同じだとみなして, ファイルの中身を比較しない最適化がなされます。
    これは、現在の NILFS のスナップショットが抱える本質的な課題の一つです。

    参考までに、diff プログラム用の暫定対処パッチを用意しました。 このパッチを適用して生成された diff プログラムは、inode 番号と ctime が両方とも一致しない限り2つのファイル・ディレクトリを同一とみなさなくなり、上記の問題は回避されます。