В дистрибутивах 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
Это оно!