Среда
- wb-release:
Wirenboard release wb-2602 (as testing), target wb6/bullseye
- nmcli:
nmcli tool, version 1.42.4
- Владелец файла:
dpkg -S /etc/NetworkManager/dispatcher.d/01-ifupdown
network-manager: /etc/NetworkManager/dispatcher.d/01-ifupdown
Что происходит / воспроизведение
-
Перезагрузить контроллер или перезапустить NetworkManager.
-
В журнале появляется событие device-reapply/reapply, затем предупреждение dispatcher и таймаут (~25 s):
... audit: op="device-reapply" interface="eth0" ifindex=3 args="ipv4.route-metric" ...
... dhcp4 (eth0): state changed new lease, address=192.168.2.54
... dispatcher: (11) /etc/NetworkManager/dispatcher.d/01-ifupdown failed (failed): Script '/etc/NetworkManager/dispatcher.d/01-ifupdown' exited with status 1.
... failed (after 24.667 sec): Failed to activate service 'org.freedesktop.nm_dispatcher': timed out (service_start_timeout=25000ms)
Почему это проблема
-
При возврате кода 1 dispatcher помечает скрипт как failed и ждёт завершения nm-dispatcher (service_start_timeout ≈ 25000 ms), что удлиняет запуск/переключение сетевых интерфейсов и может приводить к дополнительным проблемам (unmanaged деактивации и т.п.).
-
Скрипт имеет shebang #!/bin/sh -e — любой ненулевой код команды приведёт к немедленному выходу со статусом 1. Даже если логика внутри case содержит no‑op, возможен путь исполнения, где тест/выражение даёт ошибку. Проще и безопаснее явно вернуть 0 для действий reapply/device-reapply до выполнения любой логики.
Предлагаемое исправление (вставить ранний no‑op + exit 0 для reapply и device-reapply)
- Патч делает обработку reapply/device-reapply явной и ранней — немедленный успешный выход, чтобы гарантированно не возвращать ненулевой код.
Unified diff (применяется к /etc/NetworkManager/dispatcher.d/01-ifupdown):
--- a/01-ifupdown 2025-02-25 00:00:00.000000000 +0000
+++ b/01-ifupdown 2025-02-25 00:00:00.000000000 +0000
@@
-#!/bin/sh -e
+#!/bin/sh -e
# Script to dispatch NetworkManager events
#
# Runs ifupdown scripts when NetworkManager fiddles with interfaces.
# See NetworkManager(8) for further documentation of the dispatcher events.
+
+# Early-exit for reapply/device-reapply to avoid accidental non-zero exit codes
+# when NetworkManager only updates some settings. This prevents dispatcher
+# from treating the script as failed and avoids long dispatcher timeouts.
+if [ "$2" = "reapply" ] || [ "$2" = "device-reapply" ]; then
+ exit 0
+fi
Применение патча на контроллер (если нужно локально проверить):
sudo cp -a /etc/NetworkManager/dispatcher.d/01-ifupdown /etc/NetworkManager/dispatcher.d/01-ifupdown.bak
sudo sed -i '1a\
\
# Early-exit for reapply/device-reapply to avoid accidental non-zero exit codes\
if [ "$2" = "reapply" ] || [ "$2" = "device-reapply" ]; then\
exit 0\
fi' /etc/NetworkManager/dispatcher.d/01-ifupdown
sudo chmod 755 /etc/NetworkManager/dispatcher.d/01-ifupdown
sudo systemctl restart NetworkManager
(я уже пробовал аналогичный workaround локально — он устраняет предупреждение dispatcher и таймаут)
Просьба от пакета (что ожидаем)
-
Внести фикс в пакет network-manager (или дистрибутивный wrapper), чтобы штатный /etc/NetworkManager/dispatcher.d/01-ifupdown корректно и безопасно обрабатывал action’ы reapply/device-reapply (ранний возврат 0) и выпустить обновление.
-
Опционально: проверить пути в скрипте, где могут возникнуть ненулевые возвраты при set‑переменных/тестах и сделать код более устойчивым к нечисловым/пустым переменным (чтобы поведение было детерминированным).
Если нужно — могу приложить:
-
полный dump journalctl -u NetworkManager (полный файл nm.log)
-
текущий /etc/NetworkManager/dispatcher.d/01-ifupdown (полный текст — уже в запросе)
-
результат проверки с предложенным патчем (до/после: строки warning исчезают)
Вопросы к инженерам/разработчикам
-
Можно ли внести предлагаемый ранний exit 0 в основной пакет network-manager в следующем релизе?
-
Нужны ли дополнительные логи или автоматические тесты для CI (на малой архитектуре/образе Wiren Board)?
Рабочий пофикшенный скрипт прикладываю:
01-ifupdown.txt (2,4 КБ)