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ルールを設定します。
#!/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の利用方法紹介でした。