どれくらい再現するのか不明ですが、自分と同じ状況に陥った方の参考になればとメモしておきます。
Ver. 3以降のRaspberryPiでは無線LAN機能はオンボですが、2まではEthernetのみでした。そのためUSBの無線LANドングルを接続して利用するのが一般的。
自宅に転がっていたRealtekのrtl8192cuを搭載した子機を使っていたところ、タイトルの問題が発生しました。
ちなみに数百円程度の安い無線LAN子機によく搭載されているrtl8192cuですが、Linuxと相性があまり良くないというのは昔から指摘されています。
一応、現時点(2025/8)のRaspberry Pi OSでは、rtl8192cuのドライバが最初から組み込まれているため、OSのインストール直後から無線LAN環境での運用が可能でした。
無線LAN接続が数時間で切れてしまう対策
私の環境では起動してから5時間弱ほどで切れる、という謎の現象が発生していました。
dmesgコマンドで確認すると下記の通り。
[64687.250318] rtlwifi: AP off, try to reconnect now
[64687.250392] wlan0: Connection to AP 12:34:56:78:9a:bc lost
[64728.529181] rtl_usb: Urb has error status 0xFFFFFF94
[64728.529264] rtl_usb: Urb has error status 0xFFFFFF94
[64728.529283] rtl_usb: Urb has error status 0xFFFFFF94
[64728.529298] rtl_usb: Urb has error status 0xFFFFFF94
・
・
・
やはりドライバー周りが不安定なのが原因かと思います。
省電力設定などで不安定になるといった情報もありましたが、私の環境では省電力設定はオフになっています。
対処法としては、ドングルを接続してから数時間は正常に動作するので、システムレベルで切断&再接続を行うことで解決?しました。
まず、
ip a
コマンドで、対象のネットワークインターフェースを確認します。
次に
lsusb -t
で、対象デバイス(Driver=rtl8192cuとの表記)のBusとPort番号を確認します。
ラズパイ2のUSBコネクタ場合、Busと1段目のPortはどちらも1番で、2段目のポートが5つあります。(Ethernetコネクタが1番、USBコネクタが2~5番)
例えば、2段目のポートの5番にドングルが接続されているなら、1-1.5というディレクトリが下記にもあるはずなので確認してください。
/sys/bus/usb/drivers/usb/
そしてこの番号(ディレクトリ名)を元に、直接unbindとbindを行います。
最初に確認したネットワークインターフェースと合わせて、rootのcronに下記の設定を行います。
* * * * * if nmcli d s | grep -q -e "^wlan0.*disconnected"; then echo "disconnected. Unbinding/binding 1-1.5 at $(date)"; echo "1-1.5" | tee /sys/bus/usb/drivers/usb/unbind; echo "1-1.5" | tee /sys/bus/usb/drivers/usb/bind; fi >> /var/log/usb_reconnect.log 2>&
行っている内容としては、 ネットワークインターフェースの状態を毎分確認し、もし切断されていたら対象のUSBデバイスを抜き差し、ということをソフト的に行っています。
(bind,unbindのファイルにバス&ポート番号を書き込むとそういう動作になります)
ログを/var/log/usb_reconnect.logに吐いていますが、ここは任意で。
コメント