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 のドキュメントを参照ください。
完了です。