[sisyphus] systemd & network on boot

Денис Смирнов mithraen на freesource.info
Пт Авг 22 15:33:00 MSK 2014


On Fri, Aug 22, 2014 at 12:03:56PM +0300, diver wrote:


> root на office:~$ systemctl status network
> ● network.service - Network Connectivity
>    Loaded: loaded (/etc/systemd/system/network.service; enabled)
>    Active: inactive (dead)

О, я понял. Он enabled, но его никто не вытягивает!
Там ошибка в секции Install -- нужно добавить кроме

WantedBy=network-online.target
еще и:
WantedBy=network.target

и сделать:
systemctl deamon-reload
systemctl reenable network.service

> Ну допустим, но почему нет никаких сообщений в лог ? как это предлагается
> штатно диагностировать? безотносительно к текущей проблема, а в целом. Не
> будут же люди все время коллективно решать такие проблемы в рассылках? Да и
> не всегда есть сеть.

Потому что его никто не запускает, вот и нет сообщений в лог.

Это одна из самых неочевидных особенностей systemd для админа при первом
знакомстве.

Дело в том, что в systemd вообще нет понятия enable/disable аналогичного
тому, что в sysvinit.

В процессе загрузки systemd пытается "запустить" default.target. Смотрит
на его зависимости (wants/requires) и запускает указанное. И так
рекурсивно.

А systemctl enable делает только одно -- оно смотрит в секцию Install
указанного сервиса, и создает соответствующие симлинки.

А вот дальше начинается самое интересное -- etcnet сейчас зависит от
network-online.target. Причем он должен запуститься _до_ этого самоего
network-online.target.

Но network-online.target вытягивается исключительно теми сервисами,
которые требуют обязательно поднятой сети до своего старта. Если вдруг у
вас на машине не оказалось ни одного такого сервиса -- запускать сеть
некому.

network.target от network-online.target отличается тем, что первый требует
чтобы сеть запустилась, а второй -- чтобы сеть была установлена до
продолжения загрузки.

А необходимость в local-fs.target тоже следствие подобной интересной
ситуации -- network запускается после (After) udev-settle. Но он его не
_требует_ (Wants/Requires).

Это значит, что если udev-settle запускается -- надо запускать network
после него. Но если udev-settle никому не нужен -- то не надо пытаться его
запускать.

Раньше из-за сервиса, сохраняющего dmesg, udev-settle стартовал всегда. А
вот теперь он стартует мягко скажем далеко не всегда. И тогда некому
потребовать, чтобы network запускался после local-fs.target.

Все это выглядит очень запутанным на первый взгляд, для осознания нужно
четко понять три идеи:

1. Wants/Requires указывают _зависимости_, After/Before -- сортировку. Это
ортогональные понятия.

2. enable/disable исключительно создают симлинки следуя командам в секции
Install у сервиса.

3. сервис запускается _только_ если на него есть wants/requires
зависимость от сервиса, который запускается. Единственный юнит, который
всегда запускается при старте -- default.target. Остальное только если
оказывается в дереве зависимостей.

-- 
С уважением, Денис

http://mithraen.ru/

----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : отсутствует
Тип     : application/pgp-signature
Размер  : 181 байтов
Описание: Digital signature
Url     : <http://lists.altlinux.org/pipermail/sisyphus/attachments/20140822/63214f47/attachment.bin>


Подробная информация о списке рассылки Sisyphus