はじめに
ASRockのマザーボード(AB350 Pro4)でProxmoxVEサーバーを構築。ボードに搭載されているRealtek社製NIC(RTL8111/8168/8411)のドライバーに問題があり、通信ができなくなることがあった。対処法をまとめる。
自分のマシンのNICが該当するか確認
lspci | grep RTL8
25:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 11)
8168というのが見えれば、問題のNIC。
問題点
- 8168のNICについて自動で8169のドライバーが使用されてしまう
- 8169のドライバーには通信ができなくなる不具合がある
- ProxmoxVEのカーネルのバージョンアップにドライバーがついてこれない
解決方法
r8169が自動で読まれる問題について
モジュールのブラックリストにr8169を記載して強制的に読み込ませないようにする。
まず現時点でr8169を使用しているか確認。grepで1行ヒットすれば使用していることがわかる。
lsmod | grep r8169
r8169 548864 0
ProxmoxVEの場合、モジュールのブラックリストは以下のファイルを編集する。
vim /etc/modprobe.d/blacklist.conf
# 以下を追記
blacklist r8169
これでマシン起動時にはr8169が読み込まれなくなるが、代わりにr8168を入れないと通信ができなくなる。
r8168のインストールについて
Reaktekの公式サイトからソースコードをダウンロードして、コンパイルして使用する。
コンパイルした際のカーネルとバージョンが合わなくなると動作しなくなるので、カーネルのアップグレード後には自動でドライバーもアップグレードする仕組みが必要。
必要なもの
apt install build-essential # コンパイルに必要
apt install pve-headers # ProxmoxVEのカーネルのヘッダー情報
apt install dkms # カーネルのアップグレード時にドライバーをアップグレードする仕組み
ドライバーの入手
以下サイトから入手。wgetやcurlではダウンロードさせてくれない様子。
下の画像でいう、「GBE Ethernet LINUX driver r8168 for kernel up to 6.8」のリンク先のファイルが該当(Proxmox 8.xの場合)
scpコマンドなどでなんとかProxmoxVEにコピー。
試しにコンパイル
ドライバーの自動アップデートの前に、コンパイルがうまくいくか手動で試しておく。
# ファイルのバージョンは変化します。ディレクトリはどこでもいいです
tar xf r8168-8.053.00.tar.bz2
cd r8168-8.053.00/
./autorun.sh
ビルドに必要なものが揃っていれば、エラーが表示されないはず。モジュールがロードされているか確認する。
lsmod |grep r8168
r8168 548864 0
その後、マシンを再起動して通信ができることを確認しておく。
ドライバーの自動アップデート
これでr8168をインストールできたのだが、apt upgradeしたりするとカーネルのアップグレードが走りドライバーと噛み合わなくなり通信できなくなる。
apt upgradeした際には自動でドライバーも更新するようにする。
cp -r r8168-8.053.00 /usr/src/ # 解凍したさっきのフォルダを丸ごとコピー
vim /usr/src/r8168-8.053.00/dkms.conf # dkmsファイルを作成
dkmsファイルの内容は以下のように。8.053.00の箇所はドライバーのバージョンに合わせること。
PACKAGE_NAME="r8168"
PACKAGE_VERSION="8.053.00"
MAKE[0]="cd ${dkms_tree}/r8168/8.053.00/build; make KVER=${kernelver} modules"
CLEAN[0]="cd ${dkms_tree}/r8168/8.053.00/build; make clean"
BUILT_MODULE_NAME[0]="r8168"
BUILT_MODULE_LOCATION[0]="src/"
DEST_MODULE_LOCATION[0]="/kernel/drivers/net"
AUTOINSTALL="YES"
dkmsを設定する
dkms -m r8168 -v 8.053.00 add
dkms -m r8168 -v 8.053.00 build
dkms -m r8168 -v 8.053.00 install
エラーが出ず、再起動後も問題なく通信できていればOK。
おまけ(Intel NICのdkms)
備忘録として併用しているIntel NIC(82574Lを使用)の設定も残しておく
蟹NICだけでは不安なので、中古のIntel NICをメルカリで購入した(送料込みで¥900)
2つのNICをbondingして冗長構成で運用中。
価格コム
https://kakaku.com/item/K0000157168/
使用しているか確認
lspci |grep 82574L
22:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection
tar zxfv e1000e-3.8.4.tar.gz
cp -r e1000e-3.8.4 /usr/src
vim /usr/src/e1000e-3.8.4/dkms.conf
以下、dkms.confの内容
PACKAGE_NAME="e1000e"
PACKAGE_VERSION="3.8.4"
MAKE[0]="cd src/ && make KVERSION=$kernelver BUILD_KERNEL=$kernelver"
CLEAN="cd src/ && make clean"
BUILT_MODULE_NAME[0]="e1000e"
BUILT_MODULE_LOCATION[0]="src/"
DEST_MODULE_LOCATION[0]="/updates"
REMAKE_INITRD="yes"
AUTOINSTALL="yes"
dkms設定
dkms -m e1000e -v 3.8.4 add
dkms -m e1000e -v 3.8.4 build
dkms -m e1000e -v 3.8.4 install