Gostaria de detectar se uma interface de rede é "física" ou "virtual", onde "física" significa que a interface possui hardware conectado, mesmo que esse "hardware" seja virtualizado por um hipervisor. "Virtual" significa então que é um dos elementos do kernel do Linux, como bridges, veths, macvlans, etc.
Estou ciente de que usando /sys/class/net/[nif]/...
posso seguir o link do dispositivo e, assim, diferenciar entre interfaces de rede virtual (virtuais) físicas e "reais" (sic!), com base no caminho do dispositivo que contém o subdiretório "virtual" ou não. No entanto, ao lidar com namespaces de rede, isso requer uma remontagem adequada sysfs
para poder ver as /sys/class/net/...
entradas corretas. Portanto, um método mais simples baseado apenas em dados RTNETLINK pode ser mais adequado.
Ao usar o RTNETLINK para descobrir as interfaces de rede disponíveis, existe alguma propriedade/atributo que me permite diferenciar sem a necessidade de verificar /sys/class/net/[nif]
?
A única maneira parece olhar para o
IFLA_INFO_KIND
atributo retornado de um arquivoRTM_GETLINK
. Este é um atributo opcional que está faltando para dispositivos físicos e também para olo
dispositivo de loopback.Quando está presente, contém uma string como
veth
,bridge
, etc. Comparando isso com uma lista de tipos de links virtuais conhecidos (consulteip link help
Recursos) identifica as interfaces de rede virtual, deixando todas as outras interfaces de rede no limite da "interface de rede física".Não é perfeito, mas funciona sem ter que consultar
/sys/class/net/[IFNAME]
, que nem sempre está corretamente presente e precisa desysfs
(re)montagem, veja também Identificar se uma interface de rede é umveth
uso/sys/class/net
?