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.


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


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.


(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ę

Ż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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.