| tags:raspberry pi categories:server

パイで64bitカーネルビルド

Bluetoothが使えなかったり、cpufreqが効かなかったり、iptablesで不具合がでたりしたので、カーネルを自前でビルドしました。(オプションがありすぎて、目がしょぼしょぼします。)

まず、64bit化したカーネルをビルドするためには、64bit環境で動いている端末が必要ということです。 私は PaspberryPi 3 buster-PREVIEW で遊んでいる環境があったのでそれで行います。調べてみたところ、openSuse がラズパイ3用の64bitOSを提供しています。(ちょっと気になる)

環境がない人はクロスビルドと呼ばれる、他の端末を使いながらビルドする方法になります。ラズパイより高速にビルドできるのが利点の一つです。端末を1台用意して設定しなければいけないのがちょっと面倒でもあります。

私の場合は、セルフビルド方式、持っているパイ上でビルドを行うことにします。利点は、自己完結、最初のビルドには時間がかかりますが、以降は差分のビルドになるため初回ほど時間がかからずビルドができるということです。

ちなみに、Pi3Bでのカーネル・ビルド時間は、3時間ぐらいでした。(最初行った時は5時間ぐらいかかったと思ったが、、)

※ 端末の設定などが色々と面倒であるならば、SDカードの差し替えでOSの変更ができるので、ちょっと小さめの余ったSDカードにbuster-PREVIEWを焼いて、カーネル構築用の環境を作っておいても悪くないかもしれません。


事前準備

必要なソフト

あれが足りん、これがたりないと色々でてきます。足りなければエラーが出ますので、都度インストールしてください。大体こんな感じでオッケー。

$ apt-get install build-essential libgmp-dev libmpfr-dev libmpc-dev libisl-dev libncurses5-dev bc git-core bison flex bc libssl-dev

ソースコード

カーネルのソースコードは Raspberry Pi @ github からgitでクローンします。

現在の安定版はオプション抜きそのままでv4.19、現在最新のカーネルはv5.0になります。流行り物を追っかけたい方は、-b rpi-5.0.yのオプションをつけてクローンしましょう。

$ git clone --depth=1 https://github.com/raspberrypi/linux
$ git clone --depth=1 -b rpi-5.0.y https://github.com/raspberrypi/linux.git 

書き出しフォルダー:任意

ビルドしたファイルの書き出すフォルダーを作ります。作らないで、そのままgitで落としてきたソースコードフォルダー上でもビルドはできます、が、こちらの方が綺麗な感じがしたので自分は分けます。

$ mkdir kernel-out

作業

簡単に書くと以下の作業になります。BusterのPreview版ではSDカードのFatで作った/bootパーティションがちょっと不思議で/boot/firmwareにマウントされます。 最後の部分が他のRaspbianとは違います。

  1. ビルド設定ファイルを作成
  2. カーネルのビルド
  3. カーネル・モジュールなどのインストール
  4. ラズパイ起動のための作業

gitでクローンしたフォルダー (linux)に入って作業を開始します。

$ cd linux

1. .configファイルの作成・設定・変更・修正

まずは、ビルドのための設定ファイル.configを作成します。

まずは設定ファイルを読み込みます。いくつか方法があります。

  • 使用中の設定を持ってくる

読み込んだ設定をベースに設定を行います。 使用中のカーネル・コンフィグを取り込む方法は

$ modprobe configs
$ zcat /proc/config.gz > ~/kernel-out/.config

他の端末から持ってきても使えます。と思う。

  • デフォルトの設定を持ってくる

デフォルトの設定(bcmrpi3_defconfig)を持ってきて(/kernel-out/.configがつくられる)、 そしてmenuconfigで調整する。 makeを使うので、少し違和感がありますが、ここの、makeは設定ファイルの構築になります。

$ make O=../kernel-out/ ARCH=arm64 bcmrpi3_defconfig
$ make O=../kernel-out/ ARCH=arm64 menuconfig

※ エラーが出たりしたら、綺麗にしろと催促されます。設定ファイルや余計なファイルが消去されます。

