さーて次はWSLでクロスコンパイルだ。
前回はSurface Pro7+にUbuntuをインストールして環境を構築したのだが、筆者の場合にはデスクトップ環境があり、そいつの方がはるかにCPUパワーもある。
こいつをUbuntuとデュアルブートにする手もあるのだが、ディスク容量に余裕がない。
過去にはVirtual BoxでLinuxの仮想環境を構築していたが、最近はずっとWindows Subsystem for Linux (WSL)だ。
WSLも2になり、各種ツールチェーンもいろいろ対応されるようになった。
今回は一発こいつでビルドしてみよう。
ついでに前回はこちらの事情から64bitをビルドしたのだが、今回は32bit版をビルドしてサイドロードしてみよう。
akkiesoft.hatenablog.jp
なのでステップは
- Raspberry Piのカーネルを32bit版に切り替え
- WSL上にビルド環境を作成
- ソースコードのクローン
- 32bit版のビルド
- 既存のイメージのカーネル、カーネルモジュールを上書き
前回同様に、ビルドの手順に関しては全てこちらに書かれているので、こちらを見ながら進める。
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
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を引っこ抜いて、母艦に挿してサイドロード、という手が使えない。
よっしゃ、昔取った杵つき餅、おぢさん、NFSでRaspberry 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 PiにSSHする。
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
再起動すれば自家製カーネルを拝むことができる。