LoginSignup
6
5

More than 5 years have passed since last update.

RaspbianのLinuxカーネルをビルドしてインストールする

Last updated at Posted at 2018-07-06

RaspbianのLinuxカーネルをビルドしてインストールする手順です。

手順は
https://www.raspberrypi.org/documentation/linux/kernel/building.md
を見れば書いてあります。

以下は、Raspberry Pi Zero Wの場合の例です。

カーネルソースをダウンロード

raspbianで使っているカーネルのソースコードはgithubにあり、リリース時のタグが打ってあります。
執筆時点の最新版はraspberrypi-kernel_1.20180417-1です。

wget https://github.com/raspberrypi/linux/archive/raspberrypi-kernel_1.20180417-1.tar.gz
tar xf raspberrypi-kernel_1.20180417-1.tar.gz

 ビルドの準備

パッケージをインストール

sudo apt-get install build-essential bc git bison flex

クロスコンパイラをインストール

git clone https://github.com/raspberrypi/tools

クロスコンパイラにパスを通す。

export PATH=$PATH:/vagrant/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin

vagrant のワークアラウンド

自分はvagrantを使っている。vagrantだとmmapが動かないせいでエラーが起きるので、scripts/link-vmlinux.shに修正を行う

sortextable()
{
        ${objtree}/scripts/sortextable ${1}        
}

sortextable()
{
    cp ${1} /tmp/.${1}
    scripts/sortextable /tmp/.${1}
    cp /tmp/.${1} ${1}
}

にする。

カーネルのビルド

.configの生成

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

カーネルとモジュールとDTBをビルド

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

インストール

以下のスクリプトをカーネルのディレクトリで実行する。

