インターフェイス名eth0をBIOSデバイス名(例:p35p1)に変更しない設定

Fedoraの場合はFedora15から、Scientific Linux(RHELクローン)の場合はScientific Linux6.1から、デフォルトではネットワークI/F名eth0は起動時にudevによりBIOSデバイス名に変更されます。

参考URL:
http://ja.community.dell.com/techcenter/b/weblog/archive/2011/08/03/fedo...
http://ja.community.dell.com/techcenter/b/weblog/archive/2011/08/29/rhel...

私の使っているPCの例では次のようになります。

・ASUSネットブック EeePC 1001HA: eth0 → p35p1
・ASUSノート U30Jc: eth0 → p5p1
・DELLノート Latitude E5500: eth0 → p4p1

ネットワークI/F名の書き換え(rename)は次のようにして行われます。

カーネル起動
 ↓
カーネルがネットワークI/Fを検知しドライバがインターフェイル名をeth0とする
 ↓
udevイベント発生
 ↓
udevdがイベントを検知
 (Fedora18の場合、udevdは/usr/lib/systemd/systemd-udevd)
 ↓
udevdがudevルールを実行
 ↓
udevルールの中で「biosdevname -i eth0」コマンドが実行される
 (Fedora18の場合、/usr/lib/udev/rules.d/71-biosdevname.rulesから実行される)
 ↓
udevdはインターフェイス名eth0をbiosdevnameによって返されたBIOSデバイス名に書き変える
 この時、udevdはメッセージをリングバッファに出力します。リングバッファの内容はdmesgコマンドで表示できます。
 例:
 $ dmesg | grep rename
 [ 21.044595] systemd-udevd[339]: renamed network interface eth0 to p35p1

SMBIOS(System Management BIOS)にはPCのハードウェアに関する情報が格納されています。biosdevnameコマンドはカーネル内のSMBIOSの情報にioctlシステムコールによってアクセスし、ハードウェア構成を基にしたインターフェイス命名規則によりBIOSデバイス名を生成してudevdに返します。

参考URL:
http://ja.wikipedia.org/wiki/SMBIOS

ASUSネットブック EeePC 1001HAでのbiosdevnameコマンドの実行例:

# biosdevname -i eth0
p35p1

PCIバスに接続されたネットワークI/Fの場合の命名規則は、p<スロット#>p<ポート#>となります。
上記の例では、スロット番号が35、ポート番号が1であることがわかります。

SMBIOSの情報はdmidecodeコマンドにより表示できます。 以下、ASUSネットブックでの実行例です。

# dmidecode
...(途中省略)
SMBIOS 2.5 present.
30 structures occupying 1248 bytes.
Table at 0x000F0720.

Handle 0x0000, DMI type 0, 24 bytes
BIOS Information
	Vendor: American Megatrends Inc.
	Version: 1401   
	Release Date: 02/26/2010
...(途中省略)
System Information
	Manufacturer: ASUSTeK Computer INC.
	Product Name: 1001HA
...(途中省略)
Port Connector Information
	Internal Reference Designator: J5A1
	Internal Connector Type: None
	External Reference Designator: LAN
	External Connector Type: RJ-45
	Port Type: Network Port
...(以下省略)

udevがネットワークI/F名を書き換えるかどうかは、ディストリビューションとPCハードウェアのSMBIOSのバージョンによります。例えば、SMBIOS 2.4のDELLノート Latitude E5500にScientific Linux 6.1がインストールされている場合、udevルールには「biosdevname --smbios 2.6」とバージョン2.6以上が指定されているので、ネットワークI/F名の書き換えは行われません。

[ インターフェイス名eth0をBIOSデバイス名(例:p35p1)に変更しない設定 ]

biosdevnameコマンドを実行するudevルールを、biosdevnameコマンドを実行しないように変更します。
Fedora18の場合、/usr/lib/udev/rules.d/71-biosdevname.rulesファイルの次のように変更します。

# vi 71-biosdevname.rule
...(途中省略)
# uncomment the next line for biosdevname to be off by default
# GOTO="netdevicename_end"  → 行頭の#を外します →「GOTO="netdevicename_end"」

LABEL="netdevicename_start"

# using NAME= instead of setting INTERFACE_NAME, so that persistent
# names aren't generated for these devices, they are "named" on each boot.
PROGRAM="/sbin/biosdevname --policy physical -i %k", NAME="%c", OPTIONS+="string_escape=replace"

LABEL="netdevicename_end"