気の向くままに辿るIT/ICT/IoT
IoT・電子工作

Orange Pi Zero 3 U-Boot/sun50iw9カーネルコンパイルと起動イメージビルド

ホーム前へ次へ
Orange Piって?

Orange Pi Zero 3 U-Boot/sun50iw9カーネルコンパイルと起動イメージビルド

Orange Pi Zero 3 U-Boot/sun50iw9カーネルコンパイルと起動イメージビルド

2025/11/22

 Orange Pi Zero 3用にLinuxカーネルとブートローダU-Bootをコンパイル、実機へインストールしてみた話。

 尤も今回の経緯に至った主な原因を突き止め、検証を行った結果、アップグレード前に打つべき対策がわかったので、そうしておけば、当記事の内容を実施する必要もないのですが、経験としては無駄ではなかったということで。

経緯

 その発端は、同ボードを使っていた自作スマートスピーカー専用機でDebianベースなOrange Pi OS Bookwormをtrixieにアップグレードしてみたこと。

 ちなみに同様にノートPC/DebianRaspberry Pi 400/Raspberry Pi OS自作テレビドアホン室内機自作テレビドアホン子機それぞれのOrange Pi Zero 3/Orange Pi OSの4台もアップグレードを実施。

 ラズパイ400は、ぼんやりしていてraspberrypi.orgとdebian.orgのリポジトリを混在させてしまうという自身のミスで唯一、失敗、結果、クリーンインストール。

 他は全てアップグレードには成功するも、悩ましい外部パッケージがあったのか、マシン性能によるのか、現在唯一の純Debianでデスクトップ環境なノートPCは、なぜか11時間もかかり、DebianベースOPi OSでCLI環境なドアホン室内機・子機はそれぞれ30分ちょっと。

 が、ドアホン室内機用は後述のスマートスピーカー用と似たような状況、ドアホン子機用は、その後マウントはでき、データ救出はできる状態と判明もmicroSDが壊れた模様でアップグレード完了後の再起動で起動できず。

とバラエティに富んだ結果に。

 そんな中、今回、発端となったDebianベースOPi OSでCLI環境なスマートスピーカー用はというと、アップグレード自体は簡単で後始末含め、1時間ほどで完了したものの、気づけば、アップグレード前には、難なく使えて機能していたマイクとして使用していたWebカメラを認識できていなかった...。

 一体なぜ...?と状況を辿ってみると、その主な原因が見えてきました。

手順の要約

  1. Linux SDK用にUbuntu 22.04/Jammy Jellyfish環境を用意
  2. Linux SDKでsun50iw9カーネルをコンパイル・実機へインストール
  3. (サウンドサーバにはデフォルトのPulseAudioを使用)

 参照先:Linux SDK / Orange Pi Wiki

 要約すると、今回の不具合解消の手順は、たった、これだけ。

 が、主な原因が想定通りであれば、事前に対処しておけば、これを行う必要さえもないということになりますが...。

 ただ、Linux SDKを使ってみると、それはそれで思うところもあり...。

Orange Pi Zero 3 Linux SDKでフルビルドできるディストロとバージョン 2025年11月現在

 他のOPiボードについては未確認もOrange Pi Zero 3については、今日時点でもOPi Linux SDKでフルビルドできるのは、raspiはさておき、既にtrixieがリリース済みなDebianは、bullseyeとbookworm、pluckyがリリース済みなUbuntuは、jammyとnobleだけ。

 今回、本件に関する検証の中、興味本位でLinux SDKでBookwormイメージもフルビルドしてみて、microSDとUSBメモリ用にdd(USBメモリ使用の場合、orangepiEnv.txtのrootはそのままにmicroSDのUUIDをtune2fsで変更必須)しつつ、前者は流用すれば良いかと、同じくddでtrixieにアップグレードした後者のブータブルイメージをファイルとして保存したので各種検証にしろ、新たにOrange Pi Zero 3が必要になった場合でもbookwormからアップグレードという事態は回避できますし、なんなら次期開発コードへのアップグレードの事前検証もできますが。

主な原因

 検証記事は別途上げる予定ですがの通り、今回、カーネルを改めてインストールすることになった主原因は、自身が、リポジトリをOpiオリジナルからdebian.orgに切り替えて運用しつつ、Opiオリジナルカーネルをapt-mark holdとかでアップグレード対象から除外しなかったことでtrixieへのアップグレード中にsun50iw9なLinuxカーネルが存在しなかったからかと思われますでした

