Как запустить службу Systemd до запуска сети?

11

Я пытаюсь настроить новый сервис (под Debian Jessie), который должен настроить некоторые монтирования, где хранится конфигурация сети, и, таким образом, этот сервис должен завершиться до запуска network.service.

Я попробовал следующее:

[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
#Before=network-pre.target
Before=networking.service

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=networking.service

Используя, systemd-analyze plotя вижу, что мой сервис запускается, но networking.serviceзапускается примерно на 3 секунды раньше:

введите описание изображения здесь

Видимо мой конфиг неверен, но мне трудно найти проблему ... Любая помощь очень ценится ..

Обновить

В настоящее время я решил это, изменив конфигурацию службы, чтобы начать раньше local-fs.targetвместо networking.service:

[Unit]
DefaultDependencies=no
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
Before=local-fs.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=local-fs.target

Тем не менее, я хотел бы понять, почему моя первая конфигурация не работает должным образом ...?

Удо Г
источник
Из-за того, как работает systemd, буквальный временной порядок, в котором все происходит, может быть незначительным. Когда сеть начинает работать, это успешно в соответствии с файлами в этом каталоге?
Том Хант
Я не уверен, что понял ваш вопрос. Во всяком случае, /etc/network/interfacesесть ссылки на ip-upскрипты, которые находятся в другом разделе. Этот раздел монтируется сложным сценарием, /opt/intermodul-mounts/start.shкоторый должен быть запущен до настройки сети. В настоящее время ip-upсценарии фактически не запускаются, потому что они недоступны во время загрузки. Запуск service networking restartпосле этого корректно вызывает все интерфейсы.
Удо G
Возможный дубликат: superuser.com/questions/1005742/…
Йосип Роден

Ответы:

8

network-pre.target - это цель, которую можно использовать для заказа услуг до того, как будет настроен какой-либо сетевой интерфейс. Его основная цель - использование со службами брандмауэра, которые хотят установить брандмауэр до того, как какой-либо сетевой интерфейс заработает. Это пассивный модуль: вы не можете запустить его напрямую, и он не загружается службой управления сетью, а службой, которая хочет работать до него.

Вы хотите использовать, network-pre.targetесли вы хотите настроить что-то до запуска сети

Службы, которые необходимо запустить до настройки сети, должны поместить Before = network-pre.target, а также установить Wants = network-pre.target, чтобы включить его.

Вы должны поместить их в [Unit]раздел:

Before=network-pre.target
Wants=network-pre.target

Ссылка

Эдвард Торвальдс
источник
1
Привет @edwardtorvalds, я делал именно это для настройки сетевой конфигурации, но устройство, кажется, никогда не запускается. Ответ systemctl is-enabled <unit>всегда static. Конечно, я не могу включить его, потому что нет WantedBy=. В конце концов, чего он хочет? Это то, что делает некоторые настройки до загрузки сети.
Deitch
вы можете попробовать разыскивать по = remote-fs.target или mount-fs.target.
Эдвард Торвальдс
2
Благодарю. Я закончил тем , что делал Before=network-pre.targetи так Wants=network-pre.targetи для [Install]нас сделали WantedBy=network.target. Последний раздел заставлял это требоваться сетью, первый приводил это в порядок. Была боль, хотя
deitch
Поскольку вы определенно лучше разбираетесь в systemd, чем я, вы можете посмотреть на другой вопрос, который у меня есть? unix.stackexchange.com/questions/277783/… Все еще пытаюсь понять, как это сделать.
Deitch
Я сбит с толку, потому что у меня нет опыта работы с зашифрованным разделом, если вы можете просто мне, пожалуйста, сделайте это
Эдвард Торвальдс
3

Как и в Debian Jessie, пакет netfilter-persistent (позволяющий загружать правила iptables до запуска сети) имеет сервис netfilter-persistent.service, который выглядит следующим образом:

# https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
# based on the netfilter-persistent package
[Unit]
Description=netfilter persistent configuration
DefaultDependencies=no

Before=network-pre.target
Wants=network-pre.target

Wants=systemd-modules-load.service local-fs.target
After=systemd-modules-load.service local-fs.target

Conflicts=shutdown.target
Before=shutdown.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/netfilter-persistent start
ExecStop=/usr/sbin/netfilter-persistent stop

[Install]
WantedBy=multi-user.target
user2024640
источник
Почему это противоречит shutdown.target?!
Алексис Уилк
1

Ошибка проста и одна из главных вещей, которые я всегда смешиваю: вы смешиваете Beforeи RequiredBy. Это не идет вместе. Другие правы относительно цели.

отрава
источник
0
[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=basic.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
WantedBy=basic.target

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

spkane
источник