Orange Pi Zero 3用にLinuxカーネルとブートローダU-Bootをコンパイル、実機へインストールしてみた話。
尤も今回の経緯に至った主な原因を突き止め、検証を行った結果、アップグレード前に打つべき対策がわかったので、そうしておけば、当記事の内容を実施する必要もないのですが、経験としては無駄ではなかったということで。
その発端は、同ボードを使っていた自作スマートスピーカー専用機でDebianベースなOrange Pi OS Bookwormをtrixieにアップグレードしてみたこと。
ちなみに同様にノートPC/Debian、Raspberry 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カメラを認識できていなかった...。
一体なぜ...?と状況を辿ってみると、その主な原因が見えてきました。
参照先:Linux SDK / Orange Pi Wiki。
要約すると、今回の不具合解消の手順は、たった、これだけ。
が、主な原因が想定通りであれば、事前に対処しておけば、これを行う必要さえもないということになりますが...。
ただ、Linux SDKを使ってみると、それはそれで思うところもあり...。
他の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 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は、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は、快適そのものですが。
ともあれ、自作スマートスピーカー用の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つほどと、やたら少ない...。
ということでカーネルは同じなのでスマートスピーカー用にコンパイルした結果の[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したかどうか怪しく、これをしていたら、使えていたかも?と思わなくもありません。
こうしたカーネルのコンパイルと(実機への)インストール、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から必要ファイルコピー、動作確認を残すのみ。