CentOS7では rule で ethX のネットワークデバイス名称を指定しても無視される

表題のとおりです。
CentOS6系までは、MAC Address や PCIパス を指定して ethX のようにネットワークデバイスの名称を指定することができましたが、CentOS7からは ethX についてはできなくなりました。特に、複数のNICを刺したPCIパスが昇順で並んでいないときに影響があります（例えば VMware ESXi 上でNICを追加していった場合など）。

つまりこういうこと

## CentOS6まで
```
# /etc/udev/rules.d/70-persistent-net.rules
# mac address が 00:00:00:00:00:01 のNICのネットワークデバイス名称が eth0 になる
# NICが何枚あろうとその都度記述すればOK
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:00:00:00:00:01", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
```

## CentOS7から
```
# consistent network device naming を無効にする
# GRUB_CMDLINE_LINUX を編集
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos_vpn/root rd.lvm.lv=centos_vpn/swap rhgb quiet net.ifnames=0 biosdevname=0"
grub2-mkconfig -o /boot/grub2/grub.cfg

# ruleの無効化
n -s /dev/null /etc/udev/rules.d/80-net-name-slot.rules
reboot

# 独自の rule を追加
# /etc/udev/rules.d/70-my-net-names.rules
# 以下のように設定したい
# MAC Address を指定しても良いし PCIパス で指定しても良い
# MAC Address "00:00:00:00:00:01"　PCIパス 0000:01:00.0 => eth1
# MAC Address "00:00:00:00:00:02"　PCIパス 0000:02:00.0 => eth2
# MAC Address "00:00:00:00:00:03"　PCIパス 0000:03:00.0 => eth3
# MAC Address "00:00:00:00:00:03"　PCIパス 0000:04:00.0 => eth4
# この場合、反映されない（PCIパスの順序どおりに番号がつく）
# MAC Address指定
SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:00:00:00:00:01",,NAME="eth0"
SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:00:00:00:00:02",,NAME="eth1"
SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:00:00:00:00:03",,NAME="eth2"
SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:00:00:00:00:04",,NAME="eth3"

# PCIパス指定
# PCIパスの調べ方
#   ethtool -i NICDEVICE
#   lspci
#   udevadm info -a --path=/sys/class/net/NICDEVICE
SUBSYSTEM=="net", ACTION=="add", KERNEL=="eth*", SUBSYSTEMS=="pci", KERNELS=="0000:01:00.0", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", KERNEL=="eth*", SUBSYSTEMS=="pci", KERNELS=="0000:02:00.0", NAME="eth1"
SUBSYSTEM=="net", ACTION=="add", KERNEL=="eth*", SUBSYSTEMS=="pci", KERNELS=="0000:03:00.0", NAME="eth2"
SUBSYSTEM=="net", ACTION=="add", KERNEL=="eth*", SUBSYSTEMS=="pci", KERNELS=="0000:04:00.0", NAME="eth3"

# こうすると反映される
# MAC Address指定
SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:00:00:00:00:01",,NAME="lan0"
SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:00:00:00:00:02",,NAME="lan1"
SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:00:00:00:00:03",,NAME="lan2"
SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:00:00:00:00:04",,NAME="lan3"

# PCIパス指定
SUBSYSTEM=="net", ACTION=="add", KERNEL=="eth*", SUBSYSTEMS=="pci", KERNELS=="0000:01:00.0", NAME="lan0"
SUBSYSTEM=="net", ACTION=="add", KERNEL=="eth*", SUBSYSTEMS=="pci", KERNELS=="0000:02:00.0", NAME="lan1"
SUBSYSTEM=="net", ACTION=="add", KERNEL=="eth*", SUBSYSTEMS=="pci", KERNELS=="0000:03:00.0", NAME="lan2"
SUBSYSTEM=="net", ACTION=="add", KERNEL=="eth*", SUBSYSTEMS=="pci", KERNELS=="0000:04:00.0", NAME="lan3"
```

もちろん ifcfg-eth0 に HWADDR と DEVICE を設定すればいいじゃないか？という意見はあるが、それを試したところ NAME=ethX とした場合何故か反映されなかった。もちろん ethX ではなく lan0 などにすると反映された。

どうやら ethX と言う名称を明示的にこちらから指定するようなことができないようだ。

## ネットワークデバイス名称に関連するファイル類
```
/usr/lib/udev/rules.d/60-net.rules 
/usr/lib/udev/rules.d/80-net-name-slot.rules
```
命名スキームに関する詳細
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/ch-Consistent_Network_Device_Naming.html#sec-Naming_Schemes_Hierarchy

## ネットワークデバイス名の指定置いて "eth" 接頭語は非推奨となった
上記のように自分自身で名前をつけたい際の接頭語として "eth" の挙動が明らかに異なる理由は、RHEL7やCentOS7以降に於いては、"eth"接頭語の利用が非推奨となったことに起因する。

https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/sec_Troubleshooting_Network_Device_Naming.html

```
例8.3 ifcfg ファイル内の ethX 名の命名スキームが機能しない場合
カーネルネームスペースからのインターフェイス名の使用は推奨されません。予測可能かつ安定性のあるインターフェイス名を付けるには、"eth" 以外の接頭辞を使用してください。 
```