So ändern Sie die Reihenfolge der Netzwerkkarten (eth1 <-> eth0) unter Linux

20

Gibt es eine Möglichkeit, Netzwerkschnittstellen ( eth1 <-> eth0 ) nach der Systeminstallation auszutauschen ?

Mein brandneues Debian 6.0 installiert standardmäßig die zugewiesene PCI-Netzwerkkarte als " eth0 " und das integrierte Netzwerkgerät des Motherboards als " eth1 ". Das Problem ist, dass ich das integrierte Gerät als Standard- Netzwerkschnittstelle ( eth0 ) verwenden möchte .

Ich habe bereits bearbeitet:

/etc/udev/rules.d/70-persistent-net.rules

Die Namen zu tauschen und alles scheint in Ordnung zu sein und das Netzwerk funktioniert, aber die Programme versuchen immer noch, die PCI-Netzwerkkarte (die jetzt " eth1 " ist) als Standardschnittstelle zu verwenden. Zum Beispiel versucht iftop jetzt, " eth1 " als Standardgerät zu verwenden, da es vor dem Tausch " eth0 " verwendet hat.

Handelt es sich lediglich um ein Softwareproblem, da die Anwendungen versuchen, das zuerst gefundene Gerät trotz der Benennung der Schnittstelle als Standardgerät zu verwenden, oder gibt es eine Möglichkeit, dieses Problem durch Konfigurieren des Betriebssystems zu beheben?


edit: Ich habe eine kleine App geschrieben, um die iflist auszudrucken und das PCI-Gerät ( eth1 ) ist vor " eth0 " aufgetaucht . Irgendwelche Ideen, wie man die Gerätereihenfolge vertauscht.


edit: Ich habe einen Thread zu dem gleichen Problem gefunden und alles ausprobiert, was sie vorgeschlagen haben, und keine der Lösungen funktioniert, außer dass die Namen "virtuell" ausgetauscht wurden.

Athabaska Dick
quelle
Nur zur Erinnerung, das Editieren von /etc/udev/rules.d/70-persistent-net.rules und ein Neustart erledigten die Arbeit für mich
Xosofox

Antworten:

18

Ich beantworte jetzt meine eigene Frage, weil ich endlich eine Lösung für dieses Problem gefunden habe.

Ich fand heraus, dass es möglich ist, die Geräte neu zu ordnen, indem die Treiber entladen und dann in der richtigen Reihenfolge geladen werden.

Erste Methode (Bruteforce):

Daher war die erste Methode, die ich mir ausgedacht habe, einfach, das Neuladen des Treibers mit dem Skript init.d zu erzwingen.

Das folgende Init-Skript ist auf Debian 6.0 zugeschnitten, aber das gleiche Prinzip sollte auf fast jeder Distribution mit geeigneten Init-Skripten funktionieren.

#!/bin/sh -e

### BEGIN INIT INFO
# Provides:          reorder-nics
# Required-Start:
# Required-Stop:
# Default-Start:     S
# Default-Stop:
# Short-Description: Reloads the nics in correct order
### END INIT INFO

#
# This script should reload the nic drivers in corrected order.
# Basically it just unloads and then loads the drivers in different order.
#

echo "Reloading NICs!"

# unload the drivers
modprobe -r driver_0        # eth0 nic interface
modprobe -r driver_1        # eth1 nic interface

# load the drivers in corrected order
modprobe driver_1
modprobe driver_0

#EOF

Dann muss das Skript zum richtigen Runlevel-Verzeichnis hinzugefügt werden. Dies kann einfach unter Debian mit dem Befehl " update-rc.d " durchgeführt werden. Beispielsweise:update-rc.d reorder-nics start S


Zweite Methode (Besser denke ich):

Ich habe auch einen etwas eleganteren Weg gefunden (zumindest für Debian & Ubuntu-Systeme).

Stellen Sie zunächst sicher, dass der Kernel die NIC-Treiber nicht automatisch lädt. Dies kann durch Erstellen einer Blacklist-Datei in erfolgen /etc/modprobe.d/. Ich habe eine Datei mit dem Namen " disable-nics.conf" erstellt. Beachten Sie, dass Dateien in /etc/modprobe.d/müssen .confSuffix. Das /etc/modprobe.d/blacklist.confautomatische Laden von Modulen durch den Kernel wird auch durch das Benennen von Modulen in nicht beeinflusst, sodass Sie eine eigene Datei erstellen müssen.

