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.
quelle
Antworten:
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.
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.conf
Suffix. Das/etc/modprobe.d/blacklist.conf
automatische Laden von Modulen durch den Kernel wird auch durch das Benennen von Modulen in nicht beeinflusst, sodass Sie eine eigene Datei erstellen müssen.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 .
Ä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):
Einige nützliche Links, die ich bei der Suche nach der Lösung gefunden habe:
quelle
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
quelle
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.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 ,
netconf
dass 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 (dhLAN_IFACE=eth0
,WAN_IFACE=eth1
usw.)quelle
Sie können nicht ändern, welche Schnittstelle standardmäßig in Anwendungen wie verwendet wird
iftop
. Sie rufen die C-Bibliotheksfunktion aufif_nameindex
und verwenden standardmäßig das erste Element im zurückgegebenen Array. GNU libcif_nameindex
unter Linux ist eine dünne Hülle um denSIOCGIFCONF
ioctl . 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
-i
aniftop
und ähnliche Programme übergeben müssen möchten , können Sie einen kleinen Wrapperif_nameindex
erstellen, um die Elemente in der zurückgegebenen Liste mit neu anzuordnenLD_PRELOAD
. Ich würde das viel mehr Ärger nennen, als es wert ist.quelle
if_nameindex
Funktion 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 Kernelsnetdev=irq=22,name=eth0
nicht funktioniert. Ich dachte, es sollte möglich sein, die NIC-Reihenfolge beim Start des Kernels zu ändern.for_each_netdev
Makro) 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.Wenn sie unterschiedliche Treiber haben, können Sie sie zumindest zu einem früheren Zeitpunkt in eine der Modulkonfigurationsdateien einfügen:
Das ist einiges ziemlich altes Wissen, aber es kann helfen.
quelle
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:
quelle