Вопрос или проблема
Странная проблема, которую я не нашел больше нигде в интернете, указывающая, что, вероятно, я что-то напутал, но что именно?
Попытка запустить dnsmasq.service
, неважно, при загрузке или из пользовательского сеанса, когда все сетевые службы доступны и работают, завершается ошибкой с unknown interface enp2s0
… за исключением того, что вся остальная система утверждает, что он работает.
andrzej@andrzej-PC ~ $ sudo systemctl start dnsmasq
Job for dnsmasq.service failed because the control process exited with
error code. See "systemctl status dnsmasq.service" and "journalctl -xe" for details.
andrzej@andrzej-PC ~ $ systemctl status dnsmasq
● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
Loaded: loaded (/lib/systemd/system/dnsmasq.service; disabled; vendor preset:
Drop-In: /run/systemd/generator/dnsmasq.service.d
└─50-dnsmasq-$named.conf, 50-insserv.conf-$named.conf
Active: failed (Result: exit-code) since Mon 2017-07-10 02:09:41 CEST; 3s ago
Process: 5551 ExecStart=/etc/init.d/dnsmasq systemd-exec (code=exited, status=
Process: 5548 ExecStartPre=/usr/sbin/dnsmasq --test (code=exited, status=0/SUC
Jul 10 02:09:41 andrzej-PC systemd[1]: Starting dnsmasq - A lightweight DHCP and
Jul 10 02:09:41 andrzej-PC dnsmasq[5548]: dnsmasq: syntax check OK.
Jul 10 02:09:41 andrzej-PC dnsmasq[5551]: dnsmasq: unknown interface enp2s0
Jul 10 02:09:41 andrzej-PC systemd[1]: dnsmasq.service: Control process exited,
Jul 10 02:09:41 andrzej-PC systemd[1]: Failed to start dnsmasq - A lightweight D
Jul 10 02:09:41 andrzej-PC systemd[1]: dnsmasq.service: Unit entered failed stat
Jul 10 02:09:41 andrzej-PC systemd[1]: dnsmasq.service: Failed with result 'exit
Правильно, кроме:
andrzej@andrzej-PC ~ $ ifconfig
enp2s0 Link encap:Ethernet HWaddr /*correct address*/
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:921 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:147421 (147.4 KB)
и то же самое для ip addr
:
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether /*same*/ brd ff:ff:ff:ff:ff:ff
и, наконец:
andrzej@andrzej-PC ~ $ cat /sys/class/net/enp2s0/operstate
up
Что? О, а мой конфигурационный файл выглядит так:
port=0
interface=enp2s0
dhcp-range=192.168.0.50,192.168.0.150,12h
dhcp-boot=/install/netboot/pxelinux.0
dhcp-option-force=209,install/netboot/pxelinux.cfg
dhcp-option-force=210,/
dhcp-option-force=66,192.168.0.1
enable-tftp
tftp-root=/mnt
изменить описание службы DNSMasq
sudo nano /lib/systemd/system/dnsmasq.service
Измените Requires и After, чтобы она запускалась после подъема интерфейсов.
Requires=network-online.target
After=network-online.target
У меня была такая же ситуация – отказ dnsmasq запускаться на вторичном интерфейсе eth, используемом для PXE, подключенном напрямую (без коммутатора) к другому компьютеру.
Как только у меня возникало соединение (некоторый сетевой трафик, загорались индикаторы сетевого интерфейса), dnsmasq начинал работать нормально.
Я знаю, что это не очень научно, но это сработало для меня (Ubuntu 20.04)
Помогла перезагрузка системы – dnsmasq запустился без проблем. Возможно, конфигурация устройства для интерфейса, настроенного для использования с dnsmasq, еще не вступила в силу.
Когда вы используете Linux, вы можете включить bind-dynamic. Согласно документации:
Включите сетевой режим, который является гибридом между
--bind-interfaces
и по умолчанию. Dnsmasq связывает адреса отдельных интерфейсов, что позволяет нескольким экземплярам dnsmasq, но если появляются новые интерфейсы или адреса, он автоматически слушает их (с учетом любой конфигурации контроля доступа). Это делает динамически создаваемые интерфейсы работать так же, как по умолчанию. Реализация этого параметра требует нестандартных сетевых API и доступна только в Linux. На других платформах она откатывается к режиму--bind-interfaces
.
Не забудьте удалить bind-interfaces.
Ссылка: https://thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html
Я не смог заставить это работать с методом Matt B. Все еще есть проблемы с недоступностью интерфейса. В итоге я создал таймер для службы dnsmasq:
sudo systemctl edit --force --full dnsmasq.timer
[Unit]
Description="Запустить dnsmasq при загрузке"
After=network-online.target
[Timer]
OnActiveSec=5s
[Install]
WantedBy=multi-user.target
Затем просто отключите службу и включите таймер.
sudo systemctl disable dnsmasq
sudo systemctl enable dnsmasq.timer
.
Ответ или решение
Чтобы разобраться с проблемой запуска службы dnsmasq и ошибкой "unknown interface", нужно поэтапно рассмотреть возможные причины и решения, основываясь на предоставленной информации. Данная ошибка возникает, когда dnsmasq не может обнаружить указанный сетевой интерфейс, даже если остальные приложения его видят и он функционирует.
Анализ проблемы
-
Конфигурация интерфейса: Сначала проверьте, правильно ли настроен сам сетевой интерфейс. Убедитесь, что он назван корректно в конфигурационном файле dnsmasq. Команда
ifconfig
показывает, что интерфейс enp2s0 действительно активен, однако dnsmasq не может его обнаружить. -
Синхронизация с сетевой подсистемой: Вероятнее всего, проблема связана с тем, что dnsmasq пытается стартовать до того, как сетевой интерфейс полноценно инициализирован. Чтобы скорректировать это, можно модифицировать файл службы, чтобы она запускалась только после полной готовности сети.
Рекомендованные шаги решения
1. Модификация службы dnsmasq:
- Откройте файл службы dnsmasq для редактирования:
sudo nano /lib/systemd/system/dnsmasq.service
- Добавьте следующие условия в секцию
[Unit]
:Requires=network-online.target After=network-online.target
- Это гарантирует, что служба dnsmasq запускается только после полной инициализации сети.
2. Использование режима bind-dynamic:
- В файле конфигурации dnsmasq
/etc/dnsmasq.conf
заменитеbind-interfaces
наbind-dynamic
. Этот режим подходит для Linux и позволяет dnsmasq автоматически настраиваться на новые интерфейсы:#bind-interfaces bind-dynamic
3. Создание таймера для службы:
- Если предыдущие шаги не помогли, можно создать таймер для отложенного запуска:
sudo systemctl edit --force --full dnsmasq.timer
-
В этом файле укажите следующее:
[Unit] Description="Run dnsmasq on boot" After=network-online.target [Timer] OnActiveSec=5s [Install] WantedBy=multi-user.target
- Отключите службу и активируйте таймер:
sudo systemctl disable dnsmasq sudo systemctl enable dnsmasq.timer
Эти шаги предназначены для устранения проблем с инициализацией сетевого интерфейса, с которой сталкивается dnsmasq при запуске.
Заключение
Используя данные подходы, вы можете устранить проблему с запуском dnsmasq. Важно также регулярно проверять логи системы, используя команды journalctl -xe
и systemctl status dnsmasq
, чтобы следить за поведением системы и службы. Если проблема сохраняется, стоит пересмотреть конфигурацию интерфейса и настройки сетевых служб на вашем компьютере.