# Disable automatic loading of kernel driver modules
# Disable NIC drivers

blacklist driver_0     # eth0 by default
blacklist driver_1     # eth1 by default

Führen Sie dann ' depmod -ae ' als root aus

Erstellen Sie Ihre initrd mit ' update-initramfs -u ' neu.

Und schließlich fügen Sie die Treibernamen in der korrekten Reihenfolge in die Datei / etc / modules ein .

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

# drivers in wanted order
driver_1    # this one should be loaded as eth0
driver_0    # this one should be loaded as eth1

Änderungen sollten nach dem nächsten Start wirksam werden.

Ein Neustart ist jedoch nicht erforderlich. Es ist einfach, die Geräte mit folgendem Befehl zu wechseln (natürlich als root):

modprobe -r driver_0; modprobe -r driver_1; modprobe driver_1; modprobe driver_0

Einige nützliche Links, die ich bei der Suche nach der Lösung gefunden habe:

Athabaska Dick
quelle
2
+1 Dafür haben Sie definitiv mehr als nur eine Stimme verdient.
Bahamat
Ich habe ein ähnliches Problem: Ich habe eine integrierte Netzwerkkarte, dann führe ich manchmal ein VPN-Programm aus, das eine andere Schnittstelle erstellt. Die VPN-Schnittstelle scheint immer Vorrang zu haben, aber ich weiß nicht warum. Ich möchte, dass es nur in sehr seltenen Fällen verwendet wird (ich möchte, dass die Anwendung, die es verwendet, die VPN-Schnittstelle spezifiziert). Irgendwelche Ideen? ^ _ ^ Ich werde wahrscheinlich sowieso bald eine neue Frage stellen.
Eingeschränktes Sühnopfer
2

Sie können den netdev=Kernel-Befehlszeilenparameter verwenden (Sie müssen ihn an den Kernel in grub übergeben), um den Kernel anzuweisen, einen bestimmten IRQ mit einer bestimmten Schnittstelle zu verknüpfen, z.netdev=irq=2,name=eth0

Frederik Deweerdt
quelle
1
Ich habe meine Box mit den Änderungen an der Grub-Konfiguration gebootet und in vielen Apps wird immer noch eth1 als Standardgerät verwendet. Ich überprüfte die dmesg für Netzwerk - Informationen und , und es sagt , dass die integrierten NIC hat noch ‚ eth1 ‘ als ifname: forcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40. Dies ist kein allzu ernstes Problem, aber es regt meine Zahnräder wirklich auf, da die integrierte 1-GB-Karte das Standardgerät sein sollte.
Athabaska Dick
1
Ich habe jetzt versucht, nameif zu verwenden, um die Namen der Netzwerkschnittstelle zu ändern, aber es sieht so aus, als würde es dasselbe tun wie udev. Keine Änderung der "echten" NIC-Reihenfolge. Ich habe auch versucht, den physischen Standort der PCI-Netzwerkkarte zu ändern, aber es hat auch nicht geholfen. Die integrierte Netzwerkkarte hat IRQ 22 und die PCI-Netzwerkkarte hat IRQ 17, also sieht es so aus, als würde der Kernel sie nach IRQ ordnen, und der Benutzer kann diese Tatsache in keiner Weise ändern. Irgendwelche neuen Ideen?
Athabaska Dick
1

Sie müssen wahrscheinlich in die Konfigurationsdateien aller betroffenen Programme gehen und "eth1" in "eth0" ändern. Solche Programmstandards werden eingerichtet, wenn sie mit den aktuell erkannten Netzwerkkarten installiert oder zum ersten Mal ausgeführt werden.

Ich verwende Linux als Router und hatte dieses Problem bei der Verwendung von Skripten. Ich jetzt ein schönes Skript Fragment genannt haben , netconfdass ich Quelle für alle anderen ein Skript , wenn i NIC - Namen verwenden müssen, diese Datei gibt mir eine zentrale Lage zu geben ihnen (dh LAN_IFACE=eth0, WAN_IFACE=eth1usw.)

