Raspberry PiのLinux カーネルビルド - WSLで32bit版をクロスコンパイル編


さーて次はWSLでクロスコンパイルだ。
前回Surface Pro7+にUbuntuをインストールして環境を構築したのだが、筆者の場合にはデスクトップ環境があり、そいつの方がはるかにCPUパワーもある。
こいつをUbuntuデュアルブートにする手もあるのだが、ディスク容量に余裕がない。

過去にはVirtual BoxでLinuxの仮想環境を構築していたが、最近はずっとWindows Subsystem for Linux (WSL)だ。
WSLも2になり、各種ツールチェーンもいろいろ対応されるようになった。
今回は一発こいつでビルドしてみよう。
ついでに前回はこちらの事情から64bitをビルドしたのだが、今回は32bit版をビルドしてサイドロードしてみよう。
akkiesoft.hatenablog.jp
なのでステップは

前回同様に、ビルドの手順に関しては全てこちらに書かれているので、こちらを見ながら進める。
www.raspberrypi.com

Raspberry Piカーネルを32bit版に切り替え

Raspberry Piの/boot/config.txtに以下の行を追加する。
管理者ファイルなので、"sudo vi config.txt"で編集だ。

#option for 64bit kernel boot: 0=32bit, 1=64bit
arm_64bit=0

書き換えた後に再起動すれば、32bit版のカーネルで起動する。

WSL上にビルド環境を作成

WSLの構築方法はこちらを参照。
nobu-macsuzuki.hatenablog.com
その後は前回同様に、

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

ARM 32bitのクロスコンパイルなので、

sudo apt install crossbuild-essential-armhf

あとあと面倒が無いようにARM 64bitクロスコンパイルツールもインストールしておく。

sudo apt install crossbuild-essential-arm64

ソースコードのクローン

全く前回同様。

git clone --depth=1 https://github.com/raspberrypi/linux

32bit版のビルド

ほぼ前回同様。
まずcloneしたlinuxディレクトリーに移動。

cd linux

シェル変数"KERNEL"を定義、こいつをkernel7lにする(使うんかな?)

KERNEL=kernel7l

ビルド用のコンフィグファイル".config"を32bit、クロスコンパイル指定で作成する。

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

これまた前回同様に.configのCONFIG_LOCALVERSIONを書き換えておくとよい。

CONFIG_LOCALVERSION="-v7l-(自製と分かるような文字列を追加)"

んでもって32bit版をビルド。

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

既存のイメージのカーネルカーネルモジュールを上書き

さてここで問題発生。
WSLではext4フォーマットのUSBドライブをマウントできないのだ。
learn.microsoft.com
UbuntuのようにRaspbery Piからmicro SDを引っこ抜いて、母艦に挿してサイドロード、という手が使えない。
よっしゃ、昔取った杵つき餅、おぢさん、NFSRaspberry Piのドライブをマウントして書き込んじゃうよ。
ところがこいつもダメ。
WSLのNICが仮想化されているためなのか、NFSがマウントできないのだ。
なので、作業フォルダーを物理的にコピーして、残りの作業を続けることにした。


Raspberry Piを起動してSSHで接続できる状態にしておく。
Rapberry Pi上に作業ディレクトリーを作成しておく(筆者の場合は/home/nsuzuki/work)。
WSL側で作業ディレクトリーを圧縮して、Raspberry Piにコピーする。
作業ディレクトリーの親ディレクトリーに移動。

cd ..

作業ディレクトリーを圧縮して、Raspberry Piにコピーする。

tar -zcvf linux.tar.gz linux
scp linux.tar.gz nsuzuki@macrpi:/home/nsuzuki/work

Raspberry PiSSHする。

ssh nsuzuki@macrpi

作業ディレクトリーに移動して、ファイルを解凍。

cd work
tar -zxvf linux.tar.gz

ここまでくれば、あとは公式のローカルサイドロードの通りやればよい。
リモートでも環境変数を設定し、

KERNEL=kernel7l

カーネルモジュールをインストール、

sudo make modules_install

最後にカーネルとDevice Tree Blob (DTB)を上書きする。

sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/$KERNEL.img

再起動すれば自家製カーネルを拝むことができる。