AuFS (Advanced multi layered unification filesystem) のインストール

Raspberry Pi で fsprotect をやりたいので、aufs をインストールします。aufs を使うには、カーネル側のコードと、ユーザーランドのコードが必要です。配布元はここです。

1. まず、カーネルコードを入手します。今回は、Raspbian のカーネルソースを使いたいので、aufs3-linux ではなく aufs3-standalone を使います。

host$ cd ~/work
host$ git clone git://git.code.sf.net/p/aufs/aufs3-standalone

Raspbian のカーネルには 3.10.x を使っているので、aufs もそれに合わせます。

host$ cd aufs3-standalone
host$ git checkout aufs3.10.x

2. aufs3-standalone 下にある README を読んで、カーネルにパッチを当てます。具体的には、

host$ cd ~/work/linux
host$ patch -p1 < ../aufs3-standalone/aufs3-kbuild.patch
host$ patch -p1 < ../aufs3-standalone/aufs3-base.patch
host$ patch -p1 < ../aufs3-standalone/aufs3-mmap.patch

上記で何かしらエラーが出ていたら、patch コマンドをどこかで勉強してください。(^^;)
今回はカーネルモジュールにはしない(直接カーネルに埋め込む)ので、パッチはここまです。次に、追加ファイルをコピーします。

host$ cp -R ../aufs3-standalone/Documentation/* Documentation/
host$ cp -R ../aufs3-standalone/fs/* fs/
host$ cp -R ../aufs3-standalone/include/uapi/linux/aufs_type.h include/uapi/linux/

3. 次に、.config に AUFS_FS を追加します。

host$ make ARCH=arm CROSS_COMPILE=$MYCC menuconfig

として、File systems -> Miscellaneous filesystems -> Aufs support を選び、スペースキーで <*> を付けます。最後に、.config にセーブします。
4. カーネルをビルドします。

host$ make ARCH=arm CROSS_COMPILE=$MYCC
host$ make ARCH=arm CROSS_COMPILE=$MYCC modules

先ほどと同様に、できたカーネルと modules を rpi にコピーします。(上述の説明を参考ください。) config.txt も確認し、必要なら編集します。
5. 次に、ヘッダファイルを作ります。後で aufs utilities をビルドするときに必要です。

host$ make ARCH=arm CROSS_COMPILE=$MYCC headers_install
host$ cd usr/include && tar cf ../../includes.tar . && gzip ../../includes.tar
host$ sftp rpi
sftp> cd tmp
sftp> mput ../../includes.tar.gz
sftp> quit
rpi$ mkdir ~/tmp/include
rpi$ cd ~/tmp/include && zcat ~/tmp/includes.tar.gz | tar xf -

6. rpi をリブートします。
7. 次に、aufs-util をビルドします。ここでは、rpi 上でビルドすることにします。(必要なツールは多いが、そのほうが簡単そう。) 以下、Git やコンパイラが rpi にインストールされているものと仮定します。その辺は、Google で調べてください。今回は省略します。
なお、checkout では aufs3.9 を指定しています。本日現在、これが最新のように見えます。

rpi$ cd ~/tmp
rpi$ git clone git://git.code.sf.net/p/aufs/aufs-util
rpi$ cd aufs-util
rpi$ git checkout aufs3.9

次に、aufs のヘッダファイルが必要ですが、上記でコピーしたものを使います。/usr/include に上書きするのは(私は)怖いので、コンパイラの -I オプションで逃げます。Makefile

CFLAGS += -I./libau

を、

CFLAGS += -I./libau -I${HOME}/tmp/include

のように書き換え、

rpi$ make
rpi$ sudo make install

します。もし、make 中に Wrong version! とか怒られた場合は、~/tmp/include ではなくて /usr/include のヘッダファイルを参照してしまっていると思われます。上記 Makefile の上記の変更を確認してください。
8. 最後に動作確認します。まず、上記で rpi をリブートしていたら、

rpi$ dmesg | fgrep -i aufs
[    1.244082] aufs 3.10.x-20140602

のように、カーネルに取り込まれていることを確認します。次に、AuFS のドキュメントにあるように、

rpi$ mkdir /tmp/rw /tmp/aufs
rpi$ sudo mount -t aufs -o br=/tmp/rw:${HOME} none /tmp/aufs

とし、/tmp/aufs がホームディレクトリのクローンのように見え、さらに /tmp/aufs に何かファイルを作ったときに、ホームディレクトリには影響がなければ、aufs は動いていると思います。詳細は aufs のドキュメントを参照ください。
完了です。