Zmiana nazwy interfejsów sieciowych

Slackware FAQ - czyli baza pytań i odpowiedzi.

Moderatorzy: Moderatorzy, Administratorzy

ODPOWIEDZ
lec
Użytkownik
Posty: 38
Rejestracja: 2004-12-17, 19:25
Lokalizacja: Wrocław

Zmiana nazwy interfejsów sieciowych

Post autor: lec » 2005-03-15, 23:59

Problem:
Kupiłeś sobie drugą sieciówkę, podpiąłeś do komputera, odpalasz... i sieć nie działa. Dzieje się tak dlatego, że system nadaje nazwe interfejsom po kolejności ładowania modułów do nich.


Co zamierzamy z tym zrobić?
Po pierwsze zakładam ze potrafisz poprawnie skonfigurować interfejsy sieciowe. Jeśli nie to najpierw poczytaj o konfiguracji. Po drugie postaram się przedstawić kilka wersji rozwiązania tego problemu. Każdy powinien znaleźć cos dla siebie :)


Zaczynamy!
Najprostszym sposobem rozwiązania problemu jest po prostu zamiana kabli od netu/lanu ;). Oto ciekawsze sposoby:

1. Alias
Nasz problem rozwiążemy robiąc aliasy w pliku /etc/modules.conf(dla jądra 2.4.*) lub /etc/modprobe.conf(dla jądra 2.6.*). Potrzebujemy jednak znać moduły naszych kart sieciowych. Robimy więc tak:

Kod: Zaznacz cały

root@adzia:/# lsmod
Module                  Size  Used by    Not tainted
snd-pcm-oss            37736   0  (unused)
snd-mixer-oss          12504   0  [snd-pcm-oss]
appletalk              21124  11  (autoclean)
printer                 7744   0
usb-storage            66176   0  (unused)
keybdev                 2052   0  (unused)
mousedev                4212   1
hid                    21220   0  (unused)
usbmouse                2040   0  (unused)
input                   3200   0  [keybdev mousedev hid usbmouse]
uhci                   24444   0  (unused)
ehci-hcd               17580   0  (unused)
usbcore                59308   1  [printer usb-storage hid usbmouse
uhci ehci-hcd]
snd-intel8x0           18924   0
snd-mpu401-uart         3200   0  [snd-intel8x0]
b44                    13708   1
snd-ens1371            11364   1
gameport                1420   0  [snd-intel8x0 snd-ens1371]
snd-pcm                56072   1  [snd-pcm-oss snd-intel8x0 snd-ens1371]
snd-timer              13604   0  [snd-pcm]
snd-page-alloc          6328   0  [snd-intel8x0 snd-pcm]
snd-rawmidi            12740   0  [snd-mpu401-uart snd-ens1371]
snd-seq-device          3888   0  [snd-rawmidi]
snd-ac97-codec         49500   0  [snd-intel8x0 snd-ens1371]
snd                    30852   0  [snd-pcm-oss snd-mixer-oss
snd-intel8x0 snd-mpu401-uart snd-ens1371 snd-pcm snd-timer snd-rawmidi
snd-seq-device snd-ac97-codec]
soundcore               3396  10  [snd]
pcmcia_core            39972   0
ntfs                   51424   2  (autoclean)
ip_conntrack_ftp        3888   1  (autoclean)
ip_nat_ftp              2736   0  (unused)
ipt_MASQUERADE          1304   1  (autoclean)
iptable_nat            15438   2  (autoclean) [ip_nat_ftp ipt_MASQUERADE]
ip_conntrack           19236   1  (autoclean) [ip_conntrack_ftp
ip_nat_ftp ipt_MASQUERADE iptable_nat]
ip_tables              12416   4  [ipt_MASQUERADE iptable_nat]
ide-scsi                9328   0
agpgart                43940   0  (unused)
8139too                14376   1
mii                     2272   0  [8139too]
crc32                   2880   0  [8139too]
poleceniem lsmod wyświetlamy wszystkie załadowane moduły. Pytanie teraz, czy wiesz które moduły są od kart? Jeśli nie masz zielonego pojęcia sprawdzaj każdy póki nie znajdziesz tych, które ciebie interesują:

Kod: Zaznacz cały

root@adzia:/# modinfo 8139too
filename:    /lib/modules/2.4.26/kernel/drivers/net/8139too.o.gz
description: "RealTek RTL-8139 Fast Ethernet driver"
author:      "Jeff Garzik <jgarzik@pobox.com>"
license:     "GPL"
polecenie # modinfo nazwa_modulu pokaże ci pełny opis modułu. Jak widać moduł 8139too obsługuje kartę sieciowa typu Ethernet- czyli jedna z moich dwóch sieciówek.

Gdy znalazłeś już moduły twoich kart to pozostaje ci tylko edycja pliku /etc/modules.conf(dla jądra 2.4.*) lub /etc/modprobe.conf(dla jądra 2.6.*). Polega to na zrobieniu aliasów:

Kod: Zaznacz cały

# alias nazwa_interfesju nazwa_modułu_siecówki

alias eth0 8139too
alias eth1 ne2k-pci
Pozostaje tylko wpisać odpowiednie dane do pliku /etc/rc.d/rc.inet1.conf.


2. Lilo i append
Nasz problem rozwiążemy edytując plik /etc/lilo.conf i używając komendy append. Z poziomu lilo możesz wymusić, aby eth0 korzystał z sieciówki o określonym przerywaniu[IRQ] i adresie bazowym[I/O]. Zaczynamy od wydania polecenia # lspci -v powinniśmy otrzymać między innymi coś takiego:

Kod: Zaznacz cały

Ethernet controller: Realtek Semiconductor Co., Ltd.
RTL-8139/8139C/8139C+ (rev 16).
     IRQ 9.
     Master Capable.  Latency=32.  Min Gnt=32.Max Lat=64.
     I/O at 0xb400 [0xb4ff].
     Non-prefetchable 32 bit memory at 0xec800000 [0xec8000ff].
Znamy więc IRQ oraz I/O naszych sieciówek, zostaje nam edycja pliku /etc/lilo.conf i dopisujemy tam:

Kod: Zaznacz cały

append="ether=9,0xb400,eth0 ether=12,0xe800,eth1"
9 i 12 to IRQ (przerwanie)
0xb400 i 0xe800 to IO (obszar pamięci wejścia-wyjścia)

Całośc razem ze wpisem jądra powinna wyglądać tak:

Kod: Zaznacz cały

image = /boot/kernel-2.6.12.2
  root = /dev/hda2
  label = Slackware
  read-only
  append="ether=9,0xb400,eth0 ether=12,0xe800,eth1"

3. Polecenie nameif
Zdarza się czasami, że mamy wkompilowane dwa moduły od siecówek do jądra i chcemy zamienić miejscami, inaczej mówiąc zmienić im nazwy. Do tego własnie służy polecenie nameif. Postaram się to opisać dokładnie na przykładzie skryptu. nameif może korzystać z pliku /etc/mactab ale wtedy istnieje możliwośc zmiany (tylko) na nie istniejące nazwy np. z eth0 na iface0.

Dojść może także do takie sytuacji, kiedy posiadamy dwie zintegrowane karty sieciowe, czyli:

Kod: Zaznacz cały

eth0: forcedeth.c: subsystem: 01462:0250 bound to 0000:00:05.0
eth1: Identified chip type is 'RTL8169s/8110s'.
eth1: RTL8169 at 0xffffc20000010000, 00:11:09:d7:93:18, IRQ 185
Sieciówka eth0 to 100 mbitówka a my chielibyśmy aby to RTL8169(1Gbit) była siecówką eth0. Zacznijmy od zebrania danych, zrobimy to poleceniem ifconfig:

Kod: Zaznacz cały

eth0      Link encap:Ethernet  HWaddr 00:11:09:D7:93:19  <- to jest siecówka na module forcedeth.c
          inet addr:10.1.1.11  Bcast:10.1.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:863 errors:0 dropped:0 overruns:0 frame:0
          TX packets:908 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:381545 (372.6 Kb)  TX bytes:100030 (97.6 Kb)
          Interrupt:185

eth1      Link encap:Ethernet  HWaddr 00:11:09:D7:93:18  <- to siecówka na RTL8169
          inet addr:10.1.1.14  Bcast:10.255.255.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:177 Base address:0xe000
Tutaj potrzebne będą nam tylko adresy MAC(HWaddr). Nastepnie proponuje utworzyć plik /etc/rc.d/rc.nameif. Nie ważne gdzie go umieścicie, jak się będzie nazywał, ważne jest to aby plik ten uruchamiany był przed plikiem /etc/rc.d/rc.inet1 czyli tym, który podnosi nasze interfejsy. Dopisujemy więc do pliku /etc/rc.d/rc.M, przed linią # Initialize the networking hardware.... Całośc powinna wyglądać tak:

Kod: Zaznacz cały

...
if [ -x /etc/rc.d/rc.nameif ]; then
    echo "Starting nameif script: /etc/rc.d/rc.nameif"
    . /etc/rc.d/rc.nameif
fi

# Initialize the networking hardware.  If your network driver is a module
# and you haven't loaded it manually, this will be deferred until after
# the hotplug system loads the module below.
if [ -x /etc/rc.d/rc.inet1 ]; then
  . /etc/rc.d/rc.inet1
fi
...
Skrypt rc.nameif wyglądać powinien w następujący sposób:

Kod: Zaznacz cały

#!/bin/sh

# Zmieniamy nazwę siecówki eth0 na eth2
/sbin/nameif -s eth2 00:11:09:D7:93:19

# Zmieniamy nazwę siecówki eth1 na eth0
/sbin/nameif -s eth0 00:11:09:D7:93:18

# Zmieniamy nadaną wcześniej nazwę eth2 na eth1
/sbin/nameif -s eth1 00:11:09:D7:93:19
Parametr -s przekierowywuje błędy do /var/log/syslog. Ważne jest to aby pierw zmienić nazwe tej sieciówki, na którą chcemy zmienić inną. Inaczej mówiąc nie może być dwóch interfejsów o takiej samej nazwie np. eth0, bo dostaniemy coś takiego:

Kod: Zaznacz cały

Jul  5 23:44:59 brutus nameif: cannot change name of eth1 to eth0: File exists
Jul  5 23:44:59 brutus nameif: cannot change name of eth0 to eth1: File exists
Nazwa eth2 nie jest tutaj konieczna, można oznaczyć sobie ją jako temp lub inną dowolną nazwą.


4. udev
Jeśli posiadamy jądro 2.6 i korzystamy z udev, w pliku /etc/udev/rules.d/75-network-devices.rules należy utworzyć lub zmodyfikować istniejące wpisy (po wcześniejszym odkomentowaniu):

Kod: Zaznacz cały

KERNEL=="eth?", SYSFS{address}=="xx:xx:xx:xx:xx:xx", NAME="eth0"
KERNEL=="eth?", SYSFS{address}=="yy:yy:yy:yy:yy:yy", NAME="eth1"
Gdzie xx:xx:xx:xx:xx:xx i yy:yy:yy:yy:yy:yy to identyfikatory MAC kart sieciowych.

Jeśli posiadamy więcej kart sieciowych, należy dodać kolejne linie bazując na powyższych wpisach.

Autorzy: lec, sayetan, Hannibal, Dario
Ostatnio zmieniony 2007-12-04, 00:28 przez lec, łącznie zmieniany 4 razy.

ODPOWIEDZ