やること&やり方
Raspberry Piで1番有名なOSである、Raspbianでfsprotectを使うために、カーネルにaufsのパッチを当ててビルドしなければいけません。
Raspberry Pi自身でカーネルをビルドかけると、あまりにも時間がかかり待てないので、x64マシンでクロスコンパイルをかけて、カーネルだけをRaspberry Piに持っていくというやり方を行います。
ビルド環境
OS : Ubuntu 14.10 64bit
workspace : ~/raspberrypi_work/
作業手順
事前準備
Raspberry Pi上で、カーネル他ソフトウェアをアップデートする。
$ sudo apt-get update
$ sudo apt-get upgrade
環境構築
ここからの作業はUbuntu上で行います。
まず、作業に必要なパッケージをインストールする。
$ sudo apt-get install lib32ncurses5 lib32z1 libncurses5-dev gcc-arm-linux-gnueabi make libncurses5-dev git
Raspberry Pi用のカーネルソースをダウンロード。
この状態で、最新のカーネルをダウンロードされます。
もし、別のバージョンが欲しいときは、checkoutするブランチを変更してください。
~/raspberrypi_work$ git clone git://github.com/raspberrypi/linux.git
コンパイル時に必要なツールをダウンロード
~/raspberrypi_work$ git clone git://github.com/raspberrypi/tools.git
aufsのパッチを適用する
aufsのダウンロード
~/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+
ビルドに必要なものをコピー
~/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/
カーネルにパッチを当てる
~/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
ビルド
環境変数にクロスコンパイルの設定を追加
$ export MYCC=${HOME}/raspberrypi_work/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-
実行中のRaspberry Piからコンパイル時のオプションを取得
~/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 を<*>にする
~/raspberrypi_work/linux$ make ARCH=arm CROSS_COMPILE=$MYCC menuconfig
カーネルのバージョンを修正する。
"EXTRAVERSION"に内容を追加する。
~/raspberrypi_work/linux$ vi Makefile
EXTRAVERSION = -aufs
カーネルのビルド
~/raspberrypi_work/linux$ make ARCH=arm CROSS_COMPILE=$MYCC
モジュールのビルド
~/raspberrypi_work/linux$ make ARCH=arm CROSS_COMPILE=$MYCC modules
Raspberry Piにデータのコピー
Raspberry Piにカーネルとモジュールを持っていくための準備をします。
まずは、カーネルモジュールを出力し、tar.gzで固める。
~/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にコピーします。
~/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で作業します。
まず、カーネルを置き換える。
~# mv /boot/kernel.img /boot/kernel.img_orz
~# mv /home/pi/kernel_new.img /boot/kernel.img
次に、カーネルモジュールを適用する。
~# tar zxvf /home/pi/rpimod.tar.gz
~# cp -R lib/modules/3.18.6-aufs+ /lib/modules/
最後に、再起動して置き換えたカーネルで起動させる。
~# reboot
確認
置き換えたカーネルで起動したかを確認する。
~$ uname -a
3.18.6-aufs+