Raspberry Piのカーネルにパッチ(aufs)当て&ビルド

# やること&やり方
Raspberry Piで1番有名なOSである、Raspbianでfsprotectを使うために、カーネルにaufsのパッチを当ててビルドしなければいけません。

Raspberry Pi自身でカーネルをビルドかけると、あまりにも時間がかかり待てないので、x64マシンでクロスコンパイルをかけて、カーネルだけをRaspberry Piに持っていくというやり方を行います。

# ビルド環境

OS : Ubuntu 14.10 64bit
workspace : `~/raspberrypi_work/`



# 作業手順

## 事前準備

Raspberry Pi上で、カーネル他ソフトウェアをアップデートする。

```shell-session
$ sudo apt-get update
$ sudo apt-get upgrade
```

## 環境構築

ここからの作業はUbuntu上で行います。
まず、作業に必要なパッケージをインストールする。

```shell-session
$ sudo apt-get install lib32ncurses5 lib32z1 libncurses5-dev gcc-arm-linux-gnueabi make libncurses5-dev git
```

Raspberry Pi用のカーネルソースをダウンロード。
この状態で、最新のカーネルをダウンロードされます。
もし、別のバージョンが欲しいときは、checkoutするブランチを変更してください。

```shell-session
~/raspberrypi_work$ git clone git://github.com/raspberrypi/linux.git
```

コンパイル時に必要なツールをダウンロード

```shell-session
~/raspberrypi_work$ git clone git://github.com/raspberrypi/tools.git
```

## aufsのパッチを適用する

aufsのダウンロード

```shell-session
~/raspberrypi_work/linux$ git clone git://git.code.sf.net/p/aufs/aufs3-standalone aufs-aufs3-standalone
~/raspberrypi_work/linux/aufs-aufs3-standal$ git checkout aufs3.18.1+
```

ビルドに必要なものをコピー

```shell-session
~/raspberrypi_work/linux/aufs-aufs3-standalone$ cp -rp fs/ ../
~/raspberrypi_work/linux/aufs-aufs3-standalone$ cp -rp Documentation/ ../
~/raspberrypi_work/linux/aufs-aufs3-standalone$ cp -rp include/uapi/linux/aufs_type.h ../include/uapi/linux/
```

カーネルにパッチを当てる

```shell-session
~/raspberrypi_work/linux$ patch -p1 < aufs-aufs3-standalone/aufs3-kbuild.patch
~/raspberrypi_work/linux$ patch -p1 < aufs-aufs3-standalone/aufs3-base.patch
~/raspberrypi_work/linux$ patch -p1 < aufs-aufs3-standalone/aufs3-mmap.patch
```

##  ビルド

環境変数にクロスコンパイルの設定を追加

```shell-session
$ export MYCC=${HOME}/raspberrypi_work/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-
```

実行中のRaspberry Piからコンパイル時のオプションを取得

```shell-session
~/raspberrypi_work/linux$ scp pi@RaspberryPiのIPアドレス:/proc/config.gz ./
~/raspberrypi_work/linux$ zcat config.gz > .config
```

menuconfigでaufsを有効化する。
File systems > Miscellaneous filesystems > Aufs (Advanced multi layered unification filesystem) support を<*>にする

```shell-session
~/raspberrypi_work/linux$ make ARCH=arm CROSS_COMPILE=$MYCC menuconfig
```

カーネルのバージョンを修正する。
"EXTRAVERSION"に内容を追加する。

```shell-session
~/raspberrypi_work/linux$ vi Makefile

EXTRAVERSION = -aufs
```

カーネルのビルド

```shell-session
~/raspberrypi_work/linux$ make ARCH=arm CROSS_COMPILE=$MYCC
```

モジュールのビルド

```shell-session
~/raspberrypi_work/linux$ make ARCH=arm CROSS_COMPILE=$MYCC modules
```

## Raspberry Piにデータのコピー

Raspberry Piにカーネルとモジュールを持っていくための準備をします。
まずは、カーネルモジュールを出力し、tar.gzで固める。

```shell-session
~/raspberrypi_work/linux$ make ARCH=arm CROSS_COMPILE=$MYCC INSTALL_MOD_PATH=../tmp/rpimod modules_install
~/raspberrypi_work/tmp/rpimod$ tar zcvf rpimod.tar.gz ./lib/modules
```

Raspberry Piにコピーします。

```shell-session
~/raspberrypi_work$ scp linux/arch/arm/boot/Image pi@RaspberryPiのIPアドレス:/boot/kernel_new.img
~/raspberrypi_work$ scp tmp/rpimod/rpimod.tar.gz pi@RaspberryPiのIPアドレス:~/rpimod.tar.gz
```

## Raspberry Piに適用する

ここからは、Raspberry Piで作業します。
まず、カーネルを置き換える。

```shell-session
~# mv /boot/kernel.img /boot/kernel.img_orz
~# mv /home/pi/kernel_new.img /boot/kernel.img
```

次に、カーネルモジュールを適用する。

```shell-session
~# tar zxvf /home/pi/rpimod.tar.gz
~# cp -R lib/modules/3.18.6-aufs+ /lib/modules/
```

最後に、再起動して置き換えたカーネルで起動させる。

```shell-session
~# reboot
```

## 確認

置き換えたカーネルで起動したかを確認する。

```shell-session
~$ uname -a
3.18.6-aufs+
```