Detectar que uma interface de rede é “física” ou “virtual” usando somente RTNETLINK no Linux?

2

Eu gostaria de detectar se uma interface de rede é "física" ou "virtual", onde "física" significa que a interface tem 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, et cetera.

Estou ciente de que, usando /sys/class/net/[nif]/... , posso seguir o link do dispositivo e, assim, diferenciar entre interfaces de rede virtual (virtual) física e "real" (sic!), com base no caminho do dispositivo que contém o sub "virtual" diretório ou não. No entanto, ao lidar com namespaces de rede, isso requer um sysfs remontado adequadamente para poder ver as entradas /sys/class/net/... corretas. Portanto, um método mais simples, confiando apenas nos dados RTNETLINK, pode ser mais adequado.

Ao usar o RTNETLINK para descobrir as interfaces de rede disponíveis, há alguma propriedade / atributo que me permita diferenciar sem a necessidade de verificar /sys/class/net/[nif] ?

    
por TheDiveO 27.06.2018 / 07:47

1 resposta

0

A única maneira parece olhar para o atributo IFLA_INFO_KIND retornado de um RTM_GETLINK . Este é um atributo opcional que está faltando para dispositivos físicos e também para o dispositivo de loopback lo .

Quando presente, contém uma string como veth , bridge , et cetera. Comparando isso com uma lista de tipos de links virtuais conhecidos (consulte ip link help ), identifica interfaces de rede virtual, deixando todas as outras interfaces de rede no estádio "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 de sysfs (re) montagem, veja também Identifique se uma interface de rede é um veth usando /sys/class/net ?

    
por 27.06.2018 / 20:55