Началось всё с того, что я поставил Debian 8 и начал стаскивать на него всё добро в виде всяких нужных служб. С 8-й версии в качестве системы инициализации и вообще всего там работает Systemd. На первый взгляд хорошая и удобная штука, если не вдаваться в подробности, но подвело внедрение. Не бывает так, чтобы сразу хорошо.
В Systemd есть так называемые цели. Это такое разделение загрузки системы на этапы, к которым можно привязать свои сервисы. Вот этим я и хотел воспользоваться, чтобы один из самопальных сервисов запускался непосредственно после поднятия сети.
Но тут меня ждал жестокий облом, потому что за сеть в Debian отвечает старый механизм. В итоге система инициализации рапортует, что цели "network.target" и "network-online.target" достигнуты, а сети на самом деле еще нет, потому что DHCP-клиент только пошел стучаться в роутер за настройками.
Умные люди с linux.org.ru подсказали, что и тут Поттеринг всё предусмотрел и сделал аж два сервиса для удобства:
- "systemd-networkd" для поднятия сети и обновления настроек по DHCP;
- "systemd-networkd-wait-online" для ожидания полной инициализации сети.
Погуглив и почитав на эту тему, я начал исправлять "ошибки разработчиков".
Сначала надо создать файл настроек для своих сетей. У меня сеть только проводная, так что файл получился совершенно простой:
$ cat /etc/systemd/network/eth.network [Match] Name=eth* [Network] DHCP=yes
В Debian пока используется старое именование сетевых интерфейсов, так что эти настройки сработают на любой проводной сетевой адаптер, и система будет пытаться получить настройки по DHCP.
Теперь осталось выключить действующий механизм настройки сети и включить механизм Systemd:
update-rc.d networking disable systemctl enable systemd-networkd systemctl enable systemd-networkd-wait-online systemctl start systemd-networkd
В системном журнале при этом должны появиться такие записи (оставил только значимые поля):
systemd[1]: Started Network Service. systemd-networkd[178]: eth0 : gained carrier systemd-networkd[178]: eth0 : DHCPv4 address 192.168.1.30/24 via 192.168.1.1 systemd-networkd[178]: eth0 : Not connected to system bus, ignoring transient hostname. systemd-networkd[178]: eth0 : link configured
Последняя запись будет повторяться по мере истечения срока аренды IP-адреса.
После перезагрузки я с радостью обнаружил, что цель "network-online.target" указывает на успешно поднятую сеть, а мой сервис не стукнулся лбом об отсутствующий доступ в сеть.