Proxmox VEで新しいデバイス追加後にネットワークが接続できなくなる問題の解決方法

Proxmox VEを使っていると、新しいデバイスを追加した際にネットワークが接続できなくなることがあります。この問題は、DebianベースのOSがデバイスを認識する際のデバイス名の決定方法に起因します。ここでは、新しいデバイスが追加された際にどのようにデバイス名が決定され、なぜネットワーク接続ができなくなるのか、そしてその対処方法について詳しく説明します。

## デバイス名の決定方法

DebianベースのOSでは、デバイス名は通常、以下の要素に基づいて決定されます：

1. **PCIバスの順序**：PCIバスの順序に基づいてデバイス名が決定されます。新しいデバイスが追加されると、既存のデバイス名が変更されることがあります。
2. **udevルール**：udevルールはデバイス名を固定するために使用されます。特定のデバイスに対してカスタムの名前を割り当てることができます。

## NVMeストレージ追加によるデバイス名の変更

特にNICとは無関係のNVMeストレージを追加した際にもネットワークデバイス名が変更されることがあります。例えば、ネットワークデバイス名が`enp7s0`から`enp8s0`に変更されることがあるのは、PCIバスの順序が変わるためです。

### なぜこのような変更が起こるのか？

NVMeストレージや他のPCIeデバイスを追加すると、PCIバスのアドレスが再計算され、新しいデバイス名が割り当てられることがあります。このため、既存のネットワークデバイスの名前が変わってしまい、設定ファイルで指定されたデバイス名と一致しなくなります。

## PCIデバイスの認識順を確認する方法

PCIデバイスの認識順を確認するには、`lspci`コマンドを使用します。このコマンドを使うことで、PCIデバイスの順序とアドレスを確認できます。

```bash
lspci
```

以下は、`lspci`コマンドの実行結果の例です：

```bash
00:00.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne Root Complex
00:01.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Renoir PCIe Dummy Host Bridge
00:01.1 PCI bridge: Advanced Micro Devices, Inc. [AMD] Renoir PCIe GPP Bridge
00:02.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Renoir PCIe Dummy Host Bridge
00:02.1 PCI bridge: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne PCIe GPP Bridge
00:08.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Renoir PCIe Dummy Host Bridge
00:08.1 PCI bridge: Advanced Micro Devices, Inc. [AMD] Renoir Internal PCIe GPP Bridge to Bus
00:14.0 SMBus: Advanced Micro Devices, Inc. [AMD] FCH SMBus Controller (rev 51)
00:14.3 ISA bridge: Advanced Micro Devices, Inc. [AMD] FCH LPC Bridge (rev 51)
00:18.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Cezanne Data Fabric; Function 0
00:18.1 Host bridge: Advanced Micro Devices, Inc. [AMD] Cezanne Data Fabric; Function 1
00:18.2 Host bridge: Advanced Micro Devices, Inc. [AMD] Cezanne Data Fabric; Function 2
00:18.3 Host bridge: Advanced Micro Devices, Inc. [AMD] Cezanne Data Fabric; Function 3
00:18.4 Host bridge: Advanced Micro Devices, Inc. [AMD] Cezanne Data Fabric; Function 4
00:18.5 Host bridge: Advanced Micro Devices, Inc. [AMD] Cezanne Data Fabric; Function 5
00:18.6 Host bridge: Advanced Micro Devices, Inc. [AMD] Cezanne Data Fabric; Function 6
00:18.7 Host bridge: Advanced Micro Devices, Inc. [AMD] Cezanne Data Fabric; Function 7
01:00.0 Non-Volatile memory controller: Intel Corporation PCIe Data Center SSD (rev 01)
02:00.0 USB controller: Advanced Micro Devices, Inc. [AMD] 500 Series Chipset USB 3.1 XHCI Controller
02:00.1 SATA controller: Advanced Micro Devices, Inc. [AMD] 500 Series Chipset SATA Controller
02:00.2 PCI bridge: Advanced Micro Devices, Inc. [AMD] 500 Series Chipset Switch Upstream Port
03:00.0 PCI bridge: Advanced Micro Devices, Inc. [AMD] Device 43ea
03:06.0 PCI bridge: Advanced Micro Devices, Inc. [AMD] Device 43ea
03:07.0 PCI bridge: Advanced Micro Devices, Inc. [AMD] Device 43ea
03:08.0 PCI bridge: Advanced Micro Devices, Inc. [AMD] Device 43ea
04:00.0 Non-Volatile memory controller: Intel Corporation PCIe Data Center SSD (rev 01)
05:00.0 Non-Volatile memory controller: Intel Corporation PCIe Data Center SSD (rev 01)
06:00.0 Ethernet controller: Intel Corporation Ethernet Controller X550 (rev 01)
06:00.1 Ethernet controller: Intel Corporation Ethernet Controller X550 (rev 01)
08:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
09:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [Radeon Vega Series / Radeon Vega Mobile Series] (rev c9)
09:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Renoir Radeon High Definition Audio Controller
09:00.2 Encryption controller: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 10h-1fh) Platform Security Processor
09:00.3 USB controller: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne USB 3.1
09:00.4 USB controller: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne USB 3.1
09:00.6 Audio device: Advanced Micro Devices, Inc. [AMD] Family 17h/19h HD Audio Controller
```

