Debian, Ubuntu : eth0 c'est fini
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 :
- Récupérer son adresse MAC via la commande ifconfig
- 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
- 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
- Mettre à jour grub avec cette modification, en lançant la commande :
sudo update-grub2
- 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).
Un article à retrouver sur P3ter.fr