Qual é o padrão da convenção de nomenclatura para interfaces Ethernet e Wi-Fi em uma máquina Linux?
Estamos desenvolvendo uma ferramenta que deve mostrar apenas as interfaces Ethernet e Wi-Fi da máquina Linux e seu status atual.
Por exemplo, abaixo está a lista de interfaces de rede (físicas e virtuais) na minha máquina Linux (Ubuntu):
docker0
, enp0s25
, lo
,wlp3s0
Quando executo a ferramenta, abaixo está o resultado que recebo:
enp0s25
, wlp3s0
Escrevemos o código com a lógica de que todas as interfaces Ethernet sempre começam com a letra e
e as interfaces Wi-Fi sempre com a letra w
.
A lógica está certa? Caso contrário, como podemos resolver isso?
networking
wifi
network-interface
ethernet
Mohan Raj
fonte
fonte
iwconfig
filtro interfaces WiFi de outros.lshw -class network
talvez? Procure tudo o que écapabilities: ethernet physical
? Possivelmente procurou alguns dos outros recursos também?Respostas:
As interfaces de rede podem ter qualquer nome; portanto, não importa o que você faça, você encontrará situações em que (1) existe uma interface de rede "física" com um nome que não corresponde ao seu padrão ou (2) existe uma interface de rede "física" que corresponderá ao seu padrão.
Além disso, se eu fosse usuário da sua ferramenta, no momento em que ela não me permitisse fazer o que eu queria, porque eu tenho uma interface de rede que é "virtual", embora por motivos práticos ela deva ser considerada " físico "na minha configuração, eu começava a xingar alto e com força no seu aplicativo e nunca mais o usaria.
Interfaces de rede físicas e virtuais compartilham uma API comum, algo que torna o Linux realmente flexível. Por favor, não tente tomar conta de seu usuário e tire isso dele. Seus usuários agradecerão.
fonte
ip link set ... name ...
pode mudar. E sim, eu poderia ter listado os nomes de interface previsíveis. A resposta para a pergunta original é "por favor, não faça dessa maneira". Porque não importa como você faça isso, não funcionará.red
,blue
egreen
.Para nomes de interface previsíveis do systemd , os prefixos podem ser vistos em
udev-builtin-net_id.c
:portanto, tanto para o
ethX
estilo tradicional de nomeação quanto para a nomeação mais recente do sistema, uma letra inicial e deve ser uma interface Ethernet para qualquer nome de interface gerado automaticamente. Todas as interfaces wifi devem começar com w nos dois esquemas, embora nem todas as interfaces que começam com w sejam wifi.Se esta ferramenta tem de trabalhar em um ambiente arbitrária (e não apenas em ambientes internos que você controla), nota que os usuários podem renomear interfaces em sistemas Linux com nomes arbitrários, como [
wan0
,lan0
,lan1
,dmz0
] que vai quebrar quaisquer suposições sobre letras iniciais .fonte
biosdevname
nomes de interface, nos quais uma interface Ethernet pode ser nomeada comop3p7
. Esse método é um antecessor dos novos nomes previsíveis do sistema e, embora agora seja preterido em distribuições comuns, ainda haverá muitos sistemas que o escolheram quando era o padrão há alguns anos atrás.rename%u
formato não foi alterado. existe no código-fonte desde 2012. Gostaria de suspirar que seu software esteja seis anos desatualizado.A convenção de nomenclatura é que interfaces LAN são nomeados
eth0
,eth1
... e que as interfaces WLAN são nomeadoswlan0
,wlan1
...O que você vê são os chamados "nomes previsíveis" que o systemd introduziu. Na prática, eles são tudo menos previsíveis e podem até mudar quando o hardware é alterado, que é exatamente o problema que eles devem evitar.
Para adivinhar, a letra inicial pode ser boa o suficiente. Algumas interfaces, em particular a WLAN, têm dicas sobre
/sys/class/net/*/uevent
:Infelizmente, não existe
DEVTYPE
para interfaces LAN.fonte
Uma ressalva com a minha resposta (também se aplica à maioria das outras): não sei o objetivo do seu aplicativo. Se for um aplicativo descartável para solucionar um problema em particular, ou para entender melhor a rede, para nunca mais ser usado novamente, confiar na primeira letra da interface pode ser uma ótima opção, rápida e suja. Se você planeja escrever o próximo concorrente no Wireshark ou no tcpdump, precisa ter certeza de que está certo para todos os tipos de casos extremos.
E se o aplicativo que você está escrevendo estiver entre esses extremos, apenas você (e seus clientes) poderão saber com que cuidado você precisa implementar sua lógica.
Outros já apontaram que os nomes nunca são confiáveis, por várias razões. O problema final é muito comum no software: suposições codificadas em vez de confiar em fatos conhecidos / documentados.
A segunda questão que não foi mencionada também se baseia em uma suposição sobre seus requisitos: que a lista de interfaces que você deseja listar é sempre exatamente "interfaces Ethernet de hardware" e "interfaces Wi-Fi".
A terceira questão é mais uma suposição: que toda interface cairá nas categorias em que você pode pensar agora. Que tal Infiniband, como mencionado por @ user4556274? E as interfaces de túnel para uma VPN? E as interfaces em ponte? E as interfaces com ponte que combinam interfaces físicas e lógicas?
Mas pode haver opções para realizar o que você está procurando. Primeiro, defina exatamente o que caracteriza uma interface que você deseja listar, versus uma que você não deseja.
Na maioria dos casos, uma característica em que você pode confiar é a tabela de roteamento (no entanto, isso funcionará apenas enquanto a interface estiver ativa, portanto, pode não ser o que você está procurando).
Qualquer interface que tenha uma rota padrão (ou seja, uma rota para 0.0.0.0) provavelmente será a que você está procurando.
Observe que mesmo isso ainda é baseado em uma suposição, apenas uma mais confiável: é possível que um sistema esteja configurado para rotear todo o tráfego de saída por meio de uma máquina virtual ou de um contêiner de encaixe (por exemplo, se houver um contêiner executando um firewall ) E o contrário também é verdadeiro: um administrador de sistemas pode bloquear o tráfego externo excluindo a rota padrão.
Outra opção é seguir o hardware real e ver qual driver ele usa. Você pode excluir determinados drivers conhecidos
fonte
Você está excluindo explicitamente interfaces vinculadas ou agrupadas? Nosso padrão aqui é usar
bond0
outeam0
para a interface principal de nossos servidores.Eu acho que você precisa repensar sua lógica. Talvez tente repetir todas as interfaces de rede definidas em um determinado sistema, divida-as entre ethernet, wifi, infiband, serial etc. e faça sua mágica.
fonte
Não codifique ou faça a correspondência de nomes de hardware de padrão. Isso se aplica a todos os dispositivos. Confie nas ferramentas fornecidas pelo udev para determinar a lista de dispositivos e tomar as medidas apropriadas. Consulte 16.7 Nomeação de dispositivo persistente e, em seguida, leia todo o documento , especificamente 16.2 e 16.3. Observe que o udev é independente da distribuição e também o init do sistema, já que o udev agora é o método preferido para o gerenciamento de dispositivos no linux.
Observe que @ user4556274, aludiu a isso em sua resposta ao se referir a
udev-builtin-net-id.c
, o que significa que o padrão correspondente que você está tentando realizar é parte integranteudev
.Citando PredictableNetworkInterfaceNames :
fonte
Como outros já disseram, você não pode depender totalmente do nome.
No meu caso, parece que para wireless
/sys/class/net/<ifacename>/
haverá um diretório chamado "wireless", se for uma interface sem fio:fonte