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 コマンドによるディスク使用量は、 過去のデータを含んでいるように思われます。 「現在のファイルシステム」のディスク使用量を取得するには どうすれば良いでしょうか?

    バージョン 2.2.0 以降の nilfs-utils に含まれる lscp コマンドは、各チェックポイントのブロックカウントを出力します。 より以前のバージョンでは、ブロックカウントの表示には '-b' オプション(バージョン2.0.22 以降でのみ利用可能)の指定が必要です。

    以下の例では、``BLKCNT'' フィールドに、 最新のチェックポイントの使用ブロック数が表示されています:

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

    しかしながら、 この機能は古い NILFS カーネルモジュールでは利用できません。 さらに悪いことに、これらレガシーモジュールは、 ブロック数の情報そのものを壊してしまいます。 このため、問題を防ぐため、以下のように mkfs コマンドで ファイルシステムを作成する際、block_count 機能を有効にしておくことをお勧めします。

    $ mkfs -t nilfs2 -O block_count device
    

    block_count 機能が有効になったパーティションは、 問題のある古い NILFS モジュールによる read/write モードのマウントを受け付けなくなります。

  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 を有効にするためには、 カーネルのコンフィギュレーションを変更し、 カーネルを再構築しなければいけない場合があります。 以下のように CONFIG_SHMEM と CONFIG_TMPFS の2つのオプションをチェックして下さい。

     # cd linux
     # make menuconfig
         General setup --->
            [*] Use full shmem filesystem
         File systems --->
            Pseudo filesystems --->
                [*] Tmpfs virtual memory file system support (former shm fs)
    
  9. cleanerd もしくは他の NILFS ツールが ``cannot open nilfs on /dev/xxx: No such file or directory'' というエラーで失敗します。

    /proc/mounts 中の対応するデバイスノードが、実際に存在することを確認下さい。 NILFS ライブラリは、指定されたデバイスが /proc/mounts にないと失敗します。 ここで、デバイスが一致するかどうかは、デバイスノードのパス名の正規形が等しいかどうかで判定されます。

    システムによっては、/proc/mounts 中でルートデバイスノードが /dev/root に置き換えられている場合があります。 このような場合、もし /dev/root が実デバイスに対する有効なエイリアスや有効なシンボリックリンクになっていないと、上記エラーが発生します。

  10. cleanerd が ``cannot create mqueue on /dev/xxx: Function not implemented'' というエラーで起動に失敗します。

    POSIX mqueue がご利用のカーネルで有効になっているかご確認下さい。 有効になっていない場合は、以下のように CONFIG_POSIX_MQUEUE オプションをチェックしてカーネルを再構築します。

     # cd linux
     # make menuconfig
         General setup --->
            [*] POSIX Message Queues
    
  11. 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 の最新版を御利用下さい。 (ソースからのコンパイル、インストールが必要です)

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

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

    # lsmod | grep nilfs2
    # insmod /path-to/nilfs2.ko
    
  13. /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 --with-libmount
    $ make
    $ sudo make install
    

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

  14. NILFSボリュームに対する書き込みが ``Permission denied'' エラーで失敗します。

    SELinux が有効になってないかご確認下さい。 NILFS では SELinux の機能は完全には使用できないため、SELinux が有効化されたシステムではこのエラーに遭遇するかもしれません。 これが問題になる場合には、SELinux のコンテクストマウント (context=, fscontext=, defcontext=, あるいは rootcontext=) をお試し下さい。 コンテクストマウントオプションを用いることで、ボリューム単位で SELinux のポリシーを指定できるようになります。

    # mount -t nilfs2 -o context=system_u:object_r:public_content_t:s0 /dev/sdb1 /nilfs
    

    この機能は nilfs-utils 2.1 以降で利用できます。 (ただし、libmount ライブラリ未対応の環境では、nilfs-utils 2.1.4 以降が必要です。)

    また、以下のコマンドで SELinux を permissive モードに切り替えることで、一時的に NILFS ボリュームへの書き込みが可能になります。

    $ sudo setenforce 0
    

    この操作を毎回行わないようにするには、 以下のように設定ファイルを書き換えて再起動を行い、 SELinux を固定的に無効化します。

    $ sudo vi /etc/sysconfig/selinux
    (SELINUX=行を書き換え)
    #
    SELINUX=disabled
    #
    ..
    $ sudo reboot
    
  15. nilfs-utils のソースパッケージのインストール中(make install 実行中)に``libtool: install: warning: relinking 'libnilfsgc.la' '' というメッセージが出力されます。

    このメッセージは無害であり、無視できます。 nilfs-utils の共有ライブラ libnilfsgc が、同じ nilfs-utils に含まれる共有ライブラリ libnilfs に依存しているため、 libtool が libnilfsgc をインストールする際、 自動的に再リンクを行うため出力されています。

  16. ハングしました。

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

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

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

     # cd linux-6.x
     # make menuconfig
         File systems --->
            <M> NILFS2 file system support
         Library routines --->
            -*- CRC32/CRC32c functions
    

    ただし、カーネル 3.8 以前では、 EXPERIMENTAL マークの付いたコード・ドライバを有効化しないと NILFS2 はメニューに現れません。

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

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

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

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