Ustaw usługę systemową do uruchomienia po zamontowaniu fstab

33

Pracuję na systemd .serviceskrypt, który ma rozpocząć po lokalizacja sieciowa jest zamontowany poprzez CIFS /etc/fstababy /mnt/na rozruchowym.

Skrypt czeka na uruchomienie skryptu zależności OpenVPN, ale chcę też, aby czekał na zakończenie montowania.

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

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

Próbowałem dodać systemd.mountdo linii:, After=network.target vpn-launch.service systemd.mountale nie dało to wyników, na które liczyłem.

Winterflags
źródło
Czy to działa, jeśli dodasz systemd-remount-fsdo swojej Afterlisty?
Eric Renouf,

Odpowiedzi:

40

lokalizacja sieciowa CIFS jest montowana za pośrednictwem /etc/fstabdo /mnt/podczas uruchamiania.

Nie, nie jest. Zrób to dobrze, a reszta wpasuje się naturalnie.

Podłączenie jest obsługiwane przez (wygenerowaną) systemowo zamontowaną jednostkę montowania, której nazwa zostanie nazwana podobnie mnt-wibble.mount. Możesz zobaczyć jego rzeczywistą nazwę na wyjściu systemctl list-units --type=mountpolecenia. Możesz przyjrzeć się temu szczegółowo, tak jak każdej innej jednostce systemctl status.

Zatem bardzo prosto: musisz nakazać uruchomienie jednostki po uruchomieniu tej jednostki montażowej.

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

Dalsza lektura

JdeBP
źródło
10
Zamontować listę za pomocą „systemctl list-units --type = mount”
nijave
Dla obserwujących „wibble” to tylko fikcyjne imię, takie jak „foobar”
rogerdpack
17

Przepraszam, ale nie mogę jeszcze komentować.

Jak powiedział JdeBP, należy zamawiać na podstawie systemu plików. Możesz przewidzieć nazwę jednostki montowania lub alternatywnie możesz użyć (w sekcji jednostek):

WymagaMountsFor = / bezwzględna / ścieżka / z / mount

Ta opcja tworzy zależności do odpowiednich * .mount jednostek, aby ścieżka była dostępna przed uruchomieniem usługi. Może nie być we wszystkich wersjach systemowych, ale używam go na komputerze CentOS 7 przez ostatnie 6 miesięcy.

miguelbernadi
źródło
(I twoje różnice w stosunku do systemu waniliowego są tutaj .) MaRequiresMountsFor= swój własny zestaw ostrzeżeń. Z błędem RedHat # 1088057 i Chrisem Siebenmannem w dłoni powinieneś być w stanie odpowiedzieć superuser.com/questions/988734 . W tym pytaniu jest to również montaż CIFS. Ale implikacja jest taka, że ​​na autoszczęście tak jest .
JdeBP,
@JdeBP Dziękujemy za komentarz. Nie wiedziałem o zastrzeżeniach i problemach związanych z tą funkcją.
miguelbernadi
14

Mimo że obie odpowiedzi są poprawne, chcę dodać dwa centy do dyskusji, ponieważ kiedy jej szukałem, brakowało mi instrukcji i przykładów dalszego postępowania.

  1. Dodaj system plików do /etc/fstab
  2. Typ, mount -aktóry montuje wszystkie systemy plików wymienione w fstab
  3. Poszukaj jednostki systemowej, która została wygenerowana za pomocą:

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

    (powinna zwrócić coś, co kończy się na .mount)
  4. Dodaj znalezioną jednostkę montowania do After=instrukcji w *.servicepliku

Oto przykład uruchomienia my-daemonusługi przy rozruchu, ale gdy sieć jest gotowa, podłączany jest udział CIFS /mnt/cifsi vpn-launchusługa została uruchomiona:

/ etc / fstab

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

Uwaga: Możesz chcieć dodać nofaildo opcji fstab (np. Gdy używasz zewnętrznego dysku). W przeciwnym razie komputer nie uruchomi się, jeśli urządzenie nie będzie podłączone. Zobacz artykuł 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

Nie zapomnij włączyć usługi tak, aby była uruchamiana podczas rozruchu: systemctl enable my-daemon

Pamiętaj, że działa to również w przypadku innych systemów plików (NFS, HDD itp.).

Jak już wspomniano, obie odpowiedzi są poprawne i zachęcam wszystkich do ich przeczytania, ale dla mnie kilka przykładów zaoszczędziłoby mi trochę czasu.

Aktualizacja (25.06.2019):

  • dodano notatkę dotyczącą opcji fstab, aby zapobiec blokadzie rozruchu podczas korzystania z dysków zewnętrznych
  • dodano mnt-cifs.mountdo Requires=listy, co powoduje my-daemon.serviceniepowodzenie uruchamiania, gdy montowanie cifs nie powiodło się
bm-bergmotte
źródło
Żeby było jasne, „mnt-cifs.mount” to nazwa jednostki montowania dla konkretnego punktu montowania systemctl list-units --type=mount?
smdvlpr
1

@ bm-bergmotte: dzięki za instrukcję, która bardzo mi pomogła. Dla mnie to po prostu działa, jeśli tak powiem

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

Jeśli nie wstawię „mnt-cifs.mount” w polu „Wymaga” (i w tej kolejności), działa to w celu ponownego uruchomienia / uruchomienia, ale usługa i tak uruchomi się, jeśli urządzenie nie zostanie zamontowane. Po umieszczeniu go dodatkowo w „Wymaganym” usługa montuje urządzenie przed jego uruchomieniem, jeśli urządzenie nie zostało zamontowane.

zrobione
źródło
Masz rację. Jeśli montowanie się nie powiedzie, to i tak uruchamiane jest my-daemon.service. After=po prostu dyktuje zamówienie. Requires=sprawia, że ​​obowiązkowe jest montowanie cifs (patrz odpowiedź Sufiyana Ghori na ten temat). Zaktualizuję moją odpowiedź.
bm-bergmotte