- 追加された行はこの色です。
- 削除された行はこの色です。
[[Raspberry Pi]]~
[[Raspbian]]~
#contents
*Raspberry Pi 2 kernel セルフコンパイル [#bfa8e24c]
Raspbian で起動している Raspberry Pi 2 上で kernel をコンパイルする手順です。~
~
arm アーキテクチャーの Linux 環境を作成する場合にはコンパイルの速い x86/x86_64 のクロスコンパイル用ホスト環境を作成して行うことが多いですが、~
Raspberry Pi 2 のように比較的速いマシンであればセルフコンパイルしてしまうという方法もあります。~
USB Wifi のドライバーなどビルド済みの kernel source が必要な場合や kernel のビルドオプションを変えたいといった場合に~
Raspberry Pi 2 だけで作業を完結できます。~
~
以下の手順は Raspbian Wheezy でも Jessie でも共通です。
**必要パッケージ [#w058ea9f]
まず kernel をビルドに必要なパッケージをインストールします。
$ sudo apt-get install bc ncurses-dev
gcc、make、git は最初から入っています。~
~
Wheezy の場合は gcc が 4.6.3、Jessie の場合は gcc が 4.9.2 になります。~
~
この version の違いが kernel source のビルドに影響することはまずありませんが、~
kernel source の外部のドライバーをビルドする際には gcc のオプションやマクロの違いから~
ドライバーの source の修正が必要になる場合があります。
**kernel source 取得 [#h7837d7f]
/usr/src に移動し、git で kernel source を取得します。~
beat@raspberrypi ~ $ cd /usr/src/
beat@raspberrypi /usr/src $ sudo -s
kernel 本体
root@raspberrypi:/usr/src# git clone --depth 1 https://github.com/raspberrypi/linux.git -b rpi-4.1.y
Cloning into 'linux'...
remote: Counting objects: 52876, done.
remote: Compressing objects: 100% (50356/50356), done.
remote: Total 52876 (delta 4012), reused 17583 (delta 1851), pack-reused 0
Receiving objects: 100% (52876/52876), 142.62 MiB | 1.96 MiB/s, done.
Resolving deltas: 100% (4012/4012), done.
Checking connectivity... done.
Checking out files: 100% (49946/49946), done.
firmware
root@raspberrypi:/usr/src# git clone --depth 1 https://github.com/raspberrypi/fi
rmware.git
Cloning into 'firmware'...
remote: Counting objects: 4077, done.
remote: Compressing objects: 100% (2200/2200), done.
remote: Total 4077 (delta 1702), reused 2305 (delta 1576), pack-reused 0
Receiving objects: 100% (4077/4077), 75.59 MiB | 1.21 MiB/s, done.
Resolving deltas: 100% (1702/1702), done.
Checking connectivity... done.
Checking out files: 100% (3777/3777), done.
2015年10月15日現在 rpi-4.1.y branch は 4.1.10 kernel になっています。
**ビルド準備 [#zec354eb]
checkout した kernel source のディレクトリに移動し、~
configs モジュールをロードして現在起動中の kernel の config を取得、~
ビルドの準備をします。
root@raspberrypi:/usr/src/linux# cd linux
root@raspberrypi:/usr/src/linux# modprobe configs
root@raspberrypi:/usr/src/linux# zcat /proc/config.gz > .config
root@raspberrypi:/usr/src/linux# cp ../firmware/extra/Module7.symvers Module.symvers
config の反映
root@raspberrypi:/usr/src/linux# make oldconfig
scripts/kconfig/conf --oldconfig Kconfig
#
# configuration written to .config
#
現在起動しているのと同じ version なので、make oldconfig では新規に追加されたオプション項目を有効にするかどうかは聞かれずそのまま完了します。
**ビルド [#t0d498bb]
ビルドします。~
Raspberry Pi 2 の CPU は 4 core あるので -j4 で4並列実行して zImage、modules、dtbs を一括してビルドしてもいいのですが~
メモリの使用量が多くなりすぎて swap を設定しないと途中で hung してしまうことがあったので~
並列実行せず1つずつ順番に実行しました。~
また、time でビルド時間を計測しています。
zImge
root@raspberrypi:/usr/src/linux# time make zImage 2>&1 | tee make1.log
〜〜 中略 〜〜
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
real 76m45.564s
user 76m33.100s
sys 3m42.070s
modules
root@raspberrypi:/usr/src/linux# time make modules 2>&1 | tee make2.log
〜〜 中略 〜〜
IHEX firmware/yam/1200.bin
IHEX firmware/yam/9600.bin
real 214m43.233s
user 204m52.790s
sys 10m32.480s
dtbs
root@raspberrypi:/usr/src/linux# time make dtbs 2>&1 | tee make3.log
〜〜 中略 〜〜
DTC arch/arm/boot/dts/overlays/w1-gpio-pullup-overlay.dtb
DTC arch/arm/boot/dts/bcm2709-rpi-2-b.dtb
real 0m10.528s
user 0m3.110s
sys 0m1.650s
**インストール [#s514cfa2]
セルフコンパイルしているのでそのままインストールできます。
modules
root@raspberrypi:/usr/src/linux# make modules_install
〜〜 中略 〜〜
INSTALL /lib/firmware/yam/9600.bin
DEPMOD 4.1.10-v7+
dtb
root@raspberrypi:/usr/src/linux# ls arch/arm/boot/dts/*.dtb
arch/arm/boot/dts/bcm2709-rpi-2-b.dtb
root@raspberrypi:/usr/src/linux# cp arch/arm/boot/dts/*.dtb /boot/
root@raspberrypi:/usr/src/linux# cp arch/arm/boot/dts/overlays/*.dtb /boot/overlays/
root@raspberrypi:/usr/src/linux# cp arch/arm/boot/dts/overlays/README /boot/overlays/
zImage~
Raspbian は /boot/ に Raspberry Pi 用の zImage(kernel.img) と Raspberry Pi 2 用の ARMv7 の zImage(kernel7.img) が置かれています。~
Raspberry Pi 2 用をビルドしたものに置き換えます。
root@raspberrypi:/usr/src/linux# cp /boot/kernel7.img /boot/kernel7.img.old
root@raspberrypi:/usr/src/linux# scripts/mkknlimg arch/arm/boot/zImage /boot/kernel7.img
root@raspberrypi:/usr/src/linux# ./scripts/mkknlimg arch/arm/boot/zImage /boot/kernel7.img
Version: Linux version 4.1.10-v7+ (root@raspberrypi) (gcc version 4.9.2 (Raspbian 4.9.2-10) ) #1 SMP PREEMPT Fri Oct 16 22:21:16 JST 2015
DT: y
283x: n
**再起動 [#if5abe5f]
ビルドした kernel で動作させるため再起動します。
# reboot
ビルドした kernel で起動している状態では以下のようになっています。
pi@raspberrypi:~$ uname -a
Linux raspberrypi 4.1.10-v7+ #1 SMP PREEMPT Fri Oct 16 22:21:16 JST 2015 armv7l GNU/Linux
以前の kernel の uname -a とビルド時刻やビルド時のロケール設定が変わっているのがわかります。
pi@raspberrypi:~$ uname -a
Linux raspberrypi 4.1.10-v7+ #821 SMP PREEMPT Sat Oct 10 00:16:28 BST 2015 armv7l GNU/Linux