Orange Pi用Linux SDK

 情報が少ない一方、Orange Pi Zero 3は、Wikiが充実しているので改めて確認。

 Linux SDKでのブートローダやカーネルのコンパイルについては、Linux SDK / Orange Pi Wikiと実行スクリプトbuild.shのおかげでたいして時間もかからず、超簡単。

 実機へのインストールも同様に短時間で完了かつ簡単。

 追加作業もありましたが、U-Boot用のnand-sata-installのライブラリとバイナリをコンパイル環境のexternal/packages/bsp/common以下のusr/lib/とusr/sbinから実機の/usr/libと/usr/sbinにscpでコピー、また、カーネルコンパイルにおいて["gmp.h" no such file or directory]と["mpc.h" no such file or directory]といったヘッダファイルの不足エラーが出てDebian系な自身は、libgmp-dev、libmpc-devパッケージをapt installした程度。

Linux SDKを実行するまでの道のりが長かった

 他方、そこに至る過程は、凸凹道。

 まず、このLinux SDKは、Ubuntu 22.04/Jammy Jellyfishでしか動作確認されておらず、他は受け付けないから仮想マシンにでもUbuntu 22.04環境を作るように書かれている(強行して回避しようにも複数ファイルに渡り編集が必要になり面倒)。

 今やメインとなったAMD Ryzen 7なミニPCのUbuntu 25.04で作業中だった自身は、スマートスピーカー用Orange Pi Zero 3にLinuxカーネル6.12をインストールしてみたものの、U-Bootはさっぱり...という遠回りをしつつ、KVMもよぎりつつ、結果、VirtualBoxにUbuntu 22.04.5のisoファイル(自身はserver install image)をインストールすることに。

 aptリポジトリにバイナリがあるUbuntuでVirtualBoxをインストールするのは、いとも簡単でしたが、サーバ版Ubuntu 22.04.5の仮想マシンを起動してみるとAMD Virtualizaion機能やKVMが邪魔なようで[sudo modprobe -r kvm_amd kvm]しておかないと仮想マシンを起動できず。

 起動できるようになったらなったで以前からだったか、VirtualBoxの仮想マシンでは画面スクロールしてくれず、使いづらく、ヘッドレス起動しつつ、ssh

 ヘッドレスモードで仮想マシンを起動、ssh経由でアクセスできるようにしたらしたで25GBほどとったはずのストレージにおいて容量不足を指摘され、df -h、pvdisplay/vgdisplay/lvdisplayなど、なぜか、サイズが7GBだったり、23GBだったり、マチマチで、なんだこれ?状態...。

 [vboxmanage modifyhd VDIイメージ.vdi --resize]でストレージを拡張、cfdiskで増えた空き容量をLVMデバイスをリサイズする恰好で増量するも、PVサイズ(pvdisplay)に反映されず、それゆえ容量はともかく、後述のlvextendでの拡張には成功、resize2fsするも失敗...。

 唯一、論理ボリュームが満杯だと自動バックアップ機能が拡張をブロックするそうで、lvextendした際に自動バックアップを無効にする[-A n]を付与することでsuccessfullyになったものの、ヘッドレスモードだと他にも何か制約があったりするのか?と思い、SSH経由ではなく、仮想マシン自体の起動をして同じ手順を実行してみたら、無事サイズ変更もでき、全て反映されたみたいな夢現にハマったり...。

 まぁ、できるようになった今となっては、ヘッドレスモードなVirtualBox仮想マシンへのsshは、快適そのものですが。

Linuxカーネルインストールからも微長い道のり

