Вопрос или проблема
У меня есть встроенное устройство, которое будет подключаться к серверу DHCP через systemd-networkd
, если оно подключено к локальной сети, и вернется в режим DHCP-сервера, если нет. Я еще не реализовал это, но планирую использовать ответ, описанный здесь.
Этот ответ указывает на использование скрипта, который будет запущен при загрузке. Я задумался, что произойдет, если пользователь отключит сетевой кабель и подключит его к ПК во время работы, ему нужно будет перезагрузить плату, чтобы скрипт запустился. Итак, вопрос: есть ли способ запустить скрипт при изменении интерфейса с помощью systemd?
Я пробовал использовать networkd-dispatcher без успеха. Я пытался перезапустить службу systemd-networkd
, отключил Ethernet-кабель, но скрипт, который я написал и который находится в /usr/lib/networkd-dispatcher
, не выполняется.
Этот ответ объясняет, что можно сделать с systemd, когда происходят изменения сети…
Существует много альтернативных решений, но прямое простое решение только с использованием systemd не реализовано на момент 06/2019.
Вы можете адаптировать мой скрипт net-o-matic
, который в настоящее время следит за DOWN
, чтобы следить за UP
. Запустите его из записи @reboot
в root
crontab
.
Я написал bash-скрипт, чтобы помочь с этим: https://github.com/waltinator/net-o-matic
. Он следит за соединением, и когда соединение теряется, выполняет действия, заданные пользователем, чтобы попытаться восстановить соединение.
Ответ или решение
Для решения задачи выполнения сценария при изменении состояния Ethernet-соединения с использованием systemd, можно воспользоваться встроенным функционалом systemd, таким как systemd-networkd
и systemd.service
. Вот пошаговая инструкция, чтобы достичь этой цели, обеспечивая необходимую гибкость при подключении и отключении Ethernet-кабеля.
1. Настройка systemd-networkd
Прежде всего, убедитесь, что systemd-networkd
активирован и используется для управления сетевыми интерфейсами. Вам понадобится создать файл конфигурации для вашего сетевого интерфейса.
Пример: /etc/systemd/network/10-ethernet.network
[Match]
Name=eth0 # Замените eth0 на имя вашего интерфейса
[Network]
DHCP=yes # Использование DHCP для получения IP-адреса
# Конфигурация для работы в режиме DHCP-сервера при отсутствии соединения с DHCP-клиентом
# Для этого добавьте необходимые настройки для IPv4 или IPv6
2. Создание сцепления для наблюдения за состоянием интерфейса
Мы можем создать юнит-файл для systemd, который будет реагировать на состояния сети. Это позволит выполнять сценарий при изменении состояния интерфейса.
Пример: /etc/systemd/system/network-watcher.service
[Unit]
Description=Watch Ethernet connection changes
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/network-watcher.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
3. Создание скрипта для отслеживания состояния сети
Теперь создайте сам скрипт, который будет выполнять необходимые действия при изменении состояния ethernet-соединения.
Пример: /usr/local/bin/network-watcher.sh
#!/bin/bash
while true; do
if ip link show eth0 | grep -q "state UP"; then
# Действие при подключении
echo "Ethernet cable is connected. Performing actions..."
# Здесь добавьте считывание DHCP, дополнительные команды и т.д.
else
# Действие при отключении
echo "Ethernet cable is disconnected. Performing fallback actions..."
# Включение режима DHCP-сервера или другие действия
fi
sleep 5 # Проверяйте состояние каждые 5 секунд
done
4. Установка прав на исполнение
Не забудьте сделать ваш скрипт исполняемым:
sudo chmod +x /usr/local/bin/network-watcher.sh
5. Включение и запуск service unit
Теперь включите и запустите ваш сервис:
sudo systemctl enable network-watcher.service
sudo systemctl start network-watcher.service
Заключение
Эта настройка позволит вашему скрипту автоматически реагировать на изменения в состоянии Ethernet-соединения без необходимости перезагрузки устройства. Таким образом, ваш embedded device будет обладать необходимой гибкостью для работы как в среде с доступом к DHCP, так и в роли DHCP-сервера.
Подобный подход гарантирует, что система будет легко адаптироваться к изменениям в сети, обеспечивая максимально эффективную и безотказную работу в разнообразных условиях.