果報

二度寝して待つ

「RTL8111/8168/8411」と「r8169」の不適合による接続エラーを解消した

自宅サーバに突然接続できなくなるという事象を解決したときの備忘メモです。

事象

自宅サーバ(Ubuntu 22.04)ではNextcloudやAdGuard Homeなどを動かしていて、TailscaleやCloudflare Tunnelを経由して自宅のネットワーク外から接続していますが、たまに繋がらなくなることがありました。

この事象が起きるとすべての通信が接続不可になり、サーバを再起動するまで解消されません。そのうえ契機は不明で、1週間に1回程度は起きるという状態でした。

調査

さすがに対応が面倒になってきて調べたところ、/var/log/syslog上でDNSなどのエラーが大量に発生する(おそらく接続不可になっている)直前に、以下のメッセージが毎回記録されていました。

NETDEV WATCHDOG: enp1s0 (r8169): transmit queue 0 timed out

また、このメッセージを頼りにぐぐったところ、どうやら使用しているNICとドライバのバージョンが一致していない可能性があるとのこと。

qiita.com

というわけで早速確認してみます。

# lspci | grep Ether  
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)

# lsmod | grep r81  
r8169                 114688  0

結果、Realtek製の「RTL8111/8168/8411」というNICに対して、OS側では「r8169」というドライバが使用されている(つまり不一致である)ことが判明しました。

解決

以下のコマンドを実行して、NICに対応した「r8168」のドライバをインストールします。

$ sudo apt install r8168-dkms

既存の「r8169」はアンインストールしなくても上書きされますが、予めUEFI/BIOSからセキュアブート設定を無効にしていないとインストールされないようです。

実際、インストール中にセキュアブートの状態を確認するようなログ(以下参照)が表示されました。

Secure Boot not enabled on this system.
Done.**

r8168.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/6.2.0-36-generic/updates/dkms/

インストールが完了したらOSを再起動し、再度ドライバを確認します。

# lsmod | grep r81
r8168                 630784  0

再起動後、無事に「r8168」に変更されました。

変更後、1週間以上経過していますが、今のところ再発していません。というわけで、おそらくめでたし。

参考:自宅サーバのハードウェア

自宅サーバはMeLEの「Quieter 3Q」というミニPCを使用しています。手のひらサイズの薄型で場所を取らず、ファンレスなので静かです。

上記の「Celeron N5105 8GB 128GB」モデルに、1TBのM.2 SSDを追加で調達して、そこにUbuntuをインストールしています(既存のWindows 11とのデュアルブート)。

使い始めて1年以上になりますが、特に故障や異常もなく、今のところ満足度高いです。

追記(2024/1/14)

カーネル上げたら接続できなくなったのでソースコードからインストールし直しました。

text.yusukesakai.com