for_smartspeaker:~$ lsmod
snd_seq        90112 6
overlay        126976 0
sprdbt_tty       36864 0
snd_usb_audio     278528 0
snd_hwdep       20480 1 snd_usb_audio
snd_usbmidi_lib    32768 1 snd_usb_audio
snd_rawmidi      40960 1 snd_usbmidi_lib
snd_seq_device     16384 2 snd_seq,snd_rawmidi
sunxi_cir       20480 0
rc_core        49152 2 sunxi_cir
dw_hdmi_cec      16384 0
sunrpc        286720 1
videobuf2_vmalloc   20480 1 uvcvideo
sunxi_cedrus      45056 0
videobuf2_dma_contig  24576 1 sunxi_cedrus
v4l2_mem2mem      36864 1 sunxi_cedrus
videobuf2_memops    20480 2 videobuf2_vmalloc,videobuf2_dma_contig
videobuf2_v4l2     24576 3 sunxi_cedrus,uvcvideo,v4l2_mem2mem
videobuf2_common    49152 7 sunxi_cedrus,videobuf2_vmalloc,videobuf2_dma_contig,videobuf2_v4l2,uvcvideo,v4l2_mem2mem,videobuf2_memops
videodev       204800 5 sunxi_cedrus,videobuf2_v4l2,uvcvideo,videobuf2_common,v4l2_mem2mem
mc           53248 7 sunxi_cedrus,videodev,snd_usb_audio,videobuf2_v4l2,uvcvideo,videobuf2_common,v4l2_mem2mem
polyval_ce       16384 0
display_connector   20480 0
polyval_generic    16384 1 polyval_ce
binfmt_misc      24576 1
sprdwl_ng       352256 0
sunxi_addr       20480 1 sprdwl_ng
cfg80211       376832 1 sprdwl_ng
rfkill         36864 3 sprdbt_tty,cfg80211
uwe5622_bsp_sdio   208896 2 sprdbt_tty,sprdwl_ng
fuse         131072 1
nfnetlink       20480 1
motorcomm       24576 1
dwmac_sun8i      28672 0
mdio_mux        16384 1 dwmac_sun8i
uas          28672 0
for_smartspeaker:~$

 ともあれ、自作スマートスピーカー用のOrange Pi Zero 3にLinuxカーネルをインストールしたことで、asound -l結果にWebカメラは認識されるようになり、-Dオプションなしや、-Dオプションでカードやデバイスの指定によっては、録音(他のマシンでなら再生も)できるようにはなりました。

 ちなみに今回、Webカメラをカメラとして使わないからか、内蔵マイクのためにuvcvideoは必要ない模様。

 が、一方、aplayも同様に再生できるパターンもあってCLI環境ながら確認のためインストールしたpavucontrolをssh経由でGUI起動するとインジケータの動きで出力を確認できるものの、USBスピーカーから一向に出力されない現象に苦戦...。

 あれこれやっている内にalsamixerで(aplay -lで出力されるカード0,デバイス0な)audiocodecのLINEOUTが0になり、矢印キーで出力レベルを上げることができない状態に...それ以前は出力レベルが相応にあったことは確かなのに...。

 こうなったら比較検証するのが近道かと、同じく、Orange Pi Zero 3/Opi OS Bookwormからtrixieにアップグレードした自作ドアホンの室内機と子機用、子機用は間が悪くmicroSDが壊れたようで起動不能になりつつ、マウントはできるので中身をコピーすれば良さそうも未検証、室内機用は健在なので室内機用を比較用とすることに。

 が、自作テレビドアホン室内機用のOrange Pi Zero 3/Opi OS trixieもアップグレードにより、オーディオ周りがアップグレード前と変わったようでスマートスピーカー用とは様子も似て非なるものっぽく、-Dオプションの有無に関わらず、arecord/aplayで録音、ソフトウェア的には再生もできていてもUSBスピーカーでは再生できない状態。

 lsmodしてもカーネルモジュールが3つほどと、やたら少ない...。