set -x
export KERNEL_RELEASE=`cat include/config/kernel.release`
export INSTALL_MOD_PATH=../$KERNEL_RELEASE
mkdir -p ../$KERNEL_RELEASE/boot/overlays
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-  modules_install
scripts/mkknlimg arch/arm/boot/zImage ../$KERNEL_RELEASE/boot/kernel.img
cp arch/arm/boot/dts/*.dtb ../$KERNEL_RELEASE/boot/
cp arch/arm/boot/dts/overlays/*.dtbo ../$KERNEL_RELEASE/boot/overlays/
cd ..
tar cvjf $KERNEL_RELEASE.tar.bz2 $KERNEL_RELEASE/

ひとつ上のディレクトリに4.14.34.tar.bz2 のようなファイルができています。

このファイルをraspberry piに転送してから、コピーします。

cd /tmp
tar xf 4.14.34.tar.bz2 
sudo cp -a 4.1.34/boot 4.1.34/lib /

コピーする前に、/bootはバックアップしといた方が良いです。

カーネルだけ変更したい場合は、/boot/kernel.imgだけ変更してください。

mkknlimg

  • raspbianではmkknlimgを使ってkernel.imgの最後にデータを埋め込みます。
  • 埋め込まれるデータはこんな感じです。zImageが埋め込み前、kernel.imgが埋め込み後です。
$ ls -l linux-raspberrypi-kernel_1.20180417-1/arch/arm/boot/zImage 4.14.34/boot/kernel.img 
-rw-rw-r-- 1 vagrant vagrant 4676776 Jul  2 15:54 4.14.34/boot/kernel.img
-rwxrwxr-x 1 vagrant vagrant 4676544 Jul  2 11:17 linux-raspberrypi-kernel_1.20180417-1/arch/arm/boot/zImage
$ cmp linux-raspberrypi-kernel_1.20180417-1/arch/arm/boot/zImage 4.14.34/boot/kernel.img 
cmp: EOF on linux-raspberrypi-kernel_1.20180417-1/arch/arm/boot/zImage
$ hexdump -C   linux-raspberrypi-kernel_1.20180417-1/arch/arm/boot/zImage |tail -n 10
00475b30  ac 61 f5 ad e4 80 f9 3d  57 bb f2 76 1e af b8 47  |.a.....=W..v...G|
00475b40  cc df 7e a6 67 89 f9 bd  58 ce 7d 62 9e cf ef 50  |..~.g...X.}b...P|
00475b50  e6 6f fd 9c ca ed dc 97  54 f6 f2 bb 2d e5 5f d8  |.o......T...-._.|
00475b60  db 6e a5 73 30 cf 2d 71  5e ba 95 4a 5b 0b b4 df  |.n.s0.-q^..J[...|
00475b70  e6 4a 55 0e ef 66 30 fc  1f 82 cc bd d1 5c 66 9c  |.JU..f0......\f.|
00475b80  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00475b90  c0 5b 47 00 81 5b 47 00  d8 5b 47 00 3c 46 00 00  |.[G..[G..[G.<F..|
00475ba0  d4 5b 47 00 c4 5b 47 00  c0 08 00 00 cc 5b 47 00  |.[G..[G......[G.|
00475bb0  d0 5b 47 00 c8 5b 47 00  00 00 00 00 00 00 00 00  |.[G..[G.........|
00475bc0
$ hexdump -C  4.14.34/boot/kernel.img  |tail -n 20
00475b80  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00475b90  c0 5b 47 00 81 5b 47 00  d8 5b 47 00 3c 46 00 00  |.[G..[G..[G.<F..|
00475ba0  d4 5b 47 00 c4 5b 47 00  c0 08 00 00 cc 5b 47 00  |.[G..[G......[G.|
00475bb0  d0 5b 47 00 c8 5b 47 00  00 00 00 00 00 00 00 00  |.[G..[G.........|
00475bc0  00 00 00 00 00 00 00 00  00 00 00 00 04 00 00 00  |................|
00475bd0  32 38 33 78 01 00 00 00  04 00 00 00 32 38 33 58  |283x........283X|
00475be0  01 00 00 00 04 00 00 00  32 37 30 58 01 00 00 00  |........270X....|
00475bf0  04 00 00 00 44 44 54 4b  01 00 00 00 04 00 00 00  |....DDTK........|
00475c00  44 54 4f 4b 4c 69 6e 75  78 20 76 65 72 73 69 6f  |DTOKLinux versio|
00475c10  6e 20 34 2e 31 34 2e 33  34 20 28 76 61 67 72 61  |n 4.14.34 (vagra|
00475c20  6e 74 40 75 62 75 6e 74  75 2d 62 69 6f 6e 69 63  |nt@ubuntu-bionic|
00475c30  29 20 28 67 63 63 20 76  65 72 73 69 6f 6e 20 34  |) (gcc version 4|
00475c40  2e 39 2e 33 20 28 63 72  6f 73 73 74 6f 6f 6c 2d  |.9.3 (crosstool-|
00475c50  4e 47 20 63 72 6f 73 73  74 6f 6f 6c 2d 6e 67 2d  |NG crosstool-ng-|
00475c60  31 2e 32 32 2e 30 2d 38  38 2d 67 38 34 36 30 36  |1.22.0-88-g84606|
00475c70  31 31 29 29 20 23 38 20  4d 6f 6e 20 4a 75 6c 20  |11)) #8 Mon Jul |
00475c80  32 20 30 32 3a 30 38 3a  31 30 20 55 54 43 20 32  |2 02:08:10 UTC 2|
00475c90  30 31 38 00 8f 00 00 00  4b 56 65 72 e8 00 00 00  |018.....KVer....|
00475ca0  04 00 00 00 52 50 54 4c                           |....RPTL|
  • Raspberry Pi 2 カーネル4.0.7のクロスコンパイルメモ によるとこのデータはDeviceTreeの判別に使うらしいです。
  • GPUで動いているブートローダーが、これをみてDTBをRAMにロードしているっぽいです。GPUで動いているブートローダのelfファイルにそれらしい文字列が含まれてました。
$ strings start.elf |grep DTOK
DTOK
Kernel trailer DTOK property says %s

todo

  • version文字列を配布されたイメージと同じにして、カーネルだけ置き換えた時に、モジュールを読み込めるか、確認する。
  • 「raspberry piに転送してから、コピー」ではなく、イメージファイルを直接書き換える方法を調べる。

参考

6
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5