LawrenceC
quelle
2
Es sieht so aus, als würden sich viele Programme nur auf die Funktion if_nameindex () aus dem <net / if.h> -Header verlassen. Sie verwenden nur das erste gefundene Gerät und ignorieren die Schnittstellennamen vollständig. Ich kann verstehen, warum dies so ist. Es ist viel einfacher, das zuerst gefundene Gerät zu verwenden, als die Namen zu sortieren.
Athabaska Dick
1

Sie können nicht ändern, welche Schnittstelle standardmäßig in Anwendungen wie verwendet wird iftop. Sie rufen die C-Bibliotheksfunktion auf if_nameindexund verwenden standardmäßig das erste Element im zurückgegebenen Array. GNU libc if_nameindexunter Linux ist eine dünne Hülle um den SIOCGIFCONFioctl . Das gibt Schnittstellen in einer festen Reihenfolge zurück, basierend auf der Reihenfolge, in der die Netzwerktreiber initialisiert wurden, und der Reihenfolge, in der jeder Treiber jedes Gerät erkannt hat.

Wenn Sie wirklich nicht -ian iftopund ähnliche Programme übergeben müssen möchten , können Sie einen kleinen Wrapper if_nameindexerstellen, um die Elemente in der zurückgegebenen Liste mit neu anzuordnen LD_PRELOAD. Ich würde das viel mehr Ärger nennen, als es wert ist.

Gilles 'SO - hör auf böse zu sein'
quelle
Ich habe es geschafft, das "Problem" auch in if_nameindexFunktion zu bringen. Vielleicht lasse ich es jetzt einfach. Zum Glück überprüfen einige Apps wirklich den Namen der Benutzeroberfläche. Andererseits haben einige Apps nicht einmal Standardkonfigurationsoptionen, so dass ich nur die Option -i verwenden muss. Ich habe mich nur gefragt, warum die Option zum Laden des Kernels netdev=irq=22,name=eth0nicht funktioniert. Ich dachte, es sollte möglich sein, die NIC-Reihenfolge beim Start des Kernels zu ändern.
Athabaska Dick
Bei einem kurzen Blick auf die Kernelquelle (das for_each_netdevMakro) werden die Schnittstellen in der Reihenfolge aufgelistet, in der die Treiber geladen werden (ungefähr). Ihre Schnittstellen verwenden wahrscheinlich unterschiedliche Treiber, sodass Sie dafür sorgen müssen, dass die Treiber in der von Ihnen gewünschten Reihenfolge geladen werden. Ich würde erwarten, dass dies schwierig wird, besonders wenn Sie möchten, dass Ihre Optimierung für ein Kernel-Upgrade funktioniert.
Gilles 'SO- hör auf böse zu sein'
1

Wenn sie unterschiedliche Treiber haben, können Sie sie zumindest zu einem früheren Zeitpunkt in eine der Modulkonfigurationsdateien einfügen:

alias eth0 driver1
alias eth1 driver2

Das ist einiges ziemlich altes Wissen, aber es kann helfen.

Aaron D. Marasco
quelle
-1

Schauen Sie sich das Paket 'ifrename' an. Auf diese Weise können Sie Schnittstellennamen basierend auf einer Vielzahl von Informationen, wie z. B. der MAC-Adresse der Schnittstelle, des Treibers, des Interrupts ..., die in einer / etc / iftab-Datei konfiguriert sind, umbenennen.

Einige Beispiele aus der Manpage:

   # This is a comment
   eth2      mac 08:00:09:DE:82:0E
   eth3      driver wavelan interrupt 15 baseaddress 0x390
   eth4      driver pcnet32 businfo 0000:02:05.0
   air*      mac 00:07:0E:* arp 1
   myvpn     SYSFS{address} 00:10:83:* SYSFS{type} 1
   bcm*      SYSFS{device} 0000:03:00.0 SYSFS{device/driver} bcm43xx
   bcm*      SYSFS{..} 0000:03:00.0 SYSFS{../driver} bcm43xx
Ben White
quelle
Willkommen bei U & L, können Sie uns eine vollständige Antwort geben, keine bloßen Hinweise? Sie sollten nicht mit etwas wie "Es gibt eine Manpage ..." posten.
Archemar