for_door_phone_main:~$ lsmod
xfrm_interface     20480 0
xfrm6_tunnel      16384 1 xfrm_interface
tunnel6        16384 2 xfrm_interface,xfrm6_tunnel
tunnel4        16384 1 xfrm_interface
xfrm_user       45056 2
xfrm_algo       16384 1 xfrm_user
l2tp_ppp        24576 0
l2tp_netlink      24576 1 l2tp_ppp
l2tp_core       32768 2 l2tp_ppp,l2tp_netlink
ip6_udp_tunnel     16384 1 l2tp_core
udp_tunnel       24576 1 l2tp_core
pppox         16384 1 l2tp_ppp
ppp_generic      49152 2 pppox,l2tp_ppp
slhc          20480 1 ppp_generic
sprdbt_tty       36864 0
uinput         28672 1
binfmt_misc      24576 1
polyval_ce       16384 0
sunxi_cir       20480 0
polyval_generic    16384 1 polyval_ce
rc_core        49152 2 sunxi_cir
sunxi_cedrus      45056 0
videobuf2_dma_contig  24576 1 sunxi_cedrus
snd_usb_audio     278528 0
v4l2_mem2mem      36864 1 sunxi_cedrus
snd_hwdep       20480 1 snd_usb_audio
videobuf2_memops    20480 1 videobuf2_dma_contig
videobuf2_v4l2     24576 2 sunxi_cedrus,v4l2_mem2mem
snd_usbmidi_lib    32768 1 snd_usb_audio
snd_rawmidi      40960 1 snd_usbmidi_lib
snd_seq_device     16384 1 snd_rawmidi
videobuf2_common    49152 5 sunxi_cedrus,videobuf2_dma_contig,videobuf2_v4l2,v4l2_mem2mem,videobuf2_memops
videodev       204800 4 sunxi_cedrus,videobuf2_v4l2,videobuf2_common,v4l2_mem2mem
mc           53248 6 sunxi_cedrus,videodev,snd_usb_audio,videobuf2_v4l2,videobuf2_common,v4l2_mem2mem
sprdwl_ng       352256 0
sunxi_addr       20480 1 sprdwl_ng
cfg80211       376832 1 sprdwl_ng
rfkill         36864 5 sprdbt_tty,cfg80211
uwe5622_bsp_sdio   208896 2 sprdbt_tty,sprdwl_ng
fuse         131072 5
nfnetlink       20480 1
dw_hdmi_cec      16384 0
motorcomm       24576 1
dwmac_sun8i      28672 0
mdio_mux        16384 1 dwmac_sun8i
display_connector   20480 0
for_door_phone_main:~$

 ということでカーネルは同じなのでスマートスピーカー用にコンパイルした結果の[linux-image-next-sun50iw9_1.0.6_arm64.deb]をコピーしてドアホン室内機用のOrange Pi Zero 3/Opi OS trixieにインストールしたところ、一挙解決、lsmod結果リストが急増、-fオプションはともかく、-Dオプションなしなarecord/aplayで録音も再生もできるようになりました。

 ちなみにdebパッケージ名のバージョンの一部の[*1.0.6*]は、Orange PiもしくはOrange Pi Bookwormのバージョンであり、[next-sun50iw9]版を選択していればインストールされるカーネルは6.1.31-sun50iw9。

 早速のこの状況は、比較対象としてありがたいこと、この上ないので、それぞれ、lsmod出力結果をコピー・保存、sortしたものをファイルにしてcommで比較するとドアホン室内機用の方が、カーネルモジュールがだいぶ多い一方、snd_usb_audioとこれに依存するモジュールは共に同じで全一致...。

 念の為、snd_usb_audioとmcを除く、これに依存するモジュールを一旦、sudo modporbe -rで削除し、sudo modporbeで再登録。

 この時、スマートスピーカーの方は、サウンドサーバとしてpipewireをインストール、その際、pulseaudioは削除されるとあった(本当に綺麗サッパリ削除されれば、あるべき姿な)ものの、pipewireインストール後にpactl infoでpipewireになっていることを確認後もdpkg -l pulseaudioしてみるとあることになっているが、which -a pulseaudioするとないというカオスになっており...、他方、ドアホン用のサウンドサーバはpulseaudio。

 これは、もしや、PulseAudioとPipeWire間のシステム上の不整合か、pipewireの不具合か?とpipewire/pipewire-bin/pipewire-pulseをapt purgeするとwireplumberもろとも削除され、これについては、本来の挙動通り、pulseaudioがインストールされたようでpulseaudio -kで起動していないと怒られ、pulseaudio -D、pulseaudio -k、pulseaudio --start、-Dオプションなしなarecord/aplayで録音も再生もできるように。

 現在、平行して検証中なのですが、Linux SDK(build.sh)でフルビルド後のイメージのインストール直後、サウンドサーバはALSAだったので、自身が後にPulseAudioをインストールしたようでPipeWireを使うべく、これをインストールしたことに起因したことになり、PulseAudioのまま使っていれば、要らなかった手間だった模様。

 現にドアホン室内機用は、カーネルインストールのみで解決、スマートスピーカー用は、この手間を要したので、間違いないでしょう。

 ただ、当初、pulseaudio -Dを忘れていた自身としては、PipeWireにしてもsystemctl --user start pipewire.service pipewire.socketしたかどうか怪しく、これをしていたら、使えていたかも?と思わなくもありません。

アップグレードしたOrange Pi OS trixieでもスマートスピーカー復活

 こうしたカーネルのコンパイルと(実機への)インストール、PipewireからPulseAudioへ戻すことで、ようやく、スマートスピーカー用のtrixieでも-Dオプションなしでarecord/aplay、pactl set-default-sourceでUSBマイクやWebカメラ内蔵マイクをデフォルトにすることもできるようになり、Webカメラ内蔵マイク+USBスピーカーでスマートスピーカー自体も無事、機能するようになりました。

 ちなみにpactlは一時的、pacmdは恒久的に設定されるものだった気がして前者で再起動後も有効で恒久設定されたのが不思議ですが、気の所為?バグ?仕様変更?

 副産物として比較検証した、その過程でサウンドサーバがPulseAudioでUSBマイク使用の自作テレビドアホン室内機用のOrange Pi Zero 3も復活。

 また、これを踏まえてmicroSDの不調っぽくtrixieへのアップグレード後、再起動できなかった同じくサウンドサーバがPulseAudioでUSBマイク使用の自作テレビドアホン子機用のOrange Pi Zero 3のtrixieも子機機能を満たすためのアプリインストールと不調なmicroSDから必要ファイルコピー、動作確認を残すのみ。

ホーム前へ次へ