カーネルアップデートで kernel module が置いていかれた
久しぶりに Radioberry HF SDR Transceiver Pi HAT を Raspberry Pi 4 に挿して、openHPSDR を起動してみたところ、No local devices found! と表示されてしまいました。
最初は HAT の接触不良や、Radioberry 側のサービス停止を疑いました。HATを差し替えた直後だったので、GPIOの接触が悪いのかなとも思いました。
しかし、確認していくと原因はもっとソフトウェア寄りでした。
症状
Radioberry の service 状態を確認すると、radioberry.service が起動と停止を繰り返していました。
sudo systemctl status radioberry --no-pagerjournalctl -u radioberry -b --no-pager | tail -100ログを見ると、次のようなエラーが出ていました。
chmod: cannot access '/dev/radioberry': No such file or directoryつまり、Radioberry の daemon が使うはずの /dev/radioberry が存在していません。
さらに確認すると、
lsmod | grep radioberrymodinfo radioberry 2>/dev/nullls -l /dev/radioberryいずれも期待した結果が出ませんでした。
原因
現在動いているカーネルを確認すると、
uname -r結果は次の通りでした。
6.12.75+rpt-rpi-v8一方で、Radioberry の kernel module は古いカーネル用のものしか残っていませんでした。
find /lib/modules -name '*radioberry*' -print結果は、
/lib/modules/6.1.0-rpi7-rpi-v8/kernel/drivers/sdr/radioberry.koでした。
つまり、以前は 6.1.0-rpi7-rpi-v8 用の radioberry.ko で動いていたものの、Raspberry Pi OS のカーネルが 6.12.75+rpt-rpi-v8 に更新され、Radioberry の kernel module が現在のカーネルに対応していない状態になっていました。
Radioberry のような out-of-tree kernel module は、カーネルが更新されると再ビルドが必要になります。今回はまさにそれでした。
復旧作業
Radioberry のソースツリーに移動します。
cd ~/Radioberry-2.x/SBC/rpi-4/device_driver/driver必要であれば、カーネルヘッダとビルド環境を入れます。
sudo apt updatesudo apt install -y raspberrypi-kernel-headers build-essential gitドライバを再ビルドします。
make cleanmakeビルド自体は成功し、radioberry.ko と radioberry.dtbo が生成されました。
ただし、sudo make install は途中で失敗しました。
chmod: cannot access '/dev/radioberry': No such file or directoryここで分かったのは、kernel module 自体はロードされても、Device Tree Overlay が有効になっていなければ probe() が呼ばれず、/dev/radioberry が作られないということです。
Device Tree Overlay の設定
まず、生成された overlay を /boot/firmware/overlays/ にコピーします。
sudo cp radioberry.dtbo /boot/firmware/overlays/次に、現在のカーネル用に kernel module をコピーします。
sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/sdrsudo cp radioberry.ko /lib/modules/$(uname -r)/kernel/drivers/sdr/sudo depmod -aそして /boot/firmware/config.txt に Radioberry の overlay を追加します。
sudo nano /boot/firmware/config.txt末尾に以下を追加しました。
dtoverlay=radioberry私の環境では、すでに次のような表示用 overlay が入っていました。
dtoverlay=vc4-kms-v3dmax_framebuffers=2これは Raspberry Pi の画面表示用なので、Radioberry とは別です。その下に dtoverlay=radioberry を追加しました。
設定後、再起動します。
sudo reboot復旧確認
再起動後、dmesg を確認すると、今度は probe() が呼ばれていました。
dmesg | grep -i radioberryログには次のような表示が出ました。
inside radioberry_probe functionradioberry - Device property 'rx-sample-gpio' found!Radioberry: registered correctly with major number 239Radioberry char: device class created correctlyRadioberry: The rx samples pin is mapped to IRQ: 58inside loading_radioberry_gateware functionRadioberry gateware file size: 335337さらに、/dev/radioberry も作成されました。
ls -l /dev/radioberry結果は、
crw------- 1 root root 239, 0 /dev/radioberryでした。
権限を変更してから、Radioberry service を起動します。
sudo chmod 666 /dev/radioberrysudo systemctl enable radioberrysudo systemctl start radioberrysudo systemctl status radioberry --no-pager最終的に、service は正常に起動しました。
Active: active (running)Main PID: radioberryこれで Radioberry は復旧しました。
まとめ
今回の原因は、HAT の故障や接触不良ではなく、Raspberry Pi OS のカーネル更新により、Radioberry の kernel module が現在のカーネルに対応しなくなっていたことでした。
復旧のポイントは次の3つです。
1. 現在のカーネル用に radioberry.ko を再ビルドする
2. radioberry.dtbo を /boot/firmware/overlays/ に置く
3. /boot/firmware/config.txt に dtoverlay=radioberry を追加するRadioberry のように kernel module や gateware が絡む環境では、動いているSDカード自体がかなり重要な資産になります。
動作確認できた時点で、SDカードのイメージを保存しておくべきだったと反省しました。
今後、安定運用するなら、カーネルを固定しておくのも一つの方法です。
sudo apt-mark hold raspberrypi-kernel raspberrypi-kernel-headersただし、セキュリティアップデートや他の機能との兼ね合いもあるので、開発用と安定運用用のSDカードを分けておくのが一番安全だと思います。

