¿Cuál es el estándar de la convención de nomenclatura para interfaces Ethernet y Wi-Fi en una máquina Linux?
Estamos desarrollando una herramienta que debe mostrar solo las interfaces Ethernet y Wi-Fi de la máquina Linux y su estado actual.
Por ejemplo, a continuación se muestra la lista de interfaces de red (tanto físicas como virtuales) en mi máquina Linux (Ubuntu):
docker0
, enp0s25
, lo
,wlp3s0
Cuando ejecuto la herramienta, a continuación se muestra el resultado que obtengo:
enp0s25
, wlp3s0
Hemos escrito el código con la lógica de que todas las interfaces Ethernet siempre comienzan con la letra e
y las interfaces Wi-Fi siempre comienzan con la letra w
.
¿Es correcta la lógica? Si no, ¿cómo podemos abordar esto?
networking
wifi
network-interface
ethernet
Mohan Raj
fuente
fuente
iwconfig
filtra las interfaces WiFi de otras.lshw -class network
tal vez? ¿Busca todo lo que escapabilities: ethernet physical
? ¿Posiblemente busque algunas de las otras capacidades también?Respuestas:
Las interfaces de red pueden tener cualquier nombre, así que no importa lo que haga, se encontrará con situaciones en las que (1) hay una interfaz de red "física" con un nombre que no coincide con su patrón, o (2) hay un interfaz de red "física" que coincidirá con su patrón.
Además de eso, si fuera usuario de su herramienta, en el momento en que su herramienta no me permitiera hacer algo que quisiera, porque tengo una interfaz de red que es "virtual", aunque para fines prácticos debería considerarse " físico "en mi configuración, comenzaría a maldecir en voz alta y enérgica en su aplicación, y nunca lo volveré a usar.
Las interfaces de red físicas y virtuales comparten una API común son una cosa que hace que Linux sea realmente flexible. Por favor, no trate de cuidar a su usuario y quítele eso. Tus usuarios te lo agradecerán.
fuente
ip link set ... name ...
puede cambiar. Y sí, podría haber enumerado los nombres de interfaz predecibles yo mismo. La respuesta a la pregunta original es "por favor, no lo hagas así". Porque no importa cómo lo hagas, no funcionará.red
,blue
ygreen
.Para los nombres de interfaz predecibles de systemd , los prefijos se pueden ver en
udev-builtin-net_id.c
:por lo tanto, tanto para el
ethX
estilo tradicional de denominación como para la denominación systemd más reciente, una letra inicial e debería ser una interfaz ethernet para cualquier nombre de interfaz generado automáticamente. Todas las interfaces wifi deben comenzar con una w en ambos esquemas, aunque no todas las interfaces que comienzan con w serán wifi.Si esta herramienta tiene que trabajar en un ambiente arbitraria (en lugar de sólo en ambientes internos que control), nota que los usuarios pueden cambiar el nombre de las interfaces de sistemas Linux con nombres arbitrarios, tales como [
wan0
,lan0
,lan1
,dmz0
] que romperá ninguna hipótesis sobre letras iniciales .fuente
biosdevname
para nombrar interfaces, donde se puede nombrar una interfaz Ethernet comop3p7
. Este método es un predecesor de los nuevos nombres predecibles de systemd y aunque ahora está en desuso en distribuciones comunes, todavía habrá muchos sistemas que lo detectaron cuando era el predeterminado hace unos años.rename%u
formato no ha sido correcto No existía en el código fuente desde 2012. Me gustaría suspirar porque su software está seis años desactualizado.La convención de nomenclatura es que las interfaces LAN se nombran
eth0
,eth1
, ... y que las interfaces WLAN se nombranwlan0
,wlan1
, ...Lo que ves son los llamados "nombres predecibles" que introdujo systemd. En la práctica, son todo menos predecibles, e incluso pueden cambiar cuando se cambia el hardware, que es exactamente el problema que se supone que deben evitar.
Para adivinar, la carta de inicio puede ser lo suficientemente buena. Algunas interfaces, en particular WLAN, tienen pistas sobre
/sys/class/net/*/uevent
:Desafortunadamente, no existe tal
DEVTYPE
para las interfaces LAN.fuente
Una advertencia con mi respuesta (también se aplica a la mayoría de los demás): no sé el propósito de su solicitud. Si se trata de una aplicación descartable para solucionar un problema en particular, o para comprender mejor las redes, para nunca volver a usarse, entonces confiar en la primera letra de la interfaz puede ser una excelente opción rápida y sucia. Si planea escribir el próximo competidor a Wireshark o tcpdump, debe asegurarse de hacerlo bien para todo tipo de casos extremos.
Y si la aplicación que está escribiendo cae en algún punto entre esos extremos, solo usted (y sus clientes) pueden saber con qué cuidado necesita implementar su lógica.
Otros ya han señalado que los nombres nunca son confiables, por varias razones. El último problema es muy común en el software: suposiciones de codificación dura en lugar de confiar en hechos conocidos / documentados.
El segundo problema que no se ha mencionado también se basa en una suposición acerca de sus requisitos: que la lista de interfaces que desea enumerar siempre es exactamente "interfaces de ethernet de hardware" e "interfaces wifi".
El tercer problema es otra suposición: que todas las interfaces se incluirán en las categorías que se te ocurran en este momento. ¿Qué tal Infiniband, como lo mencionó @ user4556274? ¿Qué hay de las interfaces de túnel para una VPN? ¿Qué hay de las interfaces puenteadas? ¿Qué hay de las interfaces puenteadas que combinan interfaces físicas y lógicas?
Pero puede haber opciones para lograr lo que está buscando. Primero, defina exactamente qué caracteriza una interfaz que desea enumerar, frente a una que no tiene.
En la mayoría de los casos, una característica en la que puede confiar es la tabla de enrutamiento (sin embargo, esto solo funcionará mientras la interfaz esté activa, por lo que puede no ser lo que realmente está buscando).
Es probable que cualquier interfaz que tenga una ruta predeterminada (es decir, una ruta a 0.0.0.0) sea la que está buscando.
Tenga en cuenta que incluso esto todavía se basa en una suposición, solo una más confiable: es concebible que un sistema esté configurado para enrutar todo el tráfico saliente a través de una máquina virtual o un contenedor acoplable (por ejemplo, si hay un contenedor que ejecuta un firewall) ) Y lo contrario también es cierto: un administrador de sistemas podría bloquear el tráfico externo al eliminar la ruta predeterminada.
Otra opción es ir por el hardware real y ver qué controlador usa. Luego puede excluir ciertos controladores conocidos
fuente
¿Está excluyendo explícitamente las interfaces unidas o unidas? Nuestro valor predeterminado aquí es usar
bond0
oteam0
para la interfaz principal de nuestros servidores.Creo que necesitas repensar tu lógica. Tal vez intente iterar a través de todas las interfaces de red definidas en un sistema dado, divídalas entre ethernet, wifi, infiband, serial, etc., y luego haga su magia.
fuente
No codifique ni coincida con los nombres de hardware del patrón. Esto se aplica a todos los dispositivos. Confíe en las herramientas proporcionadas por udev para determinar la lista de dispositivos y tomar las medidas adecuadas. Consulte 16.7 Nombres de dispositivos persistentes y luego lea todo el documento , específicamente 16.2 y 16.3. Tenga en cuenta que udev es independiente de la distribución, y también independiente del sistema init, ya que udev es ahora el método preferido para la administración de dispositivos en Linux.
Tenga en cuenta que @ user4556274, aludió a esto en su respuesta al referirse a
udev-builtin-net-id.c
, lo que en resumen significa que la coincidencia de patrones que está tratando de lograr es una parte incorporadaudev
.Citando PredictableNetworkInterfaceNames :
fuente
Como otros han dicho, no puedes depender completamente del nombre.
En mi caso, parece que para wireless
/sys/class/net/<ifacename>/
tendrá un directorio llamado "wireless" si es una interfaz inalámbrica:fuente