このリストは、システム内の全てのPCIデバイスを表示しており、それぞれのデバイスがどのバスアドレスにあるかを示しています。ネットワークデバイス（例えば`Ethernet controller`）のバスアドレスが変わると、それに伴ってデバイス名も変更されることがあります。

:::note info
## Hyper-V上のProxmox VEでのlspciコマンドの実行結果

Hyper-Vのような仮想ホスト上にProxmox VEをインストールした場合、`lspci`コマンドを入力してもデバイス一覧が表示されないことがあるようです。
:::

## ネットワークデバイスの確認方法

次のコマンドを使用して、システムに存在するすべてのネットワークインターフェイスを一覧表示することが出来ます。

```bash
ip link show
```

以下は、`ip link show`コマンドの実行結果の例です：

```
root@pve:~# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr0 state UP mode DEFAULT group default qlen 1000
    link/ether a8:a1:59:a5:06:74 brd ff:ff:ff:ff:ff:ff
3: enp6s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr1 state UP mode DEFAULT group default qlen 1000
    link/ether a0:36:9f:20:60:00 brd ff:ff:ff:ff:ff:ff
4: enp6s0f1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether a0:36:9f:20:60:02 brd ff:ff:ff:ff:ff:ff
省略
```

## デバイス名の変更の実例

以下のような状況を考えてみます：

1. OSインストール時にはネットワークデバイスのバスアドレスが`07:00.0`で、デバイス名が`enp7s0`となっている。
2. NVMeストレージデバイスを追加すると、ネットワークデバイスのバスアドレスが`08:00.0`に変更され、デバイス名が`enp8s0`になる。

### 実行結果の確認

デバイス追加前：

```bash
root@pve:/etc# lspci | grep "Realtek"
07:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
```

デバイス追加後：

```bash
root@pve:/etc# lspci | grep "Realtek"
08:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
```

これにより、バスアドレスが変更され、それに伴いネットワークデバイス名も変更されたことが確認できます。

## デバイス名の確認と設定ファイルの修正方法

新しいデバイスを追加した後にネットワークが接続できなくなった場合、以下の手順で問題を解決できます：

### 1. デバイス名の確認

まず、新しいデバイス名を確認します。以下のコマンドを使用して、現在のネットワークデバイス名を確認できます。

```bash
ip link show
```

### 2. ネットワーク設定ファイルの修正

ネットワーク設定ファイル（`/etc/network/interfaces`）を修正して、新しいデバイス名を反映させます。`enp7s0`が`enp8s0`に変更された場合、以下のように修正します。

```bash
root@pve:/etc/network# diff -ruN interfaces.20240709 interfaces
--- interfaces.20240709 2024-01-27 06:50:56.735458961 +0900
+++ interfaces  2024-07-09 23:20:49.794636816 +0900
@@ -12,24 +12,24 @@
 auto lo
 iface lo inet loopback

-iface enp7s0 inet manual
    +iface enp8s0 inet manual

 auto vmbr0
 iface vmbr0 inet static
        address 192.168.11.45/24
        gateway 192.168.11.1
-       bridge-ports enp7s0
+       bridge-ports enp8s0
        bridge-stp off
        bridge-fd 0
```

### 3. ネットワークの再起動

設定ファイルを修正した後OSの再起動を行うか、以下の通りネットワークを再起動します。

```bash
systemctl restart networking
```