Raspberry Pi でカーネルにaufsを組み込む
4回目の今回は、Raspberry Piでaufsをカーネルに組み込み、再構築を行います。
- 1回目:Raspberry Pi でOSのインストールと初期設定を行う
- 2回目:Raspberry Pi で使用しないデーモンを停止する
- 3回目:Raspberry Pi でRAMディスクを使う
- 4回目:Raspberry Pi でカーネルにaufsを組み込む
- 5回目:Raspberry Pi で消費電流を測定する
- 6回目:Raspberry Pi でSoftEther VPN 1.0 RC2を試す
- 7回目:SoftEther VPN 1.0 RC2でtapデバイスを試す
- 8回目:Raspberry Pi でAsteriskを試す
- 9回目:Raspberry Pi でfsprotectを試す
Raspberry Piでは、HDDの代わりにSDカードにOS(Raspbian)を格納しています。
SDカードは、価格も安く、小さくて良いことずくめのようですが、書き換え寿命というものが存在します。
このSDカードのウィークポイントを回避して、信頼性を高める方策として、最終的には、ファイルシステムをリードオンリーとしてマウントします。(fsprotectパッケージをインストールして対応する予定です)
その為の準備作業として、ちょっと大変な作業となりますが、aufs(AnotherUnionFS) をカーネルに組み込み再構築を行います。
※リードオンリーでマウントすると、突然の電源断によるファイルシステムの破損の可能性もなくなります。
カーネルのコンパイル環境の整備
最初に、uptadeとupgradeを実行します。
[root@ms03 ~]# apt-get update [root@ms03 ~]# apt-get upgrade
次に、カーネルコンパイル環境を整えるために、開発環境をまとめてインストールします。
[root@ms03 ~]# apt-get -y install libncurses5-dev libxml2-dev subversion libssl-dev libspandsp-dev libsqlite3-dev sqlite3 libgtk2.0-dev libslang2-dev libnewt-dev libghc-zlib-dev libkrb5-dev git libreadline6-dev
カーネル再構築の準備
fsprotectパッケージを動作させるためには、aufsがカーネルに組み込まれている必要がありますので、カーネルを再構築します。
※aufsとは、ReadOnlyのファイルシステムとReadWriteのファイルシステムをマージして、ひとつの読み書き可能なファイルシステムのように見せかけるものです。
ソースコードのダウンロード先へ移動して、githubからraspberry Pi 用の最新版のソースコードを取得します。
[root@ms03 ~]# cd /usr/src [root@ms03 src]# git clone --depth 1 https://github.com/raspberrypi/linux.git
作成されたlinuxディレクトリにシンボリックリンクを張ります。
[root@ms03 src]# ln -s linux linux-3.6.11+
linuxディレクトリへ移動して、aufsのパッチを入手します。
[root@ms03 linux]# git clone git://aufs.git.sourceforge.net/gitroot/aufs/aufs3-standalone.git
aufs3-standaloneディレクトリへ移動して、git checkout origin/aufs3.6 を実行します。
[root@ms03 linux]# cd aufs3-standalone/ [root@ms03 aufs3-standalone]# git checkout origin/aufs3.6
パッチファイルがダウンロードされていることを確認します。
[root@ms03 aufs3-standalone]# ll -rw-r--r-- 1 root root 17990 3月 2 17:55 COPYING drwxr-xr-x 4 root root 4096 3月 2 17:55 Documentation -rw-r--r-- 1 root root 1384 3月 2 17:55 Makefile lrwxrwxrwx 1 root root 39 3月 2 17:55 README -> ./Documentation/filesystems/aufs/README -rw-r--r-- 1 root root 2902 3月 2 17:55 aufs3-base.patch -rw-r--r-- 1 root root 957 3月 2 17:55 aufs3-kbuild.patch -rw-r--r-- 1 root root 8281 3月 2 17:55 aufs3-loopback.patch -rw-r--r-- 1 root root 6959 3月 2 17:55 aufs3-proc_map.patch -rw-r--r-- 1 root root 8103 3月 2 17:55 aufs3-standalone.patch -rw-r--r-- 1 root root 2828 3月 2 17:55 config.mk drwxr-xr-x 3 root root 4096 3月 2 17:55 fs drwxr-xr-x 3 root root 4096 3月 2 17:55 include
fs ,Documentation , includeディレクトリを1つ上のlinuxディレクトリへコピーします。
[root@ms03 aufs3-standalone]# cp -rp fs /usr/src/linux [root@ms03 aufs3-standalone]# cp -rp Documentation/ /usr/src/linux [root@ms03 aufs3-standalone]# cp -rp include/linux/aufs_type.h /usr/src/linux/include/linux/
1つ上のlinuxディレクトリへ移動して、パッチを適用します。
※aufs3-standalone.patchは、aufsをモジュールとしてカーネルに組み込む場合に適用するパッチなので、今回は適用しません。
[root@ms03 aufs3-standalone]# cd .. [root@ms03 linux]# patch -p1 < aufs3-standalone/aufs3-kbuild.patch patching file fs/Kconfig patching file fs/Makefile patching file include/linux/Kbuild [root@ms03 linux]# patch -p1 < aufs3-standalone/aufs3-base.patch patching file fs/inode.c Hunk #1 succeeded at 1503 (offset 12 lines). patching file fs/splice.c patching file include/linux/fs.h patching file include/linux/splice.h [root@ms03 linux]# patch -p1 < aufs3-standalone/aufs3-proc_map.patch patching file fs/buffer.c Hunk #1 succeeded at 2355 with fuzz 2 (offset 38 lines). patching file fs/proc/nommu.c patching file fs/proc/task_mmu.c patching file fs/proc/task_nommu.c patching file include/linux/mm_types.h patching file kernel/fork.c patching file mm/memory.c patching file mm/mmap.c patching file mm/nommu.c
稼働中のカーネル設定を.configファイルにコピーします。
[root@ms03 linux]# zcat /proc/config.gz > .config
設定メニュー「make menuconfig」を実行して、aufsを有効化させます。
※aufsはモジュール化せずに、静的にカーネルへ組み込むようにします。
[root@ms03 linux]# make menuconfig
メニュー画面で「Load an Alternate Configuration File」選択します。
既存のカーネル設定「.config」を読み込んでからaufsを有効化します。
initramfsの設定を行います。
# General Setup
[ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support を選択して [*] を表示させます。
File system を選択します。
[*] Miscellaneous filesystems を選択します。
<*> Aufs (Advanced multi layered unification filesystem) support を追加します。
[*] NFS-exportable aufs , Rams(initramfs/rootfs) as an aufs branch , Fuse fs an sufs branch を追加します。
変更内容をsaveします。
.configをセーブ(上書き)します。
.config設定の変更が正しく実施できたことを確認します。
※CONFIG_BLK_DEV_INITRD=y , CONFIG_AUFS_FS=y ならOKです。
[admin@ms03 linux]# cat .config |grep CONFIG_BLK_DEV_INITRD CONFIG_BLK_DEV_INITRD=y [admin@ms03 linux]# cat .config |grep CONFIG_AUFS_FS CONFIG_AUFS_FS=y
aufsをカーネルに組み込むので、カーネルカーネルバージョンを設定し、修正履歴を残すようにします。
EXTRAVERSION = に適当な表示を追加します。今回の例では”-aufs”を追加しています。
[root@ms03 linux]# pico Makefile VERSION = 3 PATCHLEVEL = 6 SUBLEVEL = 11 EXTRAVERSION = -aufs NAME = Terrified Chipmunk
カーネルの再構築(ビルド)
コンパイルを実行する前に、make cleanを実行しておきます。
[root@ms03 linux]# make clean
makeコマンドで、設定したコンフィギュレーションを元に、カーネルとモジュールをコンパイルします。
コンパイルは、1GHz動作で約5時間(700MHz動作時は約8時間)程かかりますので、気長に待ちます。
※コンパイルされたカーネルは、arch/arm/bootへ”Image”という名称で配置されます。
※コンパイルされたモジュールは、各サブディレクトリの下に配置されます。
[root@ms03 linux]# make
モジュールのインストール
すでにmakeコマンドで各サブディレクトリ配下にモジュールが作成されていますので、各モジュールをインストールします。
既にmodulesディレクトリには、3.6.11+ディレクトリが存在していますので、バックアップしておきます。
[root@ms03 linux]# mv /lib/modules/3.6.11+ /lib/modules/3.6.11+.bak
make modules_installコマンドで、モジュールを所定のディレクトリ(/lib)へインストールします。
[root@ms03 linux]# make modules_install
カーネルのインストール
ビルドした新しいカーネルイメージを /boot にコピーします。
古いカーネルは、バックアップしておきます。
[root@ms03 linux]# uname -a Linux ms03 3.6.11+ #371 PREEMPT Thu Feb 7 16:31:35 GMT 2013 armv6l GNU/Linux [root@ms03 linux]# mv /boot/kernel.img /boot/kernel.img.bak [root@ms03 linux]# cp arch/arm/boot/Image /boot/kernel.img
ここで、OSを再起動させると、新しいカーネルで起動しますので、カーネルバージョンを確認しておきます。
[root@ms03 linux]# reboot [root@ms03 ~]# uname –a Linux ms03 3.6.11-aufs+ #1 PREEMPT Sun Mar 3 01:32:00 JST 2013 armv6l GNU/Linux
ファームウェアとブートローダーのアップデート
GPUのファームウェア(start.elf)とブートローダー(bootcode.bin)をアップデートする場合は、下記の手順で、アップデートを行います。
※aufsを組み込んだカーネルを再構築していますので、rpi-update コマンドでのアップデートは禁止です。
現在のファームウェアバージョンを確認しておきます。
[root@ms03 ~]# /opt/vc/bin/vcgencmd version Feb 7 2013 16:40:41 Copyright (c) 2012 Broadcom version 367973 (release)
ファームウェア格納先へ移動して、gitコマンドで必要なファイルをダウンロードします。
[root@ms03 ~]# cd /usr/src [root@ms03 src]# git clone https://github.com/raspberrypi/firmware.git Cloning into 'firmware'... remote: Counting objects: 31625, done. remote: Compressing objects: 100% (7437/7437), done. remote: Total 31625 (delta 21858), reused 31210 (delta 21456) Receiving objects: 100% (31625/31625), 980.82 MiB | 84 KiB/s, done. Resolving deltas: 100% (21858/21858), done. Checking out files: 100% (1679/1679), done.
書き換え予定のファイルをバックアップした後、ダウンロードしたstart.elfと、bootcode.binを /boot へコピーします。
[root@ms03 src]# cp /boot/bootcode.bin /boot/bootcode.bin.bak [root@ms03 src]# cp /boot/start.elf /boot/start.elf.bak [root@ms03 src]# cp firmware/boot/start.elf /boot/start.elf cp: `/boot/start.elf' を上書きしますか? y [root@ms03 src]# cp firmware/boot/bootcode.bin /boot/ cp: `/boot/bootcode.bin' を上書きしますか? y
ここで、一旦、OSを再起動させて、ファームウェアのバージョンを確認します。
[root@ms03 src]# reboot [root@ms03 ~]# /opt/vc/bin/vcgencmd version Feb 7 2013 16:40:41 Copyright (c) 2012 Broadcom version 367973 (release)
以上で、「Raspberry Pi でカーネルにaufsを組み込む」を終了します。