2008-03-08
What controls Red Hat Enterprise's ethN device names
Since I just went digging for this the other day, here's what I know about what controls what Ethernet devices get named on Red Hat Enteprise (and probably also on Fedora, but I haven't looked at my Fedora systems in this level of detail).
- if
kudzu
is enabled, it uses/etc/sysconfig/hwconf
to name everything. If there is no such file or the data in it doesn't match current reality, various bad things happen.(You can probably hand-edit the file if necessary.)
- otherwise, interface naming is controlled by the
HWADDR
setting in theifcfg-*
files in/etc/sysconfig/network-scripts
. If there is no Ethernet address specified, you get no renaming.
The ifcfg files are used by both udev
and the ifup
scripts
that actually bring interfaces up and so on. When udev detects a
new network device (including at boot, I believe), it runs
/lib/udev/rename_device
, which searches the ifcfg-*
files for a
HWADDR
that matches the new device and uses the DEVICE
setting from
that file to give a name to the new interface.
(A network device that is hotplugged after system boot also winds
up running /etc/sysconfig/network-scripts/net.hotplug
.)
During boot, the order of operation is udev
first, then kudzu
,
and finally the network
init script winds up ifup
'ing all of the
interfaces that are supposed to be running, potentially undoing any
damage kudzu
did (if kudzu
left the ifcfg configuration files
along, which is unlikely).
(You may gather that I have a pretty low opinion of kudzu
; in fact, I
have been turning it off on most of my systems for years. It was left
enabled on this RHEL system mostly because I hadn't taken the time to
audit what init scripts were getting run.)
My problem with Ethernet naming on Red Hat Enterprise 5
Here's my problem: I have a bunch of identical 1U servers (SunFire
X2100 M2s) with four onboard Ethernet ports, driven by two different
chipsets (two nVidia ones, two Broadcom ones). I want to configure our
RHEL installs so that no matter which physical unit I stuff the system
disks into, the Ethernet ports come up with consistent names that match
the ports on the back of the server; eth0
should always be the port
labeled 'port 0' and so on.
(Since they have hotswap drive bays, we want to be able to easily swap drives between units in case of hardware failure or the like. It also simplifies general administration a bunch if the Ethernet naming matches the hardware naming.)
In the good old days, this was simple; just set up /etc/modprobe.conf
to alias eth0
and eth1
to the tg3
driver and eth1
and
eth2
to the forcedeth
driver, and everything usually worked.
In the new world of udev
, not so much; much like with Ubuntu, everything really wants to name things based
on known Ethernet addresses, and there seems to be no way to control
what order modules are loaded in. The furthest I've gotten is a
configuration that does nothing with any 'new' Ethernet ports, so you
have to log in on the console and change all of the HWADDR
values in
the ifcfg files to have the correct Ethernet addresses.
(To do this, you have to turn off kudzu
with 'chkconfig --del
kudzu
'. If you leave it enabled, it will helpfully configure any 'new'
Ethernet ports to do DHCP on boot, and in the process it will replace
your working ifcfg files with new ones. Yes, it leaves the old files
around with .bak
extensions, but I am pretty sure that if you swap
hardware twice you will lose them entirely.)