AUTHOR: Richard A Downing FBCS DATE: 2003-09-29 LICENSE: GNU Free Documentation License Version 1.2 SYNOPSIS: Naming Network Interfaces. DESCRIPTION: This hint describes how to specify your own names for Network Interface Cards instead of eth0, eth1, etc... PREREQUISITES: In principle the hint applies to all versions of LFS, and probably also to all LINUX distributions. However, the bootscript recommendations are based on LFS-Bootscripts-1.11 (LFS-4.1). HINT: Introduction ============ When the Linux kernel boots, it assigns names (eth0 etc..) to network devices in the order that it finds them. This means that two different versions of the kernel, say 2.4 and 2.6, might find the network interfaces in a diffent order. When this happens you might have to swap all the cables to get your connections to work the way you want. The proper way to do this is to name the interfaces with the nameif command (part of the net-tools). TAKE CARE: All the commands given in this hint need root priviledges. MACTAB and NAMEIF ================= The nameif command can be driven from the command line, if you want to do that, then read it's man page. Another way is to set up a /etc/mactab file to relate the MAC addresses of the network cards to the names you want. Every NIC interface in the (known) universe has a unique MAC address (Media Access Control address), which is usually expressed as a 12 digit hexadecimal number, colon-dotted in pairs for readability. You will need to find the MAC addresses of each of your network cards. The easiest way to find these (if you didn't make a note of the MAC label when you installed the card) is to use ifconfig, each interface that is configured will report its MAC address. e.g: $ /sbin/ifconfig eth0 Link encap:Ethernet HWaddr 00:60:97:52:9A:94 inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:6043 errors:0 dropped:0 overruns:0 frame:0 TX packets:6039 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:1439604 (1.3 Mb) TX bytes:509857 (497.9 Kb) Interrupt:10 Base address:0xc800 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:7218 errors:0 dropped:0 overruns:0 frame:0 TX packets:7218 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1085452 (1.0 Mb) TX bytes:1085452 (1.0 Mb) Take note of the HWaddr, this the NIC's MAC address. Now you can decide what you would like the NIC to be called, and set up your /etc/mactab, here's mine as an example: # Begin /etc/mactab # This file relates MAC addresses to interface names. # We need this so that we can force the name we want # even if the kernel finds the interfaces in the # wrong order. # eth0 under 2.4, eth1 under 2.6 beannet 00:60:97:52:9A:94 # eth1 under 2.4, eth0 under 2.6 sparenet 00:A0:C9:43:8F:77 # End /etc/mactab If you run nameif (without parameters) now you will probably get an error message, since nameif must be run when the interfaces are down. $ nameif cannot change name of eth0 to beannet: Device or resource busy so, first take the interface down, then rename it: $ ifconfig eth0 down $ nameif $ ifconfig eth0 up $ ifconfig beannet Link encap:Ethernet HWaddr 00:60:97:52:9A:94 inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:6617 errors:0 dropped:0 overruns:0 frame:0 TX packets:6596 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:1748349 (1.6 Mb) TX bytes:598513 (584.4 Kb) Interrupt:10 Base address:0xc800 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:9097 errors:0 dropped:0 overruns:0 frame:0 TX packets:9097 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1340480 (1.2 Mb) TX bytes:1340480 (1.2 Mb) LFS Bootscript Changes ====================== As we've seen, nameif needs to be run early in the boot cycle, before the network interfaces are brought up. This means adding it to /etc/rc.d/init.d/network. Edit the start of the file as follows: #!/bin/bash # Begin $rc_base/init.d/network - Network Control Script # Based on ethnet script from LFS-3.1 and earlier. # Rewritten by Gerard Beekmans - gerard@linuxfromscratch.org source /etc/sysconfig/rc source $rc_functions source /etc/sysconfig/network case "$1" in start) if [ -e /etc/mactab ] then # if /etc/mactab exists then set up the named interfaces nameif fi for file in $(grep -il "ONBOOT=yes" $network_devices/ifconfig.*) do ...... This ensures that nameif is run with /etc/mactab, if that file exists. Now go to /etc/sysconfig and change the name(s) of the interface(s) wherever it(they) occur(s). I made the following changes: 1) edit /etc/sysconfig/network to specify the renamed GATEWAY_IF. 2) rename /etc/network-devices/ifconfig.eth0 to ifconfig.yourname and edit it so that DEVICE=yourname. If you use the Beyond Linux From Scratch instructions to use DHCP, then you will need to substitute your new NIC names in the scripts and filenames in the appropriate places. ACKNOWLEDGEMENTS: * Kevin Fleming for pointing the nameif command out to me. CHANGELOG: [2003-09-29] * Initial hint.