Linux

udevを使ってPCIバスIDとNIC名称を固定する方法

More than 3 years have passed since last update.


MACアドレスとNIC名称の固定

CentOS 6ではMACアドレスとNIC名称を固定する設定が/etc/udev/rules.d/70-persistent-net.rulesに投入されています。

# This file was automatically generated by the /lib/udev/write_net_rules

# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x10ec:0x8139 (8139cp)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:xx:xx:xx", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

このように設定で指定されていてMACアドレス52:54:00:xx:xx:xxのNICは必ずeth0という名前になります。

この状態で不便なところは物理サーバの筐体故障が発生したときです。復旧作業でディスクを同スペックの別筐体にのせかえることがありますが、MACアドレスが変わっているので新しい筐体のNICをeth0として認識してくれません。eth0として認識させるためには先ほどの設定ファイルにある52:54:00:xx:xx:xx部分を書き換える必要があります。

仮想サーバでもディスクイメージを複製して複数のサーバを立ち上げたいときに書き換えの手間が発生します。


MACアドレスからPCIバスIDに変更

udevではMACアドレスの他にPCIバスIDを使ってNIC名称を固定することができます。

1.まずMACアドレスが設定されているファイルを削除して書き込めないようにします。

# ln -fs /dev/null /etc/udev/rules.d/70-persistent-net.rules

2.PCIバスIDをethtoolコマンドから確認します。

# ethtool -i eth0 | grep bus-info

bus-info: 0000:00:03.0

3.このPCIバスIDを使ってudevルールを/etc/udev/rules.d/99-net.rulesに書き込みます。

SUBSYSTEM=="net", ACTION=="add", KERNEL=="eth*", SUBSYSTEMS=="pci", KERNELS=="0000:00:03.0", NAME="eth0"

以上で完了です。これで筐体を変えても同じ機器構成の筐体であれば同じNIC名称で認識してくれます。

参考にMACアドレスからPCIバスIDに変更するスクリプトです。認識している全NICのPCIバスIDを取得してudevルールを設定します。


bash

#!/bin/bash

ln -fs /dev/null /etc/udev/rules.d/70-persistent-net.rules

net_rules=/etc/udev/rules.d/99-net.rules
rm -f $net_rules

for nic in `ifconfig -a | awk '/^eth/ {print $1}'`
do
nic_pciid=`ethtool -i $nic | awk '/^bus-info/ {print $2}'`
echo 'SUBSYSTEM=="net", ACTION=="add", KERNEL=="eth*", SUBSYSTEMS=="pci", KERNELS=="'$nic_pciid'", NAME="'$nic'"' >> $net_rules
done


※このスクリプトを実行すると/etc/udev/rules.d/99-net.rulesが削除されるのでご注意ください。


おわりに

udevはこの他にも処理の途中でスクリプトを実行できたりもします。複数のiscsiへ接続する際は接続した順番でデバイス名が変わってしまい確認がめんどうです。ですが簡単なスクリプトを用意すれば毎回同じディレクトリにマウントさせるといったことも行えます。

以上udevの利用方法紹介でした。