Qual é o equivalente de post-up do systemd-networkd? (configuração MAC de ponte dinâmica)

5

Em distribuições Linux que usam /etc/network/interfaces (como o Debian) eu pude obter uma ponte (kernel) para usar o endereço MAC48 de uma de suas interfaces escravo de ponte estática, como um construído em wlan0 , usando post-up , como em:

 post-up ip link set br0 address 'cat /sys/class/net/wlan0/address'

Isso garantiu que ambos 1) cada sistema clonado usasse seu próprio MAC48 exclusivo (aquele do wlan0 exclusivo), e 2) que o MAC da ponte se mantivesse estável mesmo quando plugando mais interfaces de ponte com MAC48s mais baixos.

O systemd-networkd suporta qualquer tipo de comandos post-up que podem ser executados após uma rede (ou netdev) ter sido ativada? Eu tentei encontrar uma coisa dessas, mas posso ter perdido isso.

Ou a maneira correta no systemd é completamente diferente, ou seja, ter uma unidade de dispositivo e um serviço que encapsula o comando ip link... e depende da unidade do dispositivo? Em caso afirmativo, como seria a unidade do dispositivo e os arquivos da unidade de serviço?

    
por TheDiveO 21.08.2017 / 18:57

1 resposta

7

Acontece que, devido ao pesado conceito modular de systemd e systemd-networkd , a questão de script precisa ser abordada de um ângulo diferente: em vez de procurar scripts com a ponte .netdev definition, o systemd maneira é ter um (muito pequeno) one-shot .service unidade que é desejado por a ponte .netdev .

As a side note: it seems that in more recent Linux kernels, the kernel bridges actually don't use the dynamically changing lowest MAC48 scheme for the bridge MAC48 anymore. Instead, they create a static MAC48 for the bridge itself. So, in the very strict sense this solution is not really needed anymore, unless one prefers to use a "real" hardware MAC48; which is what is done here in the following service unit.

A nova unidade de serviço necessária (em vez da antiga post-up de /etc/network/interfaces ) reside em /etc/systemd/system/bridge-stable-mac.service e atribui o MAC48 de (incorporado, fixo) wlan0 à própria ponte:

[Service]
Type=oneshot
ExecStart=/bin/bash -c "/bin/echo 'br0 available, setting MAC ' '/bin/cat /sys/class/net/wlan0/address'"
ExecStart=/bin/bash -c "/sbin/ip link set br0 address '/bin/cat /sys/class/net/wlan0/address'"

[Install]
WantedBy=sys-subsystem-net-devices-br0.device

O ponto central aqui é a cláusula WantedBy= : sempre que br0 for iniciado, esse serviço deverá ser executado (exatamente uma vez, Type=oneshot ). O Systemd é realmente interessante aqui, já que ele não precisa editar a definição de dispositivo existente para adicionar nossa dependência, mas calcula essa dependência usando nosso link WantedBy= inverso. Isso é realmente onde eu acho que systemd brilha.

A unidade de serviço acima supõe que sua ponte é denominada br0 . Você deve usar um arquivo .netdev correspondente para definir essa ponte br0 . Por exemplo, em /etc/systemd/network/10-br0.netdev :

[NetDev]
Name=br0
Kind=bridge

Quando se trata de hotplug de portas de ponte, systemd realmente faz isso já pronto, o que é muito legal; em /etc/systemd/network/10-br0-ports.network :

[Match]
Name=eth0 wlan0

[Network]
Bridge=br0

É isso aí!

    
por 22.08.2017 / 18:02