cara memulai layanan systemd sebelum jaringan dimulai?

11

Saya mencoba mengatur layanan baru (di bawah Debian Jessie) yang perlu mengatur beberapa mount di mana konfigurasi jaringan disimpan dan dengan demikian layanan ini harus selesai sebelum jaringan. Layanan dimulai.

Saya mencoba yang berikut ini:

[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
#Before=network-pre.target
Before=networking.service

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=networking.service

Menggunakan systemd-analyze plotSaya dapat melihat bahwa layanan saya mulai, tetapi networking.servicemulai sekitar 3 detik sebelumnya:

masukkan deskripsi gambar di sini

Rupanya konfigurasi saya salah, tetapi saya kesulitan menemukan masalahnya ... Bantuan apa pun sangat dihargai ..

Memperbarui

Saya saat ini menyelesaikannya dengan mengubah konfigurasi layanan untuk memulai sebelum local-fs.targetbukannya networking.service:

[Unit]
DefaultDependencies=no
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
Before=local-fs.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=local-fs.target

Namun, saya ingin memahami mengapa konfigurasi pertama saya tidak berfungsi seperti yang diharapkan ...?

Udo G
sumber
Karena cara systemd bekerja, tatanan temporal literal di mana segala sesuatu berjalan mungkin tidak signifikan. Ketika jaringan muncul, apakah berhasil sesuai dengan file di direktori itu?
Tom Hunt
Saya tidak yakin saya mengerti pertanyaan Anda. Bagaimanapun, /etc/network/interfacesmemiliki referensi ke ip-upskrip yang berada di partisi lain. Partisi itu dipasang oleh skrip kompleks /opt/intermodul-mounts/start.shyang harus dijalankan sebelum jaringan sedang diatur. Saat ini, ip-upskrip secara efektif tidak dimulai karena mereka tidak dapat diakses saat boot. Menjalankan service networking restartsetelah itu menampilkan semua antarmuka dengan benar.
Udo G
Kemungkinan rangkap: superuser.com/questions/1005742/...
Josip Rodin

Jawaban:

8

network-pre.target adalah target yang dapat digunakan untuk memesan layanan sebelum antarmuka jaringan dikonfigurasi. Tujuan utamanya adalah untuk penggunaan dengan layanan firewall yang ingin membuat firewall sebelum antarmuka jaringan apa pun diaktifkan. Ini adalah unit pasif: Anda tidak dapat memulainya secara langsung dan tidak ditarik oleh layanan manajemen jaringan, tetapi oleh layanan yang ingin dijalankan sebelumnya.

Anda ingin menggunakan network-pre.targetjika Anda ingin mengatur sesuatu sebelum jaringan dimulai

Layanan yang ingin dijalankan sebelum jaringan dikonfigurasi harus menempatkan Before = network-pre.target dan juga mengatur Mau = network-pre.target untuk menariknya.

Anda harus meletakkan ini di bawah [Unit]bagian:

Before=network-pre.target
Wants=network-pre.target

Referensi

Edward Torvalds
sumber
1
Hai @edwardtorvalds, saya melakukan ini persis untuk beberapa konfigurasi konfigurasi jaringan, namun unit tampaknya tidak pernah berjalan. Jawabannya systemctl is-enabled <unit>selalu static. Tentu saja, saya tidak dapat mengaktifkannya karena tidak ada WantedBy=. Lagi pula, apa yang diinginkannya? Ini adalah sesuatu yang melakukan beberapa pengaturan sebelum jaringan memuat.
Pengacara
Anda dapat mencoba yang diinginkan dengan = remote-fs.target atau mount-fs.target.
Edward Torvalds
2
Terima kasih. Saya akhirnya melakukan Before=network-pre.targetdan Wants=network-pre.targetdan untuk [Install]kami lakukan WantedBy=network.target. Bagian terakhir memaksanya diperlukan oleh jaringan, yang pertama mengaturnya. Adalah rasa sakit,
pengacara
karena Anda pasti memiliki kepala di sekitar systemd jauh lebih baik daripada saya, dapatkah Anda melihat q lain yang saya miliki? unix.stackexchange.com/questions/277783/... Masih mencoba mencari cara untuk melakukannya.
Pengacara
Saya bingung karena saya tidak punya pengalaman dengan partisi terenkripsi, jika Anda dapat dengan mudahnya saya tolong lakukan
Edward Torvalds
3

Seperti yang dilakukan di Debian Jessie, paket netfilter-persistent (memungkinkan untuk memuat aturan iptables sebelum jaringan menyala) memiliki layanan netfilter-persistent.service yang terlihat seperti:

# https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
# based on the netfilter-persistent package
[Unit]
Description=netfilter persistent configuration
DefaultDependencies=no

Before=network-pre.target
Wants=network-pre.target

Wants=systemd-modules-load.service local-fs.target
After=systemd-modules-load.service local-fs.target

Conflicts=shutdown.target
Before=shutdown.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/netfilter-persistent start
ExecStop=/usr/sbin/netfilter-persistent stop

[Install]
WantedBy=multi-user.target
pengguna2024640
sumber
Mengapa itu bertentangan dengan shutdown.target?!
Alexis Wilke
1

Kesalahannya sederhana dan salah satu hal utama yang selalu saya campur: Anda mencampur Beforedan RequiredBy. Itu tidak berjalan bersama. Yang lain benar tentang target.

Kutukan
sumber
0
[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=basic.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
WantedBy=basic.target

Melakukan sesuatu di sepanjang garis ini akan memastikan bahwa unit ini telah berjalan sebelum jaringan, tetapi setelah sebagian besar pengaturan penting lainnya terjadi.

spkane
sumber