Pada dependensi konfigurasi jaringan systemd
Sangat mudah untuk mempengaruhi pemesanan unit systemd. Di sisi lain, Anda perlu berhati-hati tentang apa yang dijamin unit lengkap.
Konfigurasikan layanan Anda
Pada sistem saat ini, memesan setelah network.target
hanya menjamin bahwa layanan jaringan telah dimulai, bukan bahwa ada beberapa konfigurasi yang sebenarnya. Anda perlu memesan setelah network-online.target
dan menariknya untuk mencapai itu.
[Unit]
Wants=network-online.target
After=network-online.target
Untuk kompatibilitas dengan sistem yang lebih lama, Anda mungkin perlu memesan setelah network.target juga.
[Unit]
Wants=network-online.target
After=network.target network-online.target
Itu untuk file unit layanan Anda dan untuk systemd.
Implementasi dalam versi perangkat lunak saat ini
Sekarang Anda perlu memastikan bahwa itu network-online.target
berfungsi seperti yang diharapkan (atau setidaknya Anda dapat menggunakannya network.target
).
Versi NetworkManager saat ini menawarkan penawaran NetworkManager-wait-online.service
yang ditarik network-online.target
oleh layanan Anda. Layanan khusus ini memastikan bahwa layanan Anda akan menunggu hingga semua koneksi yang dikonfigurasi untuk dimulai secara otomatis berhasil, gagal, atau habis waktu.
Versi systemd-networkd saat ini memblokir layanan Anda sampai semua perangkat dikonfigurasi seperti yang diminta. Lebih mudah karena saat ini hanya mendukung konfigurasi yang diterapkan pada saat boot (lebih khusus waktu startup dari `systemd-networkd.service).
Demi kelengkapan, /etc/init.d/network
layanan di Fedora, sebagaimana ditafsirkan oleh versi systemd saat ini, memblokir network.target
dan dengan demikian secara tidak langsung memblokir network-online.target
dan layanan Anda. Ini adalah contoh implementasi berbasis skrip.
Jika implementasi Anda, baik berbasis daemon atau berbasis skrip, berperilaku sebagai salah satu layanan manajemen jaringan di atas, itu akan menunda dimulainya layanan Anda hingga konfigurasi jaringan berhasil diselesaikan, gagal karena alasan yang baik, atau kehabisan waktu setelah waktu yang wajar. bingkai untuk menyelesaikan.
Anda mungkin ingin memeriksa apakah netctl bekerja dengan cara yang sama dan informasi itu akan menjadi tambahan yang berharga untuk jawaban ini.
Implementasi dalam versi perangkat lunak yang lebih lama
Saya tidak berpikir Anda akan melihat versi systemd yang cukup lama di mana ini tidak bekerja dengan baik. Tetapi Anda dapat memeriksa bahwa setidaknya network-online.target
ada dan dipesan setelah itu network.target
.
Sebelumnya NetworkManager hanya menjamin bahwa setidaknya satu koneksi akan diterapkan. Dan bahkan agar itu berfungsi, Anda harus mengaktifkannya NetworkManager-wait-online.service
secara eksplisit. Ini telah lama diperbaiki di Fedora tetapi baru-baru ini diterapkan di hulu.
systemctl enable NetworkManager-wait-online.service
Catatan tentang implementasi network.target dan network-online.target
Anda seharusnya tidak perlu membuat perangkat lunak Anda bergantung pada NetworkManager.service
atau NetworkManager-wait-online.service
atau layanan spesifik lainnya. Sebagai gantinya, semua layanan manajemen jaringan harus memesan sendiri sebelum network.target
dan secara opsional network-online.target
.
Layanan manajemen jaringan berbasis skrip sederhana harus menyelesaikan konfigurasi jaringan sebelum keluar dan harus memesan sendiri sebelum network.target
dan dengan demikian secara tidak langsung sebelumnya network-online.target
.
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Layanan manajemen jaringan berbasis daemon juga harus memesan sendiri sebelumnya network.target
meskipun itu tidak terlalu berguna.
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
Layanan yang menunggu untuk selesai daemon harus memesan sendiri setelah layanan khusus dan sebelumnya network-online.target
. Ini harus digunakan Requisite
pada layanan daemon sehingga gagal segera jika layanan manajemen jaringan masing-masing tidak digunakan.
[Unit]
Requisite=...
After=...
Before=network-online.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Paket harus menginstal symlink ke layanan tunggu di wants
direktori network-online.target
agar ditarik oleh layanan yang ingin menunggu jaringan yang dikonfigurasi.
ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/
Dokumentasi terkait
Catatan akhir
Saya harap saya tidak hanya membantu menjawab pertanyaan Anda pada saat Anda menanyakannya, tetapi juga berkontribusi untuk memperbaiki situasi di distribusi hulu dan Linux, sehingga saya sekarang dapat memberikan jawaban yang lebih baik daripada yang mungkin pada saat penulisan yang asli .