Proxmoxのインターフェイス名を固定する方法

# 1. 背景
以下の書籍の内容にProxmox VE 8.2へのアップデート時にNICのインターフェース名が変更され、システムへのアクセスが不可になる事象が発生した件について記載があります。
私は8.3からProxmoxのお世話になっているので経験がありませんが、今後も発生する可能性があるので、インターフェイス名を固定化しておきます。

https://www.amazon.co.jp/dp/4295021253?ref_=ppx_hzsearch_conn_dt_b_fed_asin_title_1

# 2. 対応
## インターフェイス名の確認方法
書籍には、以下のように「hwloc」をインストール後、「hwloc-ls」にてデバイス情報を確認する方法が記載されていますが、今回使用しているGMKtec製ミニPCはオンボードLANとUSB接続LANのため、オンボードLANしか記載されていません。（以下の実行結果の通り、Ethernet(enp3s0)が１つしか表示されていない）
```diff_shell
apt update
apt install -y hwloc
```
```diff_shell
root@BETA:~# hwloc-ls
Machine (15GB total)
  Package L#0
    NUMANode L#0 (P#0 15GB)
    L3 L#0 (6144KB) + L2 L#0 (2048KB)
      L1d L#0 (32KB) + L1i L#0 (64KB) + Core L#0 + PU L#0 (P#0)
      L1d L#1 (32KB) + L1i L#1 (64KB) + Core L#1 + PU L#1 (P#1)
      L1d L#2 (32KB) + L1i L#2 (64KB) + Core L#2 + PU L#2 (P#2)
      L1d L#3 (32KB) + L1i L#3 (64KB) + Core L#3 + PU L#3 (P#3)
  HostBridge
    PCI 00:02.0 (VGA)
    PCI 00:17.0 (SATA)
    PCIBridge
      PCI 01:00.0 (Network)
        Net "wlp1s0"
    PCIBridge
      PCI 02:00.0 (NVMExp)
        Block(Disk) "nvme0n1"
    PCIBridge
      PCI 03:00.0 (Ethernet)
        Net "enp3s0"
  Misc(MemoryModule)
```

USB接続のインターフェイス名を知るためには、以下のように「ip addr」コマンドにて出力させるほうがよさそうです。enp3s0がオンボードLANで、enxc8a362b21730がUSB接続LANになります。今回はこのインターフェイス名「enxc8a362b21730」とMACアドレスをメモします。
```
～省略～
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr0 state UP group default qlen 1000
    link/ether e0:51:d8:19:4e:7e brd ff:ff:ff:ff:ff:ff
3: enxc8a362b21730: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr1 state UP group default qlen 1000
    link/ether c8:a3:62:b2:17:30 brd ff:ff:ff:ff:ff:ff
～省略～
```

## インターフェイス名の固定化
インターフェース名の固定化方法は、以下の場所へ「\<n>-\<id>.link」というファイルを新規作成します。
```
/etc/systemd/network/<n>-<id>.link
```
\<n>：任意の番号（0~99）
\<id>：インターフェイス名

なお、今回の方法はMACアドレスとインターフェイス名を関連付けるため、NICの交換を行うと再設定が必要になる点に注意します。

私の環境では、２つのファイルを作成しています。

```
1-enp1.link：旧enp3s0(オンボードLAN)
2-enx2.link：旧enxc8a362b21730（USB接続LAN）
```
※USB接続LANのインターフェイス名をenxにしている理由は、書籍をご参照ください。インターフェイス名は正直、自身がわかれば何でも大丈夫です。

それぞれのファイル内容は以下の通りです。

```1-enp1.link
[Match]
MACAddress=e0:51:d8:19:4e:7e
Type=ether

[Link]
Name=enp1
```
```2-enx2.link
[Match]
MACAddress=c8:a3:62:b2:17:30
Type=ether

[Link]
Name=enx2
```
記載方法は以下の通りです。
```
[Match]
MACAddress=<該当インターフェイスのMACアドレス>
Type=ether（固定）
[Link]
Name=<インターフェイス名>
```

## vmbr0とインターフェイスの関連付け
上記のlinkファイルを作成し再起動を行えば、設定が反映されるのですが、
Proxmox導入時に設定しているNIC(vmbr0)と今回設定した新しいインターフェイス名の関連付けが外れる可能性があり、最悪WEBブラウザ経由でアクセスできなくなるため、もうひと手間かけます。

Proxmox基盤にTeraTermでSSH接続し、
以下のファイルを編集していきます。
```diff_shell
root@BETA:/etc/network# vi interfaces
```
```diff_conf
auto lo
iface lo inet loopback

auto enp1
iface enp1 inet manual　※変更したインターフェイス名に合わせる

auto enx2
iface enx2 inet manual　※変更したインターフェイス名に合わせる

auto vmbr0
iface vmbr0 inet static
    address 10.0.0.2/24
    gateway 10.0.0.254
    bridge-ports enp1　※変更したインターフェイス名に合わせる
    bridge-stp off
    bridge-fd 0
```

## initramfsの更新、ホスト再起動
追加した「\<n>-\<id>.link」ファイルはinitramfs(システム起動時に参照されるファイルシステム)にコピーされるため、initramfsを更新後ホストマシンの再起動を行います。

```diff_shell
update-initramfs -u -k all
shutdown -r now
```

## 起動後の確認
再起動後には、以下のように「ip address」コマンドで変更結果を確認します。変更後のインターフェイス名に更新されていれば成功です。

```diff_shell
root@BETA:~# ip address show enp1
2: enp1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000
    link/ether e0:51:d8:19:4e:7e brd ff:ff:ff:ff:ff:ff
root@BETA:~# ip address show enx2
3: enx2: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
    link/ether e0:51:d8:19:4e:7e brd ff:ff:ff:ff:ff:ff permaddr c8:a3:62:b2:17:30
root@BETA:~# 
```

# 3. おわりに
インターフェイス名はかっこよくなりましたね。