10 апреля 2016

Debian, Systemd и сеть.




Началось всё с того, что я поставил 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" указывает на успешно поднятую сеть, а мой сервис не стукнулся лбом об отсутствующий доступ в сеть.