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 .
no-auto-default
, hanyaauto
. Apakah Anda memiliki pertanyaan spesifik? Menurut pendapat saya, manual nm-online menyatakan dengan jelas bahwa dengan-s
itu menunggu semua koneksi otomatis dicoba, yaitu terhubung atau gagal./etc/init.d/network
atau serupa tetapi itu tidak berfungsi secara universal.Anda dapat menggunakan
After
dalam[Unit]
bagian ini untuk menentukan layanan yang harus dimulai sebelum layanan Anda dimulai. Misalnya jika Anda menggunakan NetworkManager, Anda dapat membuat layanan Anda dimulai setelah NetworkManager dimulai.sumber
BindsTo
tidak begitu tepat di sini karena layanan ini merupakan peristiwa satu kali dan bukan layanan yang terus-menerus (kecuali itu juga termasukExecStop
fitur untuk memecat ketika jaringan turun).BindsTo
BindsTo
, misalnyaRequires
, jika Anda hanya ingin layanan berjalan jika NetworkManager melakukannya.After
tidak benar-benar melakukan itu - itu hanya berarti jika NM juga berjalan, kemudian jalankan ini sesudahnya. Jika NM tidak akan dijalankan, layanan akan dijalankan pada titik arbitrer.After=foo
akan menyebabkan unit untuk memulai jika belum dimulai, itu hanya akan memberi tahu systemd bagaimana cara memesan unit jika keduanya dimulai pada waktu yang sama . Menggunakan kedua serta atau akan memiliki efek menarik di jika tidak dimulai, dan juga membuat pesanan systemd unit dengan benar.foo
After=foo
Wants=foo
Requires=foo
foo
Jika layanan Anda menyediakan server, yang dapat menunggu secara pasif bagi seseorang untuk terhubung, gunakan ini:
Layanan Anda harus mengikat pada antarmuka wildcard. Jika menggunakan aktivasi soket (disarankan), atau hanya lokal, Anda dapat mengabaikan target jaringan sepenuhnya.
Jika layanan Anda bertindak sebagai klien, atau peer to peer, ini lebih tepat:
Sebelum systemd 213 , network-online.target membutuhkan solusi yang disebutkan Pavel (Anda harus secara manual mengaktifkan layanan yang akan menunggu jaringan untuk dinyalakan). Pada systemd 213 ini dilakukan secara default.
systemd-networkd-wait-online
akan menunggu setidaknya satu alamat (baik routable atau link-local) untuk dikonfigurasi pada antarmuka non-loopback.Mengkonfigurasi systemd-networkd, NetworkManager atau yang setara adalah tugas yang independen. DHCP (untuk IPv4) dan NDP (untuk IPv6) cenderung bekerja di luar kotak, tetapi Anda harus mengonfigurasinya sehingga definisi tepat Anda tentang "jaringan sudah habis" adalah pemicu
network-online.target
.Dokumentasi:
sumber
Itu akan memiliki efek sebaliknya dari apa yang Anda inginkan. Dari
man systemd.unit
:Berdasarkan ini, kita dapat melihat opsi unit yang tepat adalah "Mau" atau "Membutuhkan"; berdasarkan deskripsi dari mereka, "Membutuhkan" mungkin benar, dengan penambahan "Setelah" untuk memastikan tidak hanya bahwa layanan jaringan dijalankan, tetapi bahwa itu berjalan sebelum unit ini.
Tak satu pun dari opsi unit, AFAIK, dapat mencakup ketentuan bahwa persyaratan awal yang harus dipenuhi, atau mencapai titik tertentu (jaringan mungkin merupakan layanan daemon), hanya yang memulai lebih dulu. Dengan mengingat hal ini, Anda mungkin ingin membuat skrip
Type=forking
dan melakukan penundaan yang sehat (katakanlah 30 detik), atau semacam loop keluar-sukses termasuk penundaan, untuk memastikan bahwa Anda memiliki sewa DHCP terlebih dahulu.sumber
After
dalam hubungannya denganRequires
"untuk memastikan tidak hanya bahwa layanan jaringan dijalankan, tetapi juga dijalankan sebelum unit ini".After
bekerja sama denganWants
atau denganRequires
cara itu. Di sisi lain penundaan eksplisit adalah kebiasaan buruk dalam alat berbasis ketergantungan, terutama ketika ada cara eksplisit untuk menunggu sampai jaringan dikonfigurasi ditentukan oleh dokumentasi systemd, jadi saya harus bersikeras pada downvote.Gunakan
After
di[Unit]
bagian ini untuk menentukan apa yang harus dimulai sebelum layanan Anda sendiri. (Ini banyak dari jawaban sebelumnya yang benar.)Untuk memulai layanan Anda setelah jaringan naik, gunakan target jaringan, yang seharusnya berlaku apakah Anda menggunakan NetworkManager, sistem conf.d / netctl di Arch, atau layanan lain yang disadari oleh systemd.
Pandangan singkat akan mengonfirmasi bahwa setiap layanan lain di sistem Anda yang bergantung pada konektivitas jaringan mengandung arahan ini.
Ia juga portabel untuk distribusi apa pun yang menggunakan systemd. File unit Anda akan sama untuk Arch, Fedora, RHEL 7, versi Debian yang akan datang ...
Layanan yang memulai koneksi jaringan, seperti skrip Arch atau milik Anda, harus menentukannya dalam file unit mereka sendiri .
sumber
Wants
bagian itu karena memiliki efek samping pada paket lain. Tolong lihat jawaban saya.Wants
dinetwork.target
adalah ide yang baik di sini.Saya ingin menambahkan satu poin pada artikel ini. Saat ini (musim panas 2015) di RHEL7 / CentOS 7, network-online.target salah diatur sebelum jaringan IPv6 dinyalakan, jadi daemon yang memiliki
dalam definisi layanan mereka yang juga secara eksplisit mengikat ke alamat IPv6 mungkin akan dimulai sebelum IPv6 aktif dan berjalan, menyebabkan mereka gagal.
sumber
/etc/init.d/network
. Jika Anda mendapatkan masalah yang sama bahkan dengan NM, maka itu akan menjadi alasan yang bagus untuk mengajukan permintaan fitur. Saya belum memeriksa dengan RHEL / CentOS, saya dapat membantu Anda dengan detailnya jika Anda tertarik.bekerja untukku.
sumber
networkd
menyediakan sendiri / tunggu-online / layanan. Menarik dan memesan setelahnetwork-online.target
adalah cara yang tepat untuk pergi dengan layanan apa pun yang mendukung itu.