Установить службу systemd для выполнения после монтирования fstab

33

Я работаю над systemd .serviceсценарием, который должен запускаться после подключения сетевой папки CIFS через /etc/fstabк /mnt/при загрузке.

Сценарий ожидает запуска сценария зависимости OpenVPN, но я также хочу дождаться завершения монтирования.

/etc/systemd/system/my-daemon.service :

[Unit]
Description=Launch My Daemon
After=network.target vpn-launch.service
Requires=vpn-launch.service

Я попытался добавить systemd.mountк строке:, After=network.target vpn-launch.service systemd.mountно это не дало результатов, на которые я надеялся.

Winterflags
источник
Это работает, если вы добавите systemd-remount-fsв свой Afterсписок?
Эрик Ренуф

Ответы:

40

CIFS расположение в сети устанавливается с помощью /etc/fstabк /mnt/при начальной загрузке.

Нет. Сделайте это правильно, а все остальное встанет на свои места, естественно.

Монтирование обрабатывается (сгенерированным) модулем монтирования systemd, который будет называться как-то так mnt-wibble.mount. Вы можете увидеть его фактическое имя в выводе systemctl list-units --type=mountкоманды. Вы можете рассмотреть это подробно, как и любой другой блок с systemctl status.

Тогда очень просто: вы должны заказать запуск вашего устройства после запуска этого монтирующего устройства.

После = network.target vpn-launch.service mnt-wibble.mount

дальнейшее чтение

JdeBP
источник
10
Список монтируется с помощью "systemctl list-units --type = mount"
nijave
Для фолловеров «вибля» - это просто фиктивное имя, например «foobar»
rogerdpack
17

Извините, но я пока не могу комментировать.

Как сказал JdeBP, вы должны упорядочивать при монтировании файловой системы. Вы можете предсказать имя монтируемого устройства или, альтернативно, вы можете использовать (в разделе устройства):

RequiresMountsFor = / абсолютный / путь / из / монтирование

Эта опция создает зависимости для соответствующих блоков * .mount, чтобы сделать путь доступным до запуска службы. Это может быть не на всех системных версиях, но я использую его на компьютере с CentOS 7 последние 6 месяцев или около того.

miguelbernadi
источник
ваши отличия от vanilla systemd здесь .) У RequiresMountsFor=него есть свои предостережения. С ошибкой RedHat # 1088057 и Крисом Зибенманом в руках вы сможете ответить на superuser.com/questions/988734 . Это и есть CIFS в этом вопросе. Но подразумевается, что это auto, к счастью.
JdeBP
@JdeBP Спасибо за комментарий. Я не знал о предостережениях и проблемах с этой функцией.
Мигельбернади
14

Хотя оба ответа верны, я хочу добавить свои два цента к обсуждению, потому что когда я искал его, мне не хватало некоторых инструкций и примеров того, как действовать.

  1. Добавить файловую систему в /etc/fstab
  2. Тип, mount -aкоторый монтирует все файловые системы, упомянутые в fstab
  3. Найдите модуль systemd, сгенерированный с помощью:

    systemctl list-units | grep '/path/to/mount' | awk '{ print $1 }'

    (должен возвращать то, что заканчивается на .mount)
  4. Добавьте найденный модуль монтирования в After=оператор в *.serviceфайле

Вот пример запуска my-daemonслужбы при загрузке, но после того, как сеть готова, смонтирован общий ресурс CIFS /mnt/cifsи vpn-launchзапущена служба:

/ И т.д. / Fstab

//servername/sharename /mnt/cifs cifs defaults,some,other,options 0 0

Примечание. Возможно, вы захотите добавить nofailк своим параметрам fstab (например, при использовании внешнего диска). В противном случае ваша машина не загрузится, если устройство не подключено. Смотрите статью в fstab ArchWiki


/etc/systemd/system/my-daemon.service

[Unit]
Description=Launch My Daemon
Requires=vpn-launch.service mnt-cifs.mount
After=network.target vpn-launch.service mnt-cifs.mount

[Service]
ExecStart=/path/to/my-daemon

[Install]
WantedBy=multi-user.target

Не забудьте включить службу так, чтобы она запускалась при загрузке: systemctl enable my-daemon

Обратите внимание, что это работает и для других файловых систем (NFS, HDD и т. Д.).

Как уже упоминалось, оба ответа верны, и я призываю всех прочитать их, но для меня пара примеров сэкономила бы мне время.

Обновление (2019-06-25):

  • добавлено примечание о параметрах fstab для предотвращения блокировки загрузки при использовании внешних дисков
  • добавлен mnt-cifs.mountв Requires=список, который вызывает my-daemon.serviceсбой при запуске, когда монтирование cifs не было успешно смонтировано
Ьт-bergmotte
источник
Просто чтобы быть понятным, "mnt-cifs.mount" - это имя модуля монтирования для вашей конкретной точки монтирования systemctl list-units --type=mount?
smdvlpr
1

@ bm-bergmotte: спасибо за вашу инструкцию, которая мне очень помогла. Для меня это просто работает, если я поставлю

After=network.target vpn-launch.service mnt-cifs.mount
Requires=vpn-launch.service mnt-cifs.mount

Если я не помещаю «mnt-cifs.mount» в поле «Требуется» (и в этом порядке), оно работает для перезагрузки / запуска, но служба все равно запускается, если устройство не смонтировано. После помещения его дополнительно внутрь «Требуется» служба монтирует устройство перед его запуском, если устройство не было смонтировано.

tmade
источник
Вы правы. Если монтирование не удается, тогда все равно запускается my-daemon.service. After=просто диктует порядок. Requires=делает обязательным присутствие горы cifs (см. Суфиян Гори ответ на этот вопрос). Я обновлю свой ответ.
Ьт-bergmotte