やること&やり方
Raspberry Piで1番有名なOSである、Raspbianでfsprotectを使うために、カーネルにaufsのパッチを当ててビルドしなければいけません。
今回は Raspberry Pi 2バージョンです。
Raspberry Pi自身でカーネルをビルドかけると、あまりにも時間がかかり待てないので、x64マシンでクロスコンパイルをかけて、カーネルだけをRaspberry Piに持っていくというやり方を行います。
ビルド環境
OS : Ubuntu 14.10 64bit
workspace : ~/raspberrypi2_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するブランチを変更してください。
~/raspberrypi2_work$ git clone git://github.com/raspberrypi/linux.git
コンパイル時に必要なツールをダウンロード
~/raspberrypi2_work$ git clone git://github.com/raspberrypi/tools.git
aufsのパッチを適用する
aufsのダウンロード
~/raspberrypi2_work/linux$ git clone git://git.code.sf.net/p/aufs/aufs3-standalone aufs-aufs3-standalone
~/raspberrypi2_work/linux/aufs-aufs3-standal$ git checkout aufs3.18.1+
ビルドに必要なものをコピー
~/raspberrypi2_work/linux/aufs-aufs3-standalone$ cp -rp fs/ ../
~/raspberrypi2_work/linux/aufs-aufs3-standalone$ cp -rp Documentation/ ../
~/raspberrypi2_work/linux/aufs-aufs3-standalone$ cp -rp include/uapi/linux/aufs_type.h ../include/uapi/linux/
カーネルにパッチを当てる
~/raspberrypi2_work/linux$ patch -p1 < aufs-aufs3-standalone/aufs3-kbuild.patch
~/raspberrypi2_work/linux$ patch -p1 < aufs-aufs3-standalone/aufs3-base.patch
~/raspberrypi2_work/linux$ patch -p1 < aufs-aufs3-standalone/aufs3-mmap.patch
ビルド
環境変数にクロスコンパイルの設定を追加
$ export MYCC=${HOME}/raspberrypi2_work/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
実行中のRaspberry Piからコンパイル時のオプションを取得
~/raspberrypi2_work/linux$ scp pi@RaspberryPiのIPアドレス:/proc/config.gz ./
~/raspberrypi2_work/linux$ zcat config.gz > .config
menuconfigでaufsを有効化する。
File systems > Miscellaneous filesystems > Aufs (Advanced multi layered unification filesystem) support を<*>にする
~/raspberrypi2_work/linux$ make ARCH=arm CROSS_COMPILE=$MYCC menuconfig
カーネルのバージョンを修正する。
"EXTRAVERSION"に内容を追加する。
~/raspberrypi2_work/linux$ vi Makefile
EXTRAVERSION = -aufs
カーネルのビルド
~/raspberrypi2_work/linux$ make ARCH=arm CROSS_COMPILE=$MYCC -j [CPUのコア数x1.5]
モジュールのビルド
~/raspberrypi2_work/linux$ make ARCH=arm CROSS_COMPILE=$MYCC modules
Raspberry Piにデータのコピー
Raspberry Piにカーネルとモジュールを持っていくための準備をします。
まずは、カーネルモジュールを出力し、tar.gzで固める。
~/raspberrypi2_work/linux$ make ARCH=arm CROSS_COMPILE=$MYCC INSTALL_MOD_PATH=../tmp/rpimod modules_install
~/raspberrypi2_work/tmp/rpimod$ tar zcvf rpimod.tar.gz ./lib/modules
Raspberry Piにコピーします。
~/raspberrypi2_work$ scp linux/arch/arm/boot/Image pi@RaspberryPiのIPアドレス:kernel7_new.img
~/raspberrypi2_work$ scp tmp/rpimod/rpimod.tar.gz pi@RaspberryPiのIPアドレス:rpimod.tar.gz
Raspberry Piに適用する
ここからは、Raspberry Piで作業します。
まず、カーネルを置き換える。
~# mv /boot/kernel7.img /boot/kernel7.img_orz
~# mv /home/pi/kernel7_new.img /boot/kernel7.img
次に、カーネルモジュールを適用する。
~# tar zxvf /home/pi/rpimod.tar.gz
~# cp -R lib/modules/3.18.6-aufs+ /lib/modules/
最後に、再起動して置き換えたカーネルで起動させる。
~# reboot
確認
置き換えたカーネルで起動したかを確認する。
~$ uname -a
3.18.9-aufs-v7+
バージョン情報はその時々のソースで変わります。