Standard di convenzione di denominazione per interfacce Ethernet e Wi-Fi su macchine Linux


13

Qual è lo standard della convenzione di denominazione per le interfacce Ethernet e Wi-Fi su una macchina Linux?

Stiamo sviluppando uno strumento che dovrebbe mostrare solo le interfacce Ethernet e Wi-Fi della macchina Linux e il suo stato attuale.

Ad esempio, di seguito è riportato l'elenco delle interfacce di rete (sia fisiche che virtuali) sul mio computer Linux (Ubuntu):

docker0, enp0s25, lo,wlp3s0

Quando eseguo lo strumento, di seguito è riportato il risultato che ottengo:

enp0s25, wlp3s0

Abbiamo scritto il codice con la logica che tutte le interfacce Ethernet iniziano sempre con la lettera ee le interfacce Wi-Fi iniziano sempre con la lettera w.

La logica è giusta? In caso contrario, come possiamo affrontarlo?



Vorrei vedere come iwconfigfiltra le interfacce WiFi da altre.
Patrick Mevzek,

1
C'è un motivo per cui non dovresti guardare qualcosa come lshw? Ispezionare specificamente il contenuto di lshw -class networkforse? Cerchi tutto ciò che è capabilities: ethernet physical? Forse cerchi anche alcune delle altre funzionalità?
Zoredache,

Per affrontare la sfida del frame sollevata da @dirkt, una domanda migliore sarebbe semplicemente: "come posso ottenere il tipo di interfaccia di rete su Linux (o macOS, o altro ...)?"
Roger Lipscombe,

Risposte:


41

Le interfacce di rete possono essere nominate in qualsiasi modo, quindi, indipendentemente da ciò che fai, ti imbatterai in situazioni in cui (1) esiste un'interfaccia di rete "fisica" con un nome che non corrisponde al tuo modello o (2) c'è un interfaccia di rete "fisica" che corrisponderà al tuo modello.

Inoltre, se fossi un utente del tuo strumento, nel momento in cui il tuo strumento non mi permetterebbe di fare qualcosa che desidero, perché ho un'interfaccia di rete "virtuale", anche se per scopi pratici dovrebbe essere considerata " fisico "nella mia configurazione, inizierei a maledire ad alta voce e con forza la tua app e non la userò mai più.

Le interfacce di rete fisiche e virtuali condividono tutte un'API comune sono una cosa che rende Linux davvero flessibile. Per favore, non provare a fare da babysitter al tuo utente e portalo via da lui. I tuoi utenti ti ringrazieranno.


11
Non hai effettivamente risposto alla domanda; hai trascorso 3 paragrafi sfidando il contesto di fondo della domanda. Sebbene sia consapevole del fatto che le risposte alle sfide del frame sono una cosa, questo non sembra uno di quei casi ... specialmente da quando user4556274 ha dato una risposta sintetica alla domanda come posta.
Mike Ounsworth,

18
@MikeOunsworth: il problema è che la risposta di user4556274 non funziona nel caso generale, funziona solo se i nomi delle interfacce sono effettivamente nomi di interfaccia prevedibili. Che un semplice ip link set ... name ...può cambiare. E sì, avrei potuto elencare personalmente i nomi delle interfacce prevedibili. La risposta alla domanda originale è "per favore, non farlo in questo modo". Perché non importa come lo fai, non funzionerà.
Dirkt

@ fpmurphy1 No, penso che significhi nomi di interfaccia prevedibili. Non importa se è systemd, tradizionale (ethN), convenzioni specifiche della tua azienda o qualsiasi altro standard che renda prevedibili i nomi
slebetman

