Come cambiare l'ordine delle schede di rete (eth1 <-> eth0) su Linux


20

Esiste un modo per scambiare le interfacce di rete ( eth1 <-> eth0 ) dopo l'installazione del sistema.

La mia nuovissima installazione di Debian 6.0 ha assegnato la scheda di rete PCI come " eth0 " e le schede madri integrate come " eth1 " di default. Il problema è che desidero utilizzare il dispositivo integrato come interfaccia di rete predefinita ( eth0 ).

Ho già modificato:

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

scambiare i nomi e tutto sembra essere a posto e la rete funziona ma i programmi stanno ancora cercando di utilizzare la scheda di rete PCI (che ora è " eth1 ") come interfaccia predefinita. Ad esempio iftop ora tenta di utilizzare " eth1 " come dispositivo predefinito in quanto utilizzava " eth0 " prima dello scambio.

Si tratta puramente di un problema software in quanto le applicazioni stanno tentando di utilizzare il primo dispositivo trovato come dispositivo predefinito nonostante la denominazione dell'interfaccia o esiste un modo per risolvere il problema configurando il sistema operativo?


modifica: ho scritto una piccola app per stampare iflist e il dispositivo PCI ( eth1 ) è apparso prima di " eth0 ". Qualche idea su come scambiare l'ordine del dispositivo.


modifica: ho trovato una discussione sullo stesso problema e ho provato tutto ciò che hanno suggerito e nessuna delle soluzioni funziona tranne lo scambio dei nomi "virtualmente".


Solo per notare, la modifica di /etc/udev/rules.d/70-persistent-net.rules e un riavvio hanno fatto il lavoro per me
Xosofox

Risposte:


18

Sto rispondendo alla mia domanda ora perché ho finalmente trovato una soluzione per questo problema.

Ho scoperto che è possibile riordinare i dispositivi scaricando i driver e caricandoli nell'ordine corretto.

Primo metodo (bruteforce):

Quindi il primo metodo che ho ideato è stato semplice per forzare il ricaricamento del driver con lo script init.d.

Il seguente script di init è personalizzato per Debian 6.0, ma lo stesso principio dovrebbe funzionare su quasi tutte le distribuzioni che usano script init.d corretti.

#!/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

Quindi lo script deve essere aggiunto alla directory runlevel corretta. Questo può essere fatto facilmente su Debian con il comando " update-rc.d ". Per esempio:update-rc.d reorder-nics start S


Secondo metodo (meglio penso):

Ho anche trovato un modo un po 'più elegante (almeno per i sistemi Debian e Ubuntu).

Innanzitutto assicurarsi che il kernel non carichi automaticamente i driver della scheda NIC. Questo può essere fatto creando un file nella lista nera in /etc/modprobe.d/. Ho creato un file chiamato " disable-nics.conf". Si noti che i file in /etc/modprobe.d/devono avere il .confsuffisso. Anche la denominazione dei moduli /etc/modprobe.d/blacklist.confnon influisce sul caricamento automatico dei moduli da parte del kernel, quindi è necessario creare il proprio file.

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

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

Quindi esegui ' depmod -ae ' come root

Ricrea il tuo initrd con ' update-initramfs -u '

E infine aggiungi i nomi dei driver nell'ordine corretto nel file / etc / modules .

# /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

Le modifiche dovrebbero entrare in vigore dopo il prossimo avvio.

Il riavvio non è necessario però; è facile cambiare i dispositivi con il seguente comando (come root, ovviamente):

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

Alcuni link utili che ho trovato durante la ricerca della soluzione:


2
+1 Ti meriti sicuramente più di un voto positivo.
bahamat,

Ho un problema simile: ho una scheda NIC integrata, quindi a volte eseguo un programma VPN che crea un'altra interfaccia. L'interfaccia VPN sembra avere sempre la precedenza, ma non so perché. Voglio che sia usato solo in circostanze molto rare (voglio che l'applicazione che lo usa debba specificare l'interfaccia VPN). Qualche idea? ^ _ ^ Probabilmente pubblicherò comunque una nuova domanda molto presto.
Espiazione limitata

2

È possibile utilizzare il netdev=parametro della riga di comando del kernel (è necessario passarlo al kernel in grub) per indicare al kernel di collegare un determinato irq a una determinata interfaccia, ad esempio:netdev=irq=2,name=eth0


1
Ho avviato la mia casella con le modifiche di configurazione di grub e sto ancora ottenendo eth1 come dispositivo predefinito in molte app. Ho controllato il dmesg per info reti e dell'informazione e si dice che il NIC integrato ha ancora ' eth1 ' come ifname: forcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40. Questo non è un problema troppo serio, ma mi fa davvero male perché la scheda integrata è da 1 GB e dovrebbe essere il dispositivo predefinito.
Athabaska Dick,

1
Ora ho provato a usare nameif per cambiare i nomi dell'interfaccia di rete ma sembra che faccia lo stesso di udev. Nessun cambiamento nell'ordine "reale" della scheda NIC. Ho anche provato a cambiare la posizione fisica delle schede di rete PCI ma non ha aiutato neanche. La scheda di rete integrata ha IRQ 22 e la scheda di rete PCI ha IRQ 17, quindi sembra che il kernel li stia ordinando da IRQ e l'utente non può cambiare questo fatto in alcun modo. Qualche nuova idea?
Athabaska Dick,

1

Probabilmente dovrai accedere ai file di configurazione di ciascun programma interessato e modificare "eth1" in "eth0". Tali impostazioni predefinite dei programmi vengono configurate quando vengono installate o eseguite per la prima volta con le schede di rete attualmente rilevate.

Uso Linux come router e ho riscontrato questo problema durante l'utilizzo degli script. Ora ho un bel frammento di script chiamato netconfquella fonte che in qualsiasi altro script ogni volta che ho bisogno di usare i nomi NIC, questo file mi dà una posizione centrale per specificare loro (cioè LAN_IFACE=eth0, WAN_IFACE=eth1etc.)


2
Sembra che molti programmi facciano affidamento sulla funzione if_nameindex () dall'intestazione <net / if.h> . Usano solo il primo dispositivo che trovano e ignorano totalmente i nomi dell'interfaccia. Vedo perché è fatto così, è molto più facile usare il primo dispositivo trovato che ordinare i nomi.
Athabaska Dick,

1

Non è possibile modificare l'interfaccia utilizzata per impostazione predefinita in applicazioni come iftop. Chiamano la funzione di libreria C if_nameindexe usano il primo elemento nell'array restituito per impostazione predefinita. GNU libc if_nameindexsu Linux è un wrapper sottile attorno allo SIOCGIFCONFioctl . Ciò restituisce le interfacce in un ordine fisso, in base all'ordine in cui i driver di rete sono stati inizializzati e all'ordine in cui ciascun driver ha rilevato ciascun dispositivo.

Se davvero non vuoi passare -ia iftopprogrammi simili, puoi creare un piccolo involucro attorno al if_nameindexquale riordinare gli elementi nell'elenco restituito, con LD_PRELOAD. Definirei questo più problemi di quanti ne valga la pena.


Sono riuscito a individuare anche il "problema" in if_nameindexfunzione. Forse lo lascio per ora. Fortunatamente alcune app controllano davvero il nome dell'interfaccia. D'altra parte alcune app non hanno nemmeno le opzioni di configurazione predefinite, quindi devo solo usare l'opzione -i. Mi chiedevo solo perché l'opzione di caricamento del kernel netdev=irq=22,name=eth0non funziona? Ho pensato che sarebbe stato possibile cambiare l'ordine della NIC all'avvio del kernel.
Athabaska Dick,

Da una rapida occhiata al sorgente del kernel (la for_each_netdevmacro), le interfacce sono elencate nell'ordine in cui i driver sono caricati (approssimativamente). Le tue interfacce probabilmente usano driver diversi, quindi dovresti disporre che i driver vengano caricati nell'ordine desiderato. Mi aspetto che questo sia difficile, soprattutto se vuoi che il tuo tweak funzioni attraverso un aggiornamento del kernel.
Gilles 'SO- smetti di essere malvagio' il

1

Se hanno driver diversi, almeno nel giorno in cui potresti inserire uno dei file di configurazione del modulo:

alias eth0 driver1
alias eth1 driver2

Questa è una conoscenza piuttosto vecchia, ma può aiutare.


-1

Dai un'occhiata al pacchetto "ifrename". Ciò consente di rinominare i nomi delle interfacce in base a una varietà di informazioni come l'indirizzo MAC di interfaccia, driver, interrupt ..., configurato in un file / etc / iftab.

Alcuni esempi dalla pagina man:

   # 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

Benvenuto in U&L, puoi fornirci una risposta completa, non semplici suggerimenti? Non dovresti postare con qualcosa come "c'è una pagina man ...".
Archemar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.