PCリンクスでは、パソコンの設定・修理から組込み機器の受託開発まで承ります。

 

Raspberry Pi でカーネルにaufsを組み込む

4回目の今回は、Raspberry Piでaufsをカーネルに組み込み、再構築を行います。

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」選択します。

kernel config 01 Raspberry Piでカーネル再構築

既存のカーネル設定「.config」を読み込んでからaufsを有効化します。

kernel config 02 Raspberry Piでカーネル再構築

initramfsの設定を行います。
# General Setup
[ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support を選択して [*] を表示させます。

kernel config 03 Raspberry Piでカーネル再構築

File system を選択します。

kernel config 04 Raspberry Piでカーネル再構築

[*] Miscellaneous filesystems を選択します。

kernel config 05 Raspberry Piでカーネル再構築

<*> Aufs (Advanced multi layered unification filesystem) support を追加します。
[*] NFS-exportable aufs , Rams(initramfs/rootfs) as an aufs branch , Fuse fs an sufs branch を追加します。

kernel config 06 Raspberry Piでカーネル再構築

変更内容をsaveします。

kernel config 07 Raspberry Piでカーネル再構築

.configをセーブ(上書き)します。

kernel config 08 Raspberry Piでカーネル再構築

 

.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を組み込む」を終了します。

コメント

コメントを受け付けておりません。