12
@MikeOunsworth: la risposta è nella primissima sotto-clausola della primissima frase del primissimo paragrafo: "Le interfacce di rete possono essere nominate come qualsiasi cosa […]" Pertanto, ciò che l'OP chiede è impossibile e non può essere fatto . Non è possibile rilevare il tipo di interfaccia di rete in base a uno standard di convenzione di denominazione, poiché non esiste uno standard di convenzione di denominazione e chiunque può nominare le proprie interfacce come desiderato. Per esempio, sul mio vecchio router Linux, ho la testa adesivi colorati sulla schiena, e le interfacce Ethernet fisici sono stati nominati red, bluee green.
Jörg W Mittag,

1
@ JörgWMittag, ovviamente puoi rilevarli in base a uno standard, se sai che viene utilizzato lo standard (e ti aspetti uno che esporti tali informazioni nel nome in primo luogo). Sappiamo che systemd ha uno standard per la denominazione dell'interfaccia di rete , quindi è inutile dire che non esiste.
ilkkachu,

28

Per i nomi di interfaccia prevedibili systemd , i prefissi possono essere visualizzati in udev-builtin-net_id.c:

* Two character prefixes based on the type of interface:
*   en — Ethernet
*   ib — InfiniBand
*   sl — serial line IP (slip)
*   wl — wlan
*   ww — wwan

quindi, sia per lo ethXstile tradizionale di denominazione che per la nuova denominazione di sistema, una lettera iniziale e dovrebbe essere un'interfaccia ethernet per qualsiasi nome di interfaccia generato automaticamente. Tutte le interfacce wifi dovrebbero iniziare con una w in entrambi gli schemi, anche se non tutte le interfacce che iniziano con w saranno wifi.

Se questo strumento deve lavorare in un ambiente arbitrario (e non solo in ambienti interni che si Control), nota che gli utenti possono rinominare interfacce su sistemi Linux con nomi arbitrari, come [ wan0, lan0, lan1, dmz0] che romperà qualsiasi ipotesi circa le lettere iniziali .


7
E alcuni di noi sono fedeli refusenik di sistema.
Chrylis

1
Si noti che questa soluzione non funzionerà sui sistemi che utilizzano biosdevnameper la denominazione dell'interfaccia, in cui un'interfaccia Ethernet può essere denominata come p3p7. Questo metodo è un predecessore dei nuovi nomi prevedibili di sistema e sebbene sia ora deprecato su distribuzioni comuni, ci saranno ancora molti sistemi che lo hanno raccolto quando era l'impostazione predefinita alcuni anni fa.
TooTea,

