Назад | Перейти на главную страницу

Что такое post-up для systemd-networkd? (конфигурация MAC динамического моста)

В дистрибутивах Linux, которые используют /etc/network/interfaces (например, Debian) я мог бы заставить (ядро) мост использовать MAC48-адрес одного из его подчиненных интерфейсов статического моста, такого как встроенный wlan0, с помощью post-up, как в:

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

Это гарантировало, что и 1) каждая клонированная система использовала свой собственный уникальный MAC48 (один из уникального wlan0), и 2) MAC моста оставался стабильным даже при горячей замене дополнительных интерфейсов моста с более низкими MAC48.

Поддерживает ли systemd-networkd какие-либо post-up команды, которые можно запустить после запуска сети (или netdev)? Я пытался найти такое, но, возможно, пропустил.

Или правильный путь в systemd совершенно другой, то есть иметь модуль устройства и службу, которая обертывает ip link... команда а зависит от устройства устройства? Если да, то как будут выглядеть модуль устройства и файлы модуля службы?

Оказывается, из-за тяжелой модульной концепции systemd и systemd-networkd вопрос о сценариях нужно решать под другим углом: вместо того, чтобы искать сценарии с мостом .netdev определение, systemd способ - иметь (очень маленький) разовый .service единица, которая разыскивается мост .netdev.

В качестве примечания: Похоже, что в более поздних ядрах Linux мосты ядра фактически больше не используют динамически изменяющуюся схему наименьшего MAC48 для моста MAC48. Вместо этого они создают статический MAC48 для самого моста. Таким образом, в очень строгом смысле этого решения больше не требуется, если только кто-то не предпочитает использовать «настоящий» аппаратный MAC48; что и делается здесь, в следующем сервисном блоке.

Необходимый новый сервисный блок (вместо старого post-up из /etc/network/interfaces) живет в /etc/systemd/system/bridge-stable-mac.service и назначает MAC48 из (встроенный, фиксированный) wlan0 к самому мосту:

[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

Центральным моментом здесь является WantedBy= пункт: всякий раз br0 запускается, то эту службу нужно запустить (ровно один раз, Type=oneshot). Systemd здесь действительно хорош, поскольку ему не нужно редактировать существующее определение устройства, чтобы добавить нашу зависимость, а вместо этого вычисляет эту зависимость, используя нашу обратную WantedBy= ссылка на сайт. Это действительно то место, где я думаю systemd сияет.

Сервисный блок выше предполагает, что ваш мост назван br0. Вы должны использовать соответствующий .netdev файл для определения этого моста br0. Например, в /etc/systemd/network/10-br0.netdev:

[NetDev]
Name=br0
Kind=bridge

Когда дело доходит до горячего подключения портов моста, systemd фактически делает это уже «из коробки», что очень удобно; в /etc/systemd/network/10-br0-ports.network:

[Match]
Name=eth0 wlan0

[Network]
Bridge=br0

Это оно!