Pokud je v počítači více než jedno rozhraní, které se hlásí jménem ethX, máme zaděláno na problémy. Pokud se jednotlivá rozhraní liší například čipsetem, není to ještě tak špatné, i když po upgradu na novou verzi kernelu se docela klidně může stát, že se ovladače zavedou v jiném pořadí. Ještě horší situace nastává, pokud je v systému několik identických síťových karet. Pak o jejich očíslování totiž rozhoduje i pořadí v PCI slotu a to se může změnit například resetem CMOS paměti.
Proto je vhodné, zachovat si trvalé jméno karty podle její MAC adresy. Objevil jsem hned tři způsoby, jak na to:
- Pomocí udev. Přestože síťová rozhraní nemají speciální soubor v adresáři /dev, udev s nimi dokáže také pracovat. Vcelku pěkný návod, jak na to, je například zde. Jen je potřeba zadávat MAC adresu malými písmeny, jinak jí to nenajde.
- Pomocí utilitky nameif. Tak to používám já, protože v
době, kdy jsem tenhle problém řešil, ještě udev nebyl a já migroval z
Fedory, kde to dělal initskript automaticky, na Gentoo, které
to samozřemě neumělo. Tak jsem pročetl initskript Fedory, zjistil, že na to
používá právě nameif a přepsal jednodušší initskript pro Gentoo:
#!/sbin/runscript # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # Changing names of network interfaces, according to /etc/mactab # Author: Ondrej Caletka NAMEIF=/sbin/nameif MACTAB=/etc/mactab #Temporary mactab, to allow eg. swapping between eth0 & eth1 MACTMP=/etc/mactab.tmp # Example: Swaping between eth0 (MAC 000000000000) and eth1 (MAC 001122334455) #/etc/mactab: # # Formerly eth0: # eth1 00:00:00:00:00:00 # # Formerly eth1: # eth0 00:11:22:33:44:55 #EOF #/etc/mactab.tmp: # # Formerly eth0: # tmp1 00:00:00:00:00:00 # # Formerly eth1: # tmp0 00:11:22:33:44:55 #EOF depend() { before net } start() { [ -a ${MACTAB} ] || return ebegin "Renaming network interfaces" [ -a ${MACTMP} ] && ${NAMEIF} -c ${MACTMP} ${NAMEIF} -c ${MACTAB} eend $? }
Jak je vidět, řešení je to poněkud těžkopádné, zejména v případě, kdy chceme názvy jen prohodit, protože není možné jedné kartě přiřadit název, který už má jiná karta. - Pomocí iproute2. To se spíš hodí pro dočasné změny,
protože moc dobře nejde měnit na základě MAC adresy, ale na základě
předchozího názvu. Syntaxe je taková:
ip link set eth0 name lan0
Všechny způsoby vyžadují, aby bylo rozraní, které se má přejmenovat, ve stavu down a aby nedošlo ke konfliktu s jiným síťovým zařízením (snad kromě udev, kde by mělo prohození názvů fungovat - ještě jsem to nezkoušel).