systemd chiama in modo utile una delle mie interfacce Ethernet "rename3". Quale è può variare, sospiro :(
user1908704

1
@ user1908704: questo di solito significa che a udev è stato detto di assegnare lo stesso nome a più interfacce. (Forse hai un vecchio file "nomi persistenti" generato automaticamente in /etc/udev/rules.d?) Detto questo, il processo di ridenominazione è stato corretto in v187 per essere completamente atomico (successo o rollback) e il rename%uformato non ha ' non esiste nel codice sorgente dal 2012. Vorrei sospirare che il tuo software non fosse aggiornato da sei anni.
user1686

1
@grawity Questo è Ubuntu 18.04. Risulta che particolari schede madri hanno due schede NIC con la stessa voce ACPI, risultando entrambe in eno1. Poiché ciò non può accadere, uno di loro viene chiamato "rename3". Non ho elaborato completamente la logica di chi vince la gara, ma qualsiasi modifica può perturbare il contest e causare la ridenominazione dell'altro3.
user1908704

9

La convenzione di denominazione è che le interfacce LAN sono chiamati eth0, eth1, ... e che le interfacce WLAN sono chiamati wlan0, wlan1, ...

Quello che vedi sono i cosiddetti "nomi prevedibili" introdotti dal sistema. In pratica, sono tutt'altro che prevedibili e possono persino cambiare quando si cambia l'hardware, che è esattamente il problema che dovrebbero evitare.

Per indovinare la lettera iniziale potrebbe essere abbastanza buona. Alcune interfacce, in particolare la WLAN, hanno suggerimenti in /sys/class/net/*/uevent:

DEVTYPE=wlan

Sfortunatamente, non esiste tale DEVTYPEper le interfacce LAN.


2
Il nome del dispositivo cambia quando le modifiche hardware non sono il problema che i nomi di interfaccia prevedibili stanno cercando di evitare. Nomi di interfaccia prevedibili evitano la modifica dei nomi quando l'hardware è invariato . Questo è un problema quando i dispositivi hardware vengono rilevati in un ordine casuale.
Johan Myréen,

@ JohanMyréen È sbagliato: "... che (nome dell'interfaccia) rimangano fissi anche se l'hardware viene aggiunto o rimosso" freedesktop.org/wiki/Software/systemd/…
RalfFriedl

La motivazione per introdurre i nomi delle interfacce prevedibili era che il sondaggio non è deterministico e "l'assegnazione dei nomi" eth0 "," eth1 "e così via non è più fissa e potrebbe benissimo accadere che" eth0 "su uno stivale finisca per essere "eth1" al prossimo ". È un vantaggio se i nomi prevedibili possono sopravvivere alle modifiche hardware, ma questo non è stato il motivo principale per loro.
Johan Myréen,

1
Vincere un po 'perdere - in alcuni scenari, è molto desiderabile se l'hardware modificato fa clic in modo affidabile nello stesso "slot di denominazione" :)
rackandboneman

@ JohanMyréen Il vecchio schema di assegnazione dei nomi di interfaccia basato su MAC o altre proprietà funzionava in modo più affidabile quando si aggiungevano interfacce, senza il fastidio dei nuovi nomi.
RalfFriedl,

5

Un avvertimento con la mia risposta (vale anche per la maggior parte degli altri): non conosco lo scopo della tua candidatura. Se si tratta di un'applicazione usa e getta per risolvere un particolare problema o per comprendere meglio la rete, per non essere mai più utilizzata, fare affidamento sulla prima lettera dell'interfaccia potrebbe essere un'ottima opzione rapida e sporca. Se stai pianificando di scrivere il prossimo concorrente su Wireshark o tcpdump, devi essere sicuro di farlo bene per tutti i tipi di casi limite.

E se l'applicazione che stai scrivendo si colloca da qualche parte tra questi estremi, solo tu (e i tuoi clienti) potete sapere con quanta cura avete bisogno per implementare la vostra logica.

Altri hanno già sottolineato che i nomi non sono mai affidabili, per una serie di motivi. Il problema finale è molto comune nel software: ipotesi di codifica rigida invece di basarsi su fatti noti / documentati.

Il secondo problema che non è stato menzionato si basa anche su un'ipotesi relativa alle vostre esigenze: che l'elenco delle interfacce che si desidera elencare sia sempre esattamente "interfacce ethernet hardware" e "interfacce wifi".

Il terzo problema è l'ennesimo presupposto: tutte le interfacce rientreranno nelle categorie a cui puoi pensare ora. Che ne dici di Infiniband, come menzionato da @ user4556274? Che ne dite di interfacce tunnel per una VPN? Che ne dici di interfacce a ponte? Che ne dici di interfacce a ponte che combinano interfacce fisiche e logiche?

Ma potrebbero esserci delle opzioni per realizzare ciò che stai cercando. Innanzitutto, definisci esattamente ciò che caratterizza un'interfaccia che desideri elencare, rispetto a quella che non hai.

Nella maggior parte dei casi, una caratteristica su cui puoi fare affidamento è la tabella di routing (tuttavia, funzionerà solo finché l'interfaccia è attiva, quindi potrebbe non essere quello che stai effettivamente cercando).

Qualsiasi interfaccia che ha una route predefinita (ovvero una route a 0.0.0.0) è probabilmente quella che stai cercando.

Si noti che anche questo si basa ancora su un presupposto, solo più affidabile: è concepibile che un sistema sia configurato per instradare tutto il traffico in uscita attraverso una macchina virtuale o un contenitore docker (ad esempio, se è presente un contenitore che esegue un firewall ). E anche il contrario è vero: un amministratore di sistema potrebbe potenzialmente bloccare il traffico esterno eliminando il percorso predefinito.

Un'altra opzione è quella di passare dall'hardware effettivo e vedere quale driver utilizza. È quindi possibile escludere alcuni driver noti


4

Stai escludendo esplicitamente le interfacce collegate o in team? Il nostro default qui è usare bond0o team0per l'interfaccia primaria per i nostri server.

Penso che devi ripensare la tua logica. Forse prova a iterare attraverso tutte le interfacce di rete definite su un dato sistema, dividerle tra ethernet, wifi, infiband, seriale, ecc., E poi fare la tua magia.


3

Non hardcode o pattern corrispondono a nomi hardware. Questo vale per tutti i dispositivi. Affidati agli strumenti forniti da udev per determinare l'elenco dei dispositivi e prendere le misure appropriate. Vedere 16.7 Denominazione persistente del dispositivo , quindi leggere l' intero documento , in particolare 16.2 e 16.3. Nota che udev è agnostico di distribuzione e anche agnostico di sistema di init, poiché udev è ora il metodo preferito per la gestione dei dispositivi in ​​linux.

Si noti che @ user4556274, ha accennato a questo nella sua risposta quando ci si riferisce udev-builtin-net-id.c, il che in breve significa che il pattern matching che stai cercando di realizzare è parte integrante di udev.

Citando PredictableNetworkInterfaceNames :

Con systemd 197 abbiamo aggiunto il supporto nativo per una serie di diverse politiche di denominazione in systemd / udevd corretto e reso predefinito uno schema simile a biosdevname (ma generalmente più potente e più vicino agli schemi di identificazione dei dispositivi interni al kernel). I seguenti diversi schemi di denominazione per le interfacce di rete sono ora supportati da udev in modo nativo:

  1. I nomi che incorporano il firmware / BIOS hanno fornito i numeri di indice per i dispositivi di bordo (esempio: eno1)
  2. Nomi che incorporano firmware / BIOS forniti numeri indice slot hotplug PCI Express (esempio: ens1)
  3. Nomi che incorporano la posizione fisica / geografica del connettore dell'hardware (esempio: enp2s0)
  4. Nomi che incorporano l'indirizzo MAC delle interfacce (esempio: enx78e7d1ea46da) Denominazione ethX classica, imprevedibile, nativa del kernel (esempio: eth0)

Per impostazione predefinita, systemd v197 ora denominerà le interfacce seguendo la politica 1) se tali informazioni dal firmware sono applicabili e disponibili, ritornando a 2) se tali informazioni dal firmware sono applicabili e disponibili, tornando a 3) se applicabile, ricadendo a 5) in tutti gli altri casi. Il criterio 4) non viene utilizzato per impostazione predefinita, ma è disponibile se l'utente lo sceglie.

Questa politica combinata viene applicata solo come ultima risorsa. Ciò significa che se nel sistema è installato biosdevname, avrà la precedenza. Se l'utente ha aggiunto regole udev che cambiano il nome dei dispositivi del kernel, anche queste avranno la precedenza. Inoltre, qualsiasi schema di denominazione specifico per la distribuzione ha generalmente la precedenza.


2

Come altri hanno già detto, non puoi dipendere completamente dal nome.

Nel mio caso sembra che per wireless /sys/class/net/<ifacename>/avrà una directory chiamata "wireless" se è un'interfaccia wireless:

# kbrandt @ kbrandtlx in /sys/class/net [9:47:43] C:130
$ ls
br-b293588ecdae  enp11s0  lo    veth6061cd8  virbr0-nic
docker0          enp12s0  ppp0  virbr0       wlp13s0

# kbrandt @ kbrandtlx in /sys/class/net [9:47:44] 
$ echo  /sys/class/net/*/wireless
/sys/class/net/wlp13s0/wireless
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.