Armbianでリアルタイムカーネルを使う
2023-09-03Armbianでリアルタイムカーネルを使うのに苦労したのでメモ。
用意するもの(カッコ内は私が使用したもの)
- WSL2が使えるPC(Ubuntu 20.04.6 LTS)
- Armbianが動作するSBC(NanoPi R4S)
リアルタイムカーネルのパッチを入手する。
https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/
patches-X.X.XXではなく、patch-X.X.XXの方をダウンロードしておくこと。
今回はpatch-6.1.46-rt14-rc1.patch.gzを使用する。
カーネルのバージョンを固定する
※シングルボードコンピューター(搭載CPU)によってやり方が異なる模様。
NanoPi R4S
config/sources/families/include/rockchip64_common.inc
ZeroPi
config/sources/families/include/sunxi_common.inc
ここからはNanoPi R4S
case $BRANCH in
current)
declare -g KERNEL_MAJOR_MINOR="6.1" # Major and minor versions of this kernel.
KERNELBRANCH="branch:linux-6.1.y"
KERNELPATCHDIR='rockchip64-'$BRANCH
LINUXFAMILY=rockchip64
LINUXCONFIG='linux-rockchip64-'$BRANCH
;;
KERNELBRANCH="branch:linux-6.1.y"によって、常に6.1系の最新バージョンが適用される。
ここをTag指定にすることで、バージョンを固定できる。使用可能なタグはここ参照。
上のカーネルパッチに合わせてバージョンを固定する。
KERNELBRANCH="branch:linux-6.1.y" → KERNELBRANCH="tag:linux-6.1.46"
デフォルト設定でビルドする
手順は公式を参照。
https://docs.armbian.com/Developer-Guide_Build-Preparation/
sudo apt install git
git clone https://github.com/armbian/build.git -b v23.05
cd build
./compile.sh
TUIが立ち上がるので、必要な情報を選択していく。
- Do not change the kernel configrationを選択
- nanopi-r4sを選択
- currentを選択
- jammyを選択
- Minimal image with console interfaceを選択
これでビルドが開始される。
自動適用されるパッチにエラーが出た場合
カーネルのバージョンによっては、自動適用されるパッチにエラーが出る場合があるので、手動で削除する必要がある。
ログの上のほうを見ていくと、エラーが出たパッチの在りかが分かるので、rmコマンドで削除すればOK。
パッチを配置する
ビルドが成功していると、buildの下にuserpatchesディレクトリが作成される。
userpatchesディレクトリの中に、rockchip64-currentディレクトリを作成し、、その中にダウンロードしたパッチを格納する。
ビルドスクリプト書き換え
リアルタイムカーネルパッチをあてると、出力するイメージファイルの名前が変わるようになっているが、Armbianのビルドツールはそれに対応できておらず、エラーとなってしまう。 そこで、出力されるイメージファイルの名前を手動で書き換える。
lib/functions/compilation/kernel-debs.sh
#declare kernel_version_family="${kernel_version}-${BRANCH}-${LINUXFAMILY}"
declare kernel_version_family="${kernel_version}-rtXX-rcX-${LINUXFAMILY}"
rtXXとrcXは、パッチファイルと同じ数字を入力すればよい。
再ビルド
$./compile.sh EXTRAWIFI=no AUFS=no KERNEL_CONFIGURE=yes INSTALL_HEADERS=yes
カーネルヘッダーはイメージに含めておいたほうが後々楽。
ボード名を選んだあと、しばらく待つとカーネルの細かい設定をする画面が表示されるので、それに従って以下を設定する。
Kernel Configuration
General setup
Timer Subsystem > Timer tick handling > Full dynticks system (tickless) Preemption Model > Fully Preemptible Kernel (Real-Time)
Kernel Features
Timer frequency > 1000 HZ
Networking support
Wireless > オフ
この設定で再ビルドを行う。
output/imagesディレクトリに.imgファイルが生成されるので、それをmicroSDに焼けば終了。
最後に
apt updateやapt upgradeしたときに、カーネルが上書きされてしまうので、自動アップデート対象から除外する。
$sudo apt-mark hold 'linux-generic*' 'linux-headers*' 'linux-image*' 'linux-modules*'