ProxmoxVEでRealtekのNICが繋がらなくなる問題


# はじめに
ASRockのマザーボード(AB350 Pro4)でProxmoxVEサーバーを構築。ボードに搭載されているRealtek社製NIC(RTL8111/8168/8411)のドライバーに問題があり、通信ができなくなることがあった。対処法をまとめる。

自分のマシンのNICが該当するか確認

```bash
lspci | grep RTL8
25:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 11)
```

8168というのが見えれば、問題のNIC。

# 問題点
1. 8168のNICについて自動で8169のドライバーが使用されてしまう
2. 8169のドライバーには通信ができなくなる不具合がある
3. ProxmoxVEのカーネルのバージョンアップにドライバーがついてこれない

# 解決方法

## r8169が自動で読まれる問題について
モジュールのブラックリストにr8169を記載して強制的に読み込ませないようにする。
まず現時点でr8169を使用しているか確認。grepで1行ヒットすれば使用していることがわかる。

```bash
lsmod | grep r8169
r8169                 548864  0
```

ProxmoxVEの場合、モジュールのブラックリストは以下のファイルを編集する。

```bash
vim /etc/modprobe.d/blacklist.conf
# 以下を追記
blacklist r8169
```

これでマシン起動時にはr8169が読み込まれなくなるが、代わりにr8168を入れないと通信ができなくなる。

## r8168のインストールについて
Reaktekの公式サイトからソースコードをダウンロードして、コンパイルして使用する。
コンパイルした際のカーネルとバージョンが合わなくなると動作しなくなるので、カーネルのアップグレード後には自動でドライバーもアップグレードする仕組みが必要。

### 必要なもの

```bash
apt install build-essential # コンパイルに必要
apt install pve-headers # ProxmoxVEのカーネルのヘッダー情報
apt install dkms # カーネルのアップグレード時にドライバーをアップグレードする仕組み
```

### ドライバーの入手
以下サイトから入手。wgetやcurlではダウンロードさせてくれない様子。

https://www.realtek.com/Download/List?cate_id=584

下の画像でいう、「GBE Ethernet LINUX driver r8168 for kernel up to 6.8」のリンク先のファイルが該当(Proxmox 8.xの場合)

![スクリーンショット 0006-09-24 8.00.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65278/9a2c67a6-ee7f-444b-9f4e-d4bdda74e6ac.png)

scpコマンドなどでなんとかProxmoxVEにコピー。

### 試しにコンパイル
ドライバーの自動アップデートの前に、コンパイルがうまくいくか手動で試しておく。

```bash
# ファイルのバージョンは変化します。ディレクトリはどこでもいいです
tar xf r8168-8.053.00.tar.bz2
cd r8168-8.053.00/
./autorun.sh
```

ビルドに必要なものが揃っていれば、エラーが表示されないはず。モジュールがロードされているか確認する。

```bash
lsmod |grep r8168
r8168                 548864  0
```

その後、マシンを再起動して通信ができることを確認しておく。

## ドライバーの自動アップデート
これでr8168をインストールできたのだが、apt upgradeしたりするとカーネルのアップグレードが走りドライバーと噛み合わなくなり通信できなくなる。
apt upgradeした際には自動でドライバーも更新するようにする。

```bash
cp -r r8168-8.053.00 /usr/src/ # 解凍したさっきのフォルダを丸ごとコピー
vim /usr/src/r8168-8.053.00/dkms.conf # dkmsファイルを作成
```

dkmsファイルの内容は以下のように。8.053.00の箇所はドライバーのバージョンに合わせること。

```bash
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を設定する

```bash
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/

使用しているか確認

```bash
lspci |grep 82574L
22:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection
```

ドライバーのサイト
https://downloadcenter.intel.com/ja/download/15817/Intel-Network-Adapter-Driver-for-PCIe-Intel-Gigabit-Ethernet-Network-Connections-Under-Linux-

```bash
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の内容

```bash
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設定

```bash
dkms -m e1000e -v 3.8.4 add
dkms -m e1000e -v 3.8.4 build
dkms -m e1000e -v 3.8.4 install
```