$ make mrproper

でクリアー。仕切り直しになります。

このファイルは、ビルドが終了したら、.config.oldにコピーされます。 まだ、やったことはないけれど、次回以降make menuconfigなどで更新した時など、差分が取れ、変更点を確認できる。ということか?

2. 本番:カーネル・ビルド

当たり前なんだろうけども、なんか不思議な、今回が本番のmakeビルドのためのmakeです。

最初のビルドでは5時間くらいかかりました。-j4オプションは割り当てるCPU数です。-j2とかの人もネット上で見かけました。何もないよりは幾つか割り当てておくのがよろしいかと思います。時間もかかるので、いろいろは試していません。

$ make -j4 O=../kernel-out/ ARCH=arm64 

sshの接続が切れると、プロセスが中断してしまうので、 マックを眠らないように、カフェインを注入します。(6時間)

$ caffeinate -u -t 21600

3. インストール

ビルドが終了後、カーネルモジュールとdtbsをインストールします。 ビルドは既にされているので、ファイルのコピーのみ、すぐに終わります。

$ make O=../kernel-out/ ARCH=arm64 modules_install dtbs_install

そして、起動するために幾つかのファイルを移動したりコピーをしたりします。

ラズベリーパイの起動のシーケンスがちょっとわからないのだけれども、 Buster Previewですと、Fatで作ってある/bootパーティションが システムを起動すると、/boot/firmwareにマウントされます。

起動するためには、

kernel.imgmodules/dtbs/

が必要になります。 modulesは/var/lib下にありますので、そのまま、残りの二つは、/bootと/boot/firmware(FATで作っている/bootパーティション)にこぴーをします。

まずはカーネルは自動にコピーはされませんので、/bootパーティションにコピーします。パイでは/bootパーティションにも

$ cp ../kernel-out/arch/arm64/boot/Image /boot/kernel8.img
$ cp ../kernel-out/arch/arm64/boot/Image /boot/firmware/kernel8.img

dtbsはファイルは、dtbs_installによって、/bootに書き込まれてます。

$ cp -rp /boot/dtbs/4.19.30-v8+ /boot/firmware/dtbs/

そして、 config.txtに新しいカーネルを追加、以下3つの指定が必要です。

device_tree=dtbs/4.19.30-v8+/broadcom/bcm2837-rpi-3-b.dtb
overlay_prefix=dtbs/4.19.30-v8+/overlays/
kernel=kernel8.img

多分、起動時には、/bootとして認識されて、起動後はお役御免で、firmwareに隠居するような形になっている?。。と思ってます。

ビルド後は、/bootだけではなくて、/boot/firmwareにファイルをコピーします。

で、再起動後、確認します。


2回目以降

2回目以降のビルド時は少し楽、かつ、ビルドにかかる時間も少ないです。

だいたい複数回行う理由は、なんか欠けていたり、ちょっと調整が必要だったりということだと思います。まぁ、理由はさておき、、

さて、まずは、カーネルの更新、最新のものはなかなかのテンポで更新されていきます。カーネルソースをアップデートします。gitから更新ファイルを所得します。

$ cd linux
$ git pull

コンフィグを変更・調整したい時はmeniconfigで行います。そして、makeします。

$ cd linux
$ git pull
$ make O=../kernel-out/ ARCH=arm64 oldconfig
$ make O=../kernel-out/ ARCH=arm64 menuconfig
$ make -j4 O=../kernel-out/ ARCH=arm64

10分とか20分ぐらいでビルドができます。 その後は上記のように必要なファイルを移動します。

※ちょっと、カーネルv5をビルドしてみました。カーネルのオプションがどんどん増えてますね、ちょっと大変な作業になりました。

※で、最初はうまくいったのですが、2回目行った時は新しいカーネルでは起動せず。。しかしビルドしたカーネルをコピーした32bit環境のRaspbianでは問題なく起動する。しかもBTも有効になる。。なんかよくわからん。。BTは32bit環境でしか動いてくれないのが、、ちょっとスキル不足か。。

See Also

comments powered by Disqus