How Linux names network interfaces
The usual explanation of how network interfaces get their names is
that they're named based on what's in
/etc/modules.conf if you're still running a 2.4 series kernel).
You'll have lines like:
alias eth0 sk98lin alias eth1 3c59x alias eth2 e100
And indeed this usually works, and when your system boots nicely the
3Com 'Marvell' gigabit card is
eth0, the 3Com 'Cyclone' 100mbit card
eth1, and the Intel 100mbit card is
eth2. Then one day you boot
your system single-user without network interfaces enabled and decide
to bring up just
eth1, so you do '
ifup eth1' (or just '
eth1'). And the world explodes in your face, because the nice simple
explanation is a white lie.
How the Linux kernel really names network interfaces is that network
interfaces are named in the order they're found: the first network
interface found is
eth0, the second is
eth1, and so on. The names
in the 'alias' lines in
/etc/modprobe.conf don't get passed to the
kernel; they just help make the normal configuration more generic.
So when you do '
modprobe eth1' on a bare system
'load eth1' to 'load the 3c59x driver', the driver finds a card with a
single network interface, and as the first found it becomes
eth0. Kaboom. (Similar things can happen if you remove a network
If you want stable names, the kernel does support renaming network
interfaces; the usual approach is to name interfaces based on MAC
addresses. On modern kernels you can use
udev rules (see
nameif, and your distribution may already support it
with the right magic settings.
(On Red Hat and Fedora Core, I believe that you set
HWADDR in the
ifcfg-* file in
/etc/sysconfig/network-scripts. I'm not sure
what Debian uses.)
The kernel uses registration order based naming for other things too;
the most famous (or infamous) case is SCSI drives, where the first one
sda, the second one
sdb, etc. (The kernel treats SATA
drives as SCSI devices, so more and more people may have to care about