Quelle est la norme de convention de dénomination pour les interfaces Ethernet et Wi-Fi sur une machine Linux?
Nous développons un outil qui ne devrait montrer que les interfaces Ethernet et Wi-Fi de la machine Linux et son état actuel.
Par exemple, voici la liste des interfaces réseau (physiques et virtuelles) sur ma machine Linux (Ubuntu):
docker0
, enp0s25
, lo
,wlp3s0
Lorsque j'exécute l'outil, voici le résultat que j'obtiens:
enp0s25
, wlp3s0
Nous avons écrit le code avec la logique que toutes les interfaces Ethernet commencent toujours par la lettre e
et que les interfaces Wi-Fi commencent toujours par la lettre w
.
La logique est-elle correcte? Sinon, comment pouvons-nous y remédier?
networking
wifi
network-interface
ethernet
Mohan Raj
la source
la source
iwconfig
filtre les interfaces WiFi des autres.lshw -class network
peut-être? Cherchez tout ce qui estcapabilities: ethernet physical
? Vous recherchez peut-être également certaines des autres capacités?Réponses:
Les interfaces réseau peuvent être nommées n'importe quoi, donc peu importe ce que vous faites, vous rencontrerez des situations où (1) il y a une interface réseau "physique" avec un nom qui ne correspond pas à votre modèle, ou (2) il y a un interface réseau "physique" qui correspondra à votre modèle.
En plus de cela, si j'étais un utilisateur de votre outil, le moment où votre outil ne me permettrait pas de faire quelque chose que je veux, parce que j'ai une interface réseau qui est "virtuelle", mais pour des raisons pratiques, elle devrait être considérée " physique "dans ma configuration, je commencerais à maudire bruyamment et avec force votre application, et je ne l'utiliserai plus jamais.
Les interfaces réseau physiques et virtuelles partagent toutes une API commune sont une chose qui rend Linux vraiment flexible. N'essayez pas de garder votre utilisateur et ne lui enlevez pas cela. Vos utilisateurs vous remercieront.
la source
ip link set ... name ...
peut changer. Et oui, j'aurais pu énumérer les noms d'interface prévisibles moi-même. La réponse à la question d'origine est "veuillez ne pas le faire de cette façon". Parce que peu importe comment vous vous y prendrez, cela ne fonctionnera pas.red
,blue
etgreen
.Pour les noms d'interface prévisibles systemd , les préfixes peuvent être vus dans
udev-builtin-net_id.c
:Ainsi, pour le
ethX
style traditionnel de dénomination et la dénomination Systemd plus récente, une lettre initiale e devrait être une interface Ethernet pour tous les noms d'interface générés automatiquement. Toutes les interfaces wifi doivent commencer par un w dans les deux schémas, bien que toutes les interfaces commençant par w ne soient pas wifi.Si cet outil doit travailler dans un environnement arbitraire (plutôt que sur des environnements internes que vous contrôlez), notez que les utilisateurs peuvent renommer les interfaces sur les systèmes Linux avec des noms arbitraires, tels que [
wan0
,lan0
,lan1
,dmz0
] qui cassera toutes les hypothèses sur les lettres initiales .la source
biosdevname
d'interface, où une interface Ethernet peut être nommée commep3p7
. Cette méthode est un prédécesseur des nouveaux noms prévisibles de systemd et bien qu'elle soit désormais déconseillée sur les distributions courantes, de nombreux systèmes la reprendront alors qu'elle était la valeur par défaut il y a quelques années.rename%u
format n'a pas ' t existait dans le code source depuis 2012. Je voudrais soupirer que votre logiciel est obsolète depuis six ans.La convention de nommage est que les interfaces LAN sont nommées
eth0
,eth1
... et que les interfaces WLAN sont nomméswlan0
,wlan1
...Ce que vous voyez sont les soi-disant «noms prévisibles» que systemd a introduits. En pratique, ils sont tout sauf prévisibles, et ils peuvent même changer lorsque le matériel est changé, ce qui est exactement le problème qu'ils sont censés éviter.
Pour une supposition, la lettre de départ peut être assez bonne. Certaines interfaces, en particulier le WLAN, ont des indices dans
/sys/class/net/*/uevent
:Malheureusement, il n'y en a pas
DEVTYPE
pour les interfaces LAN.la source
Une mise en garde avec ma réponse (s'applique à la plupart des autres aussi): je ne connais pas le but de votre candidature. S'il s'agit d'une application jetable pour résoudre un problème particulier ou pour mieux comprendre la mise en réseau, pour ne plus jamais être utilisée, alors s'appuyer sur la première lettre de l'interface peut être une excellente option rapide et sale. Si vous envisagez d'écrire le prochain concurrent sur Wireshark ou tcpdump, vous devez être sûr de le faire pour toutes sortes de cas de bord.
Et si l'application que vous écrivez se situe quelque part entre ces extrêmes, vous seul (et vos clients) pouvez savoir avec quelle prudence vous devez mettre en œuvre votre logique.
D'autres ont déjà souligné que les noms ne sont jamais fiables, pour un certain nombre de raisons. Le problème ultime est très courant dans le logiciel: les hypothèses de codage en dur au lieu de s'appuyer sur des faits connus / documentés.
Le deuxième problème qui n'a pas été mentionné est également basé sur une hypothèse concernant vos besoins: que la liste des interfaces que vous souhaitez répertorier est toujours exactement «interfaces Ethernet matérielles» et «interfaces wifi».
Le troisième problème est une autre hypothèse: toutes les interfaces tomberont dans les catégories auxquelles vous pouvez penser en ce moment. Qu'en est-il d'Infiniband, comme mentionné par @ user4556274? Que diriez-vous des interfaces de tunnel pour un VPN? Et les interfaces pontées? Que diriez-vous des interfaces pontées qui combinent des interfaces physiques et logiques?
Mais il peut y avoir des options pour accomplir ce que vous recherchez. Tout d'abord, définissez exactement ce qui caractérise une interface que vous souhaitez lister, par rapport à une interface que vous n'avez pas.
Dans la plupart des cas, une caractéristique sur laquelle vous pouvez compter est la table de routage (cependant, cela ne fonctionnera que tant que l'interface est en place, donc ce n'est peut-être pas ce que vous recherchez réellement).
Toute interface qui a une route par défaut (c'est-à-dire une route vers 0.0.0.0) est probablement celle que vous recherchez.
Notez que même cela est toujours basé sur une hypothèse, juste une plus fiable: il est concevable qu'un système soit configuré pour acheminer tout le trafic sortant via une machine virtuelle ou un conteneur Docker (par exemple, s'il existe un conteneur exécutant un pare-feu ). Et l'inverse est également vrai: un administrateur système peut potentiellement bloquer le trafic extérieur en supprimant l'itinéraire par défaut.
Une autre option consiste à utiliser le matériel réel et à voir quel pilote il utilise. Vous pouvez ensuite exclure certains pilotes connus
la source
Excluez-vous explicitement les interfaces liées ou associées? Notre valeur par défaut ici est d'utiliser
bond0
outeam0
pour l'interface principale de nos serveurs.Je pense que vous devez repenser votre logique. Essayez peut-être d'itérer toutes les interfaces réseau définies sur un système donné, divisez-les entre Ethernet, wifi, infiband, série, etc., puis faites votre magie.
la source
Ne codez pas en dur ou ne correspondez pas aux noms de matériel. Cela s'applique à tous les appareils. Comptez sur les outils fournis par udev pour déterminer la liste des appareils et prendre les mesures appropriées. Voir 16.7 Attribution d'un nom de périphérique persistant , puis lisez l' intégralité de ce document , en particulier 16.2 et 16.3. Notez que udev est indépendant de la distribution et également du système init, car udev est désormais la méthode préférée pour la gestion des périphériques sous linux.
Notez que @ user4556274, y a fait allusion dans sa réponse
udev-builtin-net-id.c
, ce qui signifie en bref que la correspondance de modèle que vous essayez d'accomplir fait partie intégrante deudev
.Citation de PredictableNetworkInterfaceNames :
la source
Comme d'autres l'ont dit, vous ne pouvez pas entièrement dépendre du nom.
Dans mon cas, il semble que pour le sans fil
/sys/class/net/<ifacename>/
aura un répertoire appelé "sans fil" s'il s'agit d'une interface sans fil:la source