Armbianでリアルタイムカーネルを使うのに苦労したのでメモ。

用意するもの(カッコ内は私が使用したもの)

  • 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が立ち上がるので、必要な情報を選択していく。

  1. Do not change the kernel configrationを選択
Do not change the kernel configration
  1. nanopi-r4sを選択
nanopi-r4s
  1. currentを選択
current
  1. jammyを選択
jammy
  1. Minimal image with console interfaceを選択
Minimal image with console interface

これでビルドが開始される。

自動適用されるパッチにエラーが出た場合

カーネルのバージョンによっては、自動適用されるパッチにエラーが出る場合があるので、手動で削除する必要がある。

failed patches

ログの上のほうを見ていくと、エラーが出たパッチの在りかが分かるので、rmコマンドで削除すればOK。

failed patche path

パッチを配置する

ビルドが成功していると、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*'
uname -a