Встановіть системну службу для виконання після встановлення 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але це не дало результатів, на які я сподівався.


Чи працює, якщо ви додасте systemd-remount-fsдо свого Afterсписку?
Ерік Ренуф

Відповіді:


40

мережеве розташування CIFS монтується через /etc/fstabдо /mnt/під час завантаження.

Ні, це не так. Правильно це правильно, а решта встає на місце природним шляхом.

З монтажем обробляється (згенерований) системний блок кріплення, який буде названий чимось на кшталт mnt-wibble.mount. Його фактичне ім'я ви можете побачити у висновку systemctl list-units --type=mountкоманди. Ви можете детально розглянути його, як і будь-який інший блок systemctl status.

Тоді дуже просто: ви повинні замовити запуск вашого пристрою після запуску цього блоку кріплення.

After = network.target vpn-launch.service mnt-wibble.mount

Подальше читання


10
Перерахуйте кріплення з "systemctl list-units --type = mount"
nijave

Для прихильників "wibble" - це лише фіктивне ім'я, як "foobar"
rogerdpack

17

Вибачте, але поки не можу коментувати.

Як сказав JdeBP, вам слід замовляти на кріпленні файлової системи. Ви можете передбачити назву блоку кріплення або, як варіант, використовувати:

RequiresMountsFor = / абсолютний / шлях / з / mount

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


ваші відмінності від ванільної системи тут є .) Справді єRequiresMountsFor= власний набір застережень. Із помилкою RedHat # 1088057 та Крісом Зібенманом у руці ви маєте змогу відповісти на superuser.com/questions/988734 . Це питання і в CIFS у цьому питанні. Але сенс полягає в тому, що це auto, на щастя.
JdeBP

@JdeBP Дякую за коментар. Мені не було відомо про застереження та проблеми щодо цієї функції.
miguelbernadi

14

Хоча обидві відповіді правильні, я хочу додати свої два центи до дискусії, тому що коли я її шукав, мені не вистачало деяких інструкцій та прикладів того, як діяти.

  1. Додайте до файлової системи /etc/fstab
  2. Введіть, mount -aякий змонтує всі файлові системи, згадані в fstab
  3. Шукайте системний блок, який був сформований із:

    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 (наприклад, при використанні зовнішнього накопичувача). В іншому випадку ваша машина не завантажиться, якщо пристрій не підключено. Дивіться статтю ArchWiki fstab


/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, жорстких дисків тощо).

Як вже було сказано, обидві відповіді правильні, і я закликаю всіх прочитати їх, але для мене пара прикладів заощадила б трохи часу.

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

  • додано примітку щодо параметрів fstab, щоб запобігти блокуванню завантаження при використанні зовнішніх накопичувачів
  • додано mnt-cifs.mountдо Requires=списку, що призводить my-daemon.serviceдо невдалого запуску, коли кріплення кріплення не вдалося встановити

Щоб було зрозуміло, "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" всередині "Потрібно" (і в цьому порядку), він працює для перезавантаження / запуску, але служба все одно запускається, якщо пристрій не встановлено. Після додаткового розміщення всередині "" Потрібно "сервіс монтує пристрій перед його запуском, якщо пристрій не був встановлений.


Ти правий. Якщо монтаж не вдається, то все-таки запускається my-daemon.service. After=просто диктує наказ. Requires=зобов’язує обов'язково присутність гори цифів (див. відповідь Суфіяна Горі на це). Я оновлю свою відповідь.
bm-bergmotte
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.