Debian, Ubuntu : eth0 c'est fini

Rédigé par P3ter - - 8 commentaires

Mon serveur inaccessible par le web, après une migration d'Ubuntu 14.04 vers Ubuntu 16.04, j'ai redécouvert les joies du KVM d'OVH. Et oui, depuis Ubuntu 15.10 les interfaces réseau ne sont plus nommées de la même manière. eth0 est mort, vive enp3s0 !


Mise à jour 28/08/2016 : Après vérification, la nomenclature ifname est déjà utilisée sur Fedora depuis la version 15. Bien sûr, Archlinux est également concerné.

Mise à jour 04/02/2018 : Correction du champ à éditer dans le fichier /etc/default/grub. Merci à Lukeze pour son commentaire.


Je l'ignorais au moment de mettre à jour ma version d'Ubuntu. Ca m'a valu une belle frayeur, au redémarrage du serveur, lorsque celui-ci n'était plus accessible via Internet. Me voila obligé de passer par le KVM d'OVH pour ouvrir une session directement sur la machine. Effectivement, plus aucune connexion réseau n'est active.


Un nouveau nom pour les interfaces réseaux

Je vérifie que le fichier /etc/network/interfaces est bien paramétré. Il l'est. Je lance un ifconfig, rien, aucune interface active (hormis lo). J'essaie ifconfig -a, espérant retrouver mon interface eth0 inactive, et je tombe sur une interface enp3s0.

Après quelques recherche sur le net, je découvre que depuis Ubuntu 15.10, le package udev 220-6ubuntu2 intègre une implémentation du Stateless Persistent Network Interface Names. Puis, avec le passage d'InitV à Systemd, les interfaces réseau sont automatiquement renommées selon cette nouvelle nomenclature.

Une simple modification dans le fichier /etc/network/interfaces (remplacement de eth0 par enp3s0) suivi d'un redémarrage du service réseau (sudo systemctl restart networking.service), m’a permis de retrouver ma connexion au réseau.


Stateless Persistent Net... quoi ?

En cherchant sur le net, je suis tombé sur un message de Martin Pitt, un développeur Debian et Ubuntu, sur la mailing list ubuntu-devel. Martin explique que depuis 2013, udev intègre trois solutions permettant de nommer les interfaces réseau. Depuis, une dizaine d'année c'est la solution appelée mac qui est utilisée. C'est à elle que l'on doit le fameux eth0. Selon Martin cette solution comporte plusieurs inconvénients :

  • Le nom d'une interface est défini par le noyau, sans qu'on puisse le connaître à l'avance.
  • L'ordre dans lequel les interfaces sont nommées est instable.
  • Il faut des droits d'écritures sur le dossier /etc/udev/rules.d, pour rendre persistant le nom d'une interface (sur la base de l'adresse MAC), ce qui n'est pas souhaité pour Ubuntu Touch, la version mobile de l'OS.
  • Cette solution permettant de rendre persistant le nom d'une interface est incompatible avec le fonctionnement des machines virtualisées, puisque l'interface physique peut changer entre deux redémarrage de la VM. eth0 deviendrait eth1, puisque la règle ajoutée dans /etc/udev/rules.d/ serait fausse (adresse MAC différente).
  • Depuis 2013 les développeurs de udev ne fournissent plus de support pour la solution mac.

C'est la qu'intervient la solution appelée ifnames. Implémentée dans udev depuis 2013, celle-ci permet de donner un nom persistant à un équipement, en se basant sur les informations fournis par le BIOS et/ou le firmware, tel que le numéro d'index, le nom du slot PCI, etc. Cette solution permet également de s'affranchir d'écrire dans un fichier les règles d'associations entre l'équipement physique et son nom (solution mac), ce qui a un fort intérêt pour la version mobile d'Ubuntu.

Ainsi, avec cette solution les noms ressemblent à enp3s0 pour une carte Ethernet, et wlp4s1 pour une carte WiFi. Il s'agit ici d'exemples, ces noms peuvent varier en fonction des machines, mais commenceront toujours de la même façon : "e" pour Ethernet" et "w" pour WiFi.

Cette solution sera également activée par défaut dans Debian 9 ("Stretch"), dont la date de sortie n'est pas encore définie.


Revenir à eth0

Si vous avez des scripts, des applis, des fichiers de conf, etc, qui s'appuient sur le nom "eth0" pour identifier votre interface réseau, afin de vous éviter de les modifier, il est possible de désactiver ifnames et de revenir à l'ancienne nomenclature. Pour cela, il faut :

  1. Récupérer son adresse MAC via la commande ifconfig
     
  2. Créer un fichier de règles : /etc/udev/rules.d/10-network.rules et y ajouter la ligne ci-dessous :
    SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="eth0"
    Remplacer la valeur du paramètre ATTR par l'adresse MAC récupérée précédemment
     
  3. Désactiver ifnames en éditant le fichier /etc/default/grub et en ajoutant la valeur ci-dessous au paramètre GRUB_CMDLINE_LINUX
    net.ifnames=0
     
  4. Mettre à jour grub avec cette modification, en lançant la commande :
    sudo update-grub2
     
  5. Redémarrer

Il est bien sûr possible d'ajouter d'autres règles dans le fichier /etc/udev/rules.d/10-network.rules, par exemple, si vous avez plusieurs interfaces réseau, et bien entendu vous pouvez les nommer comme bon vous semble en modifiant le paramètre NAME=.

Photo par Clefty (sous licence CC BY-NC v2).

Fil RSS des commentaires de cet article

Écrire un commentaire

Quelle est le deuxième caractère du mot i0v73gz ?

#1  - Richard Dern a dit :

Merci pour cette info qui m'évitera les mêmes frayeurs: me voilà prévenu :)

Répondre

#2  - alcloud a dit :

Oh lala mieux je migre pas maintenant !!!

Répondre

#3  - stephane a dit :

alors ce changement radical dans le nom des interfaces réseaux provient essentiellement de systemd, qui a profité cette refonte, cependant , dans les notices & readme ILS DOIVENT FAIRE MENTION de ce sujet et par conséquent de noter toutes les informations utiles

il y a aussi les commandes pour la gestion de systemd
http://www.linuxtricks.fr/wiki/systemd-les-commandes-essentielles

Répondre

#4  - systemdshit a dit :

Cette sombre merde de systemd met de plus en plus la pagaille... Devuan c'est bien mais trop jeune, mal supporté, mal traduit etc... Un retour à l'init SysV est pourtant crucial. Pour le reste il serait plus intéressant d'utiliser le nommage des interfaces réseaux comme sous BSD: le nom du driver + un chiffre

Répondre

#5  - Philippe a dit :

Ahh je comprends mieux, merci pour cet article... mes observations : environnement virtualisé, quand on a bien souvent qu'une seule carte réseau, elle s'appelle toujours eth0 sous Debian Jessie, en effet, il faut faire sauter la règle automatique générée sous CentOS, par exemple.

Et ce nouveau nommage, j'en ai fait l'expérience, n'est pas si cohérent que ça d'une machine à l'autre. Sur 15 PCs de même marque/modèle la carte réseau, intégrée, avait deux noms différents possibles... pas pratique du tout en cas de clonage.

Bref, pour moi ce n'est pas une avancée, c'est au mieux une modification, avec à priori plus d'inconvénients que d'avantages.

Répondre

#6  - 7Kent7 a dit :

Merci 3Ter, tu me sauves la vie !!!
j'ai passé un nombre incroyable d'heure à essayer d'activer le Wak on lan sous linux mint (ordi en dual boot wol fonctionne sans problème sous Windows)Malgré toutes mes recherches je n'avais trouvé aucune explication... Google ne sera plus jamais mon ami !!!
je ne suis pas un crack en ligne de commande, mais avec ton article, j'ai tout compris.
encore merci et longue vie à linux

Répondre

#7  - lukeze a dit :

Hello,
D'abord super article et merci pour le partage. Par contre, il y a une petite erreur à corriger.
Le paramètre à modifier dans le fichier /etc/default/grub n'est pas GRUBLINE_LINUX_DEFAULT mais GRUB_CMDLINE_LINUX.
Surement une erreur de frappe :)

Répondre

#8  - P3ter a dit :

Hello,
Merci pour ton commentaire, j'ai mis à jour l'article.
Pour information : GRUB_CMDLINE_LINUX sera utilisé au chargement du noyau en mode normal et en mode recovery, tandis que GRUB_CMDLINE_LINUX_DEFAULT est utilisé uniquement en mode normal.

Répondre