Linuxカーネルやファームウェア[1]を最新のものに更新するとWiFiがつながらなくなることがよくある。よかれと思って加えられた修正が実際のチップの動作に影響を与えるケースだ。逆にLinuxカーネルが古いとつながらないWiFiチップもあるので、ユーザーは枯れた(=長く使われており安定している)カーネルと最新カーネルの間のスイートスポットに浮かんで生きてゆかなければならない[2]。
今回の対象は Realtek RTL8723BS。SDIO[3]接続の古めの WiFi/Bluetooth チップで、タブレットや小型端末などで見かけることがある。Linux 7.0系カーネルへ更新したあと、この RTL8723BS 搭載機で WiFi のクライアント接続ができなくなった。
結論から言うと Linux 6.18系カーネルに戻せばいいだけだったが、あるある話のひとつとして記録しておく。
今回の端末: マウスコンピューター NH1
今回手元でWiFiに接続できなかったのはマウスコンピューターのスティック型PC「NH1」。

販売元のFAQでは MS-NH1 / MS-NH1-64G 製品仕様(Windows8.1) として掲載されている機種で、文書の更新日は2015年7月23日になっている。初期搭載OSは Windows 8.1 世代で、Windows 11へアップグレードして使い続けるような機種ではない[4]。
ただ、中古市場では数千円程度で流通していることがあり、HDMIに直接挿せる小型PCとしてはまだ使い道がある。当社ではこうした古いスティック型PCに genpack で作った専用Linuxイメージを上書きして、監視、表示、簡易な常時稼働端末などに使っている。
genpackで固めた環境にしておくと、端末ごとに手作業で設定を積み上げるのではなく、「この用途の端末はこのOSイメージ」という形で再現できる。壊れたら別の中古端末に同じイメージを書き込んで差し替えられるので、安価な機材を業務用途の小さなアプライアンスとして扱いやすい。
・・・のだが、こういう古いマイナーマシンのマイナーなチップはどうしてもテストする人が少ないため、最新カーネルで動かなくなるというのがまことによくある。
症状
問題が出た環境では、黒い画面に次のようなログが繰り返し出ていた。

rtl8723bs mmc0:0001:1 wlan0: xmit_xmitframes: coalesce failed with error -22
rtl8723bsはまだstagingのドライバ
rtl8723bs ドライバは、Realtekの古いベンダードライバ由来のコードを Linux 向けに取り込んだものだ。2017年に staging 領域へ入り、現在もクリーンアップが続いている。
staging は、Linuxカーネル本体のツリーには入っているが、品質や設計の面でまだ整理中のドライバが置かれる場所だ。つまり「使えることは使えるが、内部実装はまだ手入れ中」という位置づけになる。そしてこのrtl8723bsを含む多くのドライバが万年stagingだ。
原因候補
どうも Linux 7.0のマージウィンドウでは、この rtl8723bs ドライバに多くのクリーンアップが入ったようで、Phoronix の記事では staging まわりの変更としてそのことを紹介している。
「コードをきれいにする」という行為は「何らかの理由でやむを得なく汚かったコード」まできれいにして動かなくしてしまうことがよくあるので、今回の問題がこれに関係しているであろうことが想像できる。
試したが効かなかったもの
Linuxの WiFi トラブルをフォーラムに相談すると、まず真っ先に返ってくる返事は「省電力設定を切れ」だ。例えば rtw_power_mgnt=0 のような引数をモジュールに与えることで改善するケースもある。
今回の問題を調べた時もそういったワークアラウンドに関する情報がヒットしたが、それでは改善しなかった。やはり前述のように掃除してはいけないものを掃除してしまったのだろう。
genpackでの回避
というわけで、カーネルを 6.18へ戻すことで解決した。genpack.json5 のpackages節でカーネル指定を次のように変更。
- "sys-kernel/gentoo-kernel-bin": null,
+ "<sys-kernel/gentoo-kernel-bin-7": null,
これで、Gentoo Linux のパッケージアトム指定をそのまま使って「sys-kernel/gentoo-kernel-bin のうち、バージョン 7 未満で最も新しいもの」を選択できる。
単に特定バージョンへ固定するのではなく、Gentoo の依存解決に「7未満」という条件だけを渡せるのが重要だ。Linux 6系側でセキュリティ更新や安定版更新が出れば、その範囲内で新しい gentoo-kernel-bin が選ばれる。RTL8723BS 側の問題が Linux 7.0系で修正されたら、この制約を外して通常の指定に戻せばよい。
余ったPCにLinuxを入れて活用!などと簡単に言う人はまだまだ経験値が足りない
RTL8723BS は、ハイエンドなノートPCというより、小型PC、タブレット、組み込み寄りの端末で出会いやすいチップだ。こういう機材は「余っているから用途を決めて使う」ことが多く、いったん動けばそのまま長く使われる。
そのぶん、カーネルやドライバの変更で突然ネットワークが切れると困る。SSHで入るつもりだった端末がネットワークに出てこない、作業用の小型端末がアップデート後に孤立する、という地味に嫌な障害になりがちだ。かといって日々新たな脆弱性がAIによって発見されていくため、脆弱性の種類にもよるがアップデートをしないわけにもいかない。
組み込み寄りの用途でLinuxを日常的に使うなら、パッケージ側でバージョン条件を適切に指定できること、前のカーネル系列で起動できること、イメージを作り直して簡単に差し替えられることは、地味だがかなり重要である・・・という経験から生まれたツールチェーンが genpackなのである。
関連記事
- Postfix 3.10が Linuxカーネル7系でビルドできなかった話
- LinuxのソフトウェアRAIDを利用する
- GNOME Remote Desktopで日本語キーボードが正しく認識されない問題の回避策
ファームウェアはドライバと別に提供されるもので、ドライバがOSにロードされた時にデバイス自身にロードされる。WiFi関連はドライバがバグることもよくあるがファームウェアもよくバグる。 ↩︎
もっとも、一般ユーザーが利用するようなディストリビューションでは自動アップデートで突然カーネルのメジャーバージョンが上がるようなことはないので、ここでいうユーザーとは自分でカーネルを差し替えるようなどこかおかしいユーザーのことである。 ↩︎
SDカード用の接続規格を拡張して周辺機器も接続できるようにした仕組み。小型機の内部接続によく使われている。 ↩︎
Windows11にアップグレードできるかどうかは各種条件により決まるのだが、条件をすべてクリアできるのは比較的新しい機種だけとなる。 ↩︎