Comment changer l'ordre des cartes réseau (eth1 <-> eth0) sur linux

20

Existe-t-il un moyen de permuter les interfaces réseau ( eth1 <-> eth0 ) après l'installation du système.

Ma toute nouvelle Debian 6.0 installe la carte réseau PCI assignée comme " eth0 " et le périphérique réseau intégré aux cartes mères comme " eth1 " par défaut. Le problème est que je veux utiliser le périphérique intégré comme interface réseau par défaut ( eth0 ).

J'ai déjà édité:

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

pour échanger les noms et tout semble être ok et le réseau fonctionne mais les programmes essaient toujours d'utiliser la carte réseau PCI (qui est maintenant " eth1 ") comme interface par défaut. Par exemple, iftop essaie maintenant d'utiliser " eth1 " comme périphérique par défaut car il utilisait " eth0 " avant l'échange.

S'agit-il uniquement d'un problème logiciel, car les applications essaient d'utiliser le premier périphérique trouvé comme périphérique par défaut malgré leur nom d'interface ou existe-t-il un moyen de résoudre ce problème en configurant le système d'exploitation?


edit: J'ai écrit une petite application pour imprimer iflist et le périphérique PCI ( eth1 ) est apparu avant " eth0 ". Toutes les idées pour échanger l'ordre des appareils.


edit: J'ai trouvé un fil sur le même problème et j'ai essayé tout ce qu'ils ont suggéré et aucune des solutions ne fonctionne sauf pour échanger les noms "virtuellement".

Athabaska Dick
la source
Juste pour noter, l'édition /etc/udev/rules.d/70-persistent-net.rules et un redémarrage ont fait le travail pour moi
Xosofox

Réponses:

18

Je réponds à ma propre question maintenant parce que j'ai finalement trouvé une solution de contournement pour ce problème.

J'ai découvert qu'il était possible de réorganiser les appareils en déchargeant les pilotes puis en les chargeant dans le bon ordre.

Première méthode (bruteforce):

Donc, la première méthode que j'ai trouvée a été simple de forcer le rechargement du pilote avec le script init.d.

Le script d'initialisation suivant est adapté à Debian 6.0, mais le même principe devrait fonctionner sur presque toutes les distributions en utilisant les scripts init.d appropriés.

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

Ensuite, le script doit être ajouté au répertoire de niveau d'exécution approprié. Cela peut être fait facilement sur Debian avec la commande " update-rc.d ". Par exemple:update-rc.d reorder-nics start S


Deuxième méthode (mieux je pense):

J'ai également trouvé un moyen un peu plus élégant (au moins pour les systèmes Debian et Ubuntu).

Assurez-vous d'abord que le noyau ne charge pas automatiquement les pilotes NIC. Cela peut être fait en créant un fichier de liste noire dans /etc/modprobe.d/. J'ai créé un fichier nommé " disable-nics.conf". Notez que les fichiers dans /etc/modprobe.d/doivent avoir le .confsuffixe. Le fait de nommer les modules dans /etc/modprobe.d/blacklist.confn'affecte pas le chargement automatique des modules par le noyau, vous devez donc créer votre propre fichier.

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

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

Exécutez ensuite ' depmod -ae ' en tant que root

Recréez votre initrd avec ' update-initramfs -u '

Et enfin, ajoutez les noms des pilotes dans l'ordre corrigé dans le fichier / 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

Les modifications devraient entrer en vigueur après le prochain démarrage.

Le redémarrage n'est cependant pas nécessaire; il est facile de changer les appareils avec la commande suivante (en tant que root, bien sûr):

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

Quelques liens utiles que j'ai trouvés en recherchant la solution:

Athabaska Dick
la source
2
+1 Vous méritez certainement plus qu'un seul vote positif pour cela.
bahamat
J'ai un problème similaire: j'ai une carte réseau intégrée, puis parfois je lance un programme VPN qui crée une autre interface. L'interface VPN semble toujours avoir la priorité, mais je ne sais pas pourquoi. Je veux seulement qu'il soit utilisé dans des circonstances très rares (je veux que l'application qui l'utilise doive spécifier l'interface VPN). Des idées? ^ _ ^ Je posterai probablement une nouvelle question très bientôt de toute façon.
Expiation limitée le
2

Vous pouvez utiliser le netdev=paramètre de ligne de commande du noyau (vous devez le transmettre au noyau dans grub) pour demander au noyau de lier un irq donné à une interface donnée, par exemple:netdev=irq=2,name=eth0

Frederik Deweerdt
la source
1
J'ai démarré ma boîte avec les modifications de la configuration de grub et je reçois toujours eth1 comme périphérique par défaut dans de nombreuses applications. J'ai vérifié le dmesg pour plus d' informations réseau et il dit que la carte réseau intégrée a encore « eth1 » comme ifname: forcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40. Ce n'est pas un problème trop grave mais ça me fait vraiment mal car la carte intégrée est de 1 Go et ce devrait être l'appareil par défaut.
Athabaska Dick
1
J'ai maintenant essayé d'utiliser nameif pour changer les noms d'interface réseau mais on dirait qu'il fait la même chose que udev. Aucun changement dans l'ordre "réel" des cartes réseau. J'ai également essayé de changer l'emplacement physique des cartes réseau PCI, mais cela n'a pas aidé non plus. Le NIC intégré a l'IRQ 22 et le PCI NIC a l'IRQ 17, il semble donc que le noyau les commande par IRQ et l'utilisateur ne peut en aucun cas changer ce fait. Des idées neuves?
Athabaska Dick
1

Vous devrez probablement aller dans chaque fichier de configuration des programmes affectés et changer «eth1» en «eth0». Ces programmes par défaut sont configurés lorsqu'ils sont installés ou exécutés pour la première fois avec les cartes réseau actuellement détectées.

J'utilise Linux comme routeur et j'ai eu ce problème lors de l'utilisation de scripts. J'ai maintenant un joli fragment de script appelé netconfque je source pour tout autre script chaque fois que j'ai besoin d'utiliser des noms de NIC, ce fichier me donne un emplacement central pour les spécifier (c'est LAN_IFACE=eth0-à- dire WAN_IFACE=eth1, etc.)

LawrenceC
la source
2
Il semble que de nombreux programmes s'appuient simplement sur la fonction if_nameindex () de l'en- tête <net / if.h> . Ils utilisent simplement le premier périphérique qu'ils trouvent et ignorent totalement les noms d'interface. Je peux voir pourquoi cela se fait comme ça, c'est beaucoup plus facile d'utiliser le premier appareil trouvé que de trier les noms.
Athabaska Dick
1

Vous ne pouvez pas changer quelle interface est utilisée par défaut dans des applications comme iftop. Ils appellent la fonction de bibliothèque C if_nameindexet utilisent le premier élément du tableau retourné par défaut. GNU libc's if_nameindexsur Linux est un mince wrapper autour de l' SIOCGIFCONFioctl . Cela renvoie les interfaces dans un ordre fixe, en fonction de l'ordre dans lequel les pilotes réseau ont été initialisés et de l'ordre dans lequel chaque pilote a détecté chaque périphérique.

Si vous ne voulez vraiment pas avoir à passer -ià iftopdes programmes similaires, vous pouvez créer un petit wrapper if_nameindexqui réorganise les éléments de la liste retournée, avec LD_PRELOAD. J'appellerais cela beaucoup plus de problèmes qu'il n'en vaut la peine.

Gilles 'SO- arrête d'être méchant'
la source
J'ai réussi à localiser le «problème» en if_nameindexfonction aussi. Peut-être que je le laisse pour l'instant. Heureusement, certaines applications vérifient vraiment le nom de l'interface. D'un autre côté, certaines applications n'ont même pas d'options de configuration par défaut, je n'ai donc qu'à utiliser l'option -i. Je me demandais simplement pourquoi l'option de chargement du noyau netdev=irq=22,name=eth0ne fonctionne pas? J'ai pensé qu'il devrait être possible de changer l'ordre des cartes réseau au démarrage du noyau.
Athabaska Dick
D'un rapide coup d'œil à la source du noyau (la for_each_netdevmacro), les interfaces sont énumérées dans l'ordre dans lequel les pilotes sont chargés (grosso modo). Vos interfaces utilisent probablement des pilotes différents, vous devrez donc organiser le chargement des pilotes dans l'ordre que vous souhaitez. Je m'attends à ce que ce soit difficile, surtout si vous voulez que votre réglage fonctionne sur une mise à niveau du noyau.
Gilles 'SO- arrête d'être méchant'
1

S'ils ont des pilotes différents, au moins dans la journée, vous pourriez mettre dans l'un des fichiers de configuration du module:

alias eth0 driver1
alias eth1 driver2

C'est une connaissance assez ancienne mais cela peut aider.

Aaron D. Marasco
la source
-1

Jetez un œil au package 'ifrename'. Cela vous permet de renommer les noms d'interface en fonction d'une variété d'informations telles que l'adresse MAC de l'interface, le pilote, l'interruption ..., configurées dans un fichier / etc / iftab.

Quelques exemples de la page de manuel:

   # 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
la source
Bienvenue chez U&L, pouvez-vous nous fournir une réponse complète, pas de simples conseils? Vous ne devriez pas poster avec quelque chose comme "il y a une page de manuel ...".
Archemar