Setel layanan systemd untuk dieksekusi setelah fstab mount

33

Aku sedang bekerja pada sebuah systemd .servicescript yang seharusnya dimulai setelah lokasi jaringan CIFS dipasang melalui /etc/fstabuntuk /mnt/boot-up.

Skrip menunggu skrip dependensi OpenVPN untuk diluncurkan terlebih dahulu, tetapi saya juga ingin skrip menunggu untuk diselesaikan.

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

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

Saya mencoba menambahkan systemd.mountke baris:, After=network.target vpn-launch.service systemd.mounttetapi tidak memberikan hasil yang saya harapkan.

Bendera musim dingin
sumber
Apakah itu berfungsi jika Anda menambahkan systemd-remount-fske Afterdaftar Anda ?
Eric Renouf

Jawaban:

40

lokasi jaringan CIFS dipasang melalui /etc/fstabke /mnt/saat boot-up.

Tidak, bukan. Lakukan ini dengan benar, dan sisanya jatuh ke tempatnya secara alami.

Mount ditangani oleh unit mount systemd (dihasilkan) yang akan diberi nama seperti mnt-wibble.mount. Anda dapat melihat nama aslinya di output systemctl list-units --type=mountperintah. Anda dapat melihatnya secara detail sama seperti unit lainnya systemctl status.

Sangat sederhana, maka: Anda harus memesan unit Anda untuk memulai setelah unit mount dimulai.

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

Bacaan lebih lanjut

JdeBP
sumber
10
Daftarkan mount dengan "systemctl list-units --type = mount"
nijave
Untuk pengikut, "wibble" hanyalah nama tiruan, seperti "foobar"
rogerdpack
17

Maaf tapi saya belum bisa berkomentar.

Seperti kata JdeBP, Anda harus memesan pada sistem file mount. Anda dapat memprediksi nama unit pemasangan atau, sebagai alternatif, Anda dapat menggunakan (di bagian unit):

Membutuhkan MountsFor = / absolute / path / of / mount

Opsi ini menciptakan dependensi ke unit * .mount yang sesuai untuk membuat jalur dapat diakses sebelum memulai layanan. Mungkin tidak pada semua versi systemd, tapi saya sudah menggunakannya di mesin CentOS 7 selama 6 bulan terakhir.

miguelbernadi
sumber
(Dan perbedaanmu dengan vanilla systemd ada di sini .) RequiresMountsFor=Memang datang dengan serangkaian peringatan sendiri. Dengan RedHat bug # 1088057 dan Chris Siebenmann di tangan, Anda seharusnya dapat menjawab superuser.com/questions/988734 . Ini adalah mount CIFS dalam pertanyaan ini juga. Tapi implikasinya adalah autountungnya.
JdeBP
@ JdeBP Terima kasih atas komentarnya. Saya tidak menyadari peringatan dan masalah pada fitur itu.
miguelbernadi
14

Meskipun kedua jawaban itu benar, saya ingin menambahkan dua sen saya ke dalam diskusi, karena ketika saya mencarinya, saya kehilangan beberapa instruksi dan contoh cara melanjutkan.

  1. Tambahkan sistem file ke /etc/fstab
  2. Ketik mount -ayang memasang semua sistem file yang disebutkan di fstab
  3. Cari unit systemd yang telah dihasilkan dengan:

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

    (harus mengembalikan sesuatu yang diakhiri dengan .mount)
  4. Tambahkan unit mount yang ditemukan ke After=pernyataan dalam *.servicefile

Berikut adalah contoh memulai my-daemonlayanan saat boot tetapi setelah jaringan siap, bagian CIFS dipasang /mnt/cifs, dan vpn-launchlayanan telah dimulai:

/ etc / fstab

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

Catatan: Anda mungkin ingin menambahkan nofailopsi fstab Anda (mis. Saat menggunakan drive eksternal). Kalau tidak, mesin Anda tidak akan bisa boot jika perangkat tidak terhubung. Lihat artikel 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

Jangan lupa untuk mengaktifkan layanan sedemikian rupa sehingga dimulai saat boot: systemctl enable my-daemon

Perhatikan bahwa ini juga berfungsi untuk sistem file lain (NFS, HDD, dll.).

Seperti yang telah disebutkan, kedua jawaban itu benar dan saya mendorong semua orang untuk membacanya, tetapi bagi saya beberapa contoh akan menghemat waktu.

Pembaruan (2019-06-25):

  • menambahkan catatan tentang opsi fstab untuk mencegah kunci boot saat menggunakan drive eksternal
  • ditambahkan mnt-cifs.mountke Requires=daftar yang menyebabkan my-daemon.servicekegagalan untuk memulai ketika cifs mount tidak berhasil dipasang
bm-bergmotte
sumber
Untuk lebih jelasnya, "mnt-cifs.mount" adalah nama unit mount untuk titik-mount spesifik Anda systemctl list-units --type=mount?
smdvlpr
1

@ bm-bergmotte: terima kasih atas instruksi Anda yang banyak membantu saya. Bagi saya itu hanya berfungsi, jika saya katakan

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

Jika saya tidak memasukkan "mnt-cifs.mount" di dalam "Membutuhkan" (dan dalam urutan ini) ia berfungsi untuk reboot / memulai, tetapi layanan tetap akan dimulai, jika perangkat tidak dipasang. Setelah memasukkannya ke dalam "" Membutuhkan "layanan memasang perangkat sebelum memulai, jika perangkat tidak dipasang.

dirapikan
sumber
Kamu benar. Jika mount gagal maka my-daemon.service tetap dijalankan. After=hanya menentukan perintah. Requires=mewajibkan cifs mount harus ada (lihat jawaban Sufiyan Ghori untuk yang itu). Saya akan memperbarui jawaban saya.
bm-bergmotte