Debian systemd network-online.target tidak berfungsi?

24

Saya mencoba membuat layanan systemd di Debian Jessie. Saya perlu memulai setelah network-online.targettercapai.

Masalahnya adalah network-online.targetkebakaran pada saat yang sama network.targetdan pada saat itu antarmuka saya belum dikonfigurasi, baru saja mulai permintaan DHCP.

Sepertinya masalah ini khusus untuk Debian karena menggunakan konfigurasi jaringan lawas.

Bagaimana cara memintas masalah ini atau bagaimana membuatnya network-online.targetbekerja?

10robinho
sumber
Apa output dari systemctl list-dependencies network-online.target? Juga, perhatikan bahwa network-online.targetmungkin tidak perlu berarti ada akses Internet. Lihat halaman ini untuk info lebih lanjut.
saiarcot895
Output dari perintah ini adalah: network-online.target ● └─systemd-networkd-wait-online.service Saya sudah membaca halaman itu, saya mengerti konsep dasar di sana, tetapi masih sangat aneh untuk tidak memiliki titik yang ditentukan di mana layanan jaringan kritis dapat dimulai. Setidaknya itu bisa menunggu penetapan DHCP yang tepat.
10robinho
Ini berarti bahwa network-online.targethanya tergantung pada systemd-networkd-wait-online.servicepepatah bahwa itu sudah siap. Itu tidak tergantung pada NetworkManager yang mengatakan itu sudah siap, atau memeriksa apakah ifupsemua tautan berhasil ditampilkan (jika Anda menggunakan metode itu untuk mengonfigurasi jaringan Anda). Ubuntu, di sisi lain, tergantung pada ifupdan NetworkManager, tetapi tidak untuk systemd-networkd-wait-online..
saiarcot895
Bagaimana Anda mengkonfigurasi jaringan Anda /etc/network/interfaces:, .networkfile systemd , atau NetworkManager?
saiarcot895
Anda benar, network-online.targetdan network.targetdipicu setelahnya ifup. Saya menggunakan default debian, jadi /etc/network/interfacesdengan alamat dhcp. Sepertinya networkd bisa menjadi solusi yang lebih baik, tetapi tidak mudah untuk diterapkan.
10robinho

Jawaban:

18

Karena Anda menggunakan /etc/network/interfaces, Anda akan memerlukan layanan systemd untuk memantau status setiap antarmuka. Periksa untuk melihat apakah Anda telah /lib/systemd/system/ifup-wait-all-auto.service(diinstal oleh ifupdownpaket di Ubuntu 15.04). Jika tidak, maka buat /etc/systemd/system/ifup-wait-all-auto.service, dan tempel berikut ini:

[Unit]
Description=Wait for all "auto" /etc/network/interfaces to be up for network-online.target
Documentation=man:interfaces(5) man:ifup(8)
DefaultDependencies=no
After=local-fs.target
Before=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=2min
ExecStart=/bin/sh -ec '\
  for i in $(ifquery --list --exclude lo --allow auto); do INTERFACES="$INTERFACES$i "; done; \
  [ -n "$INTERFACES" ] || exit 0; \
  while ! ifquery --state $INTERFACES >/dev/null; do sleep 1; done; \
  for i in $INTERFACES; do while [ -e /run/network/ifup-$i.pid ]; do sleep 0.2; done; done'

[Install]
WantedBy=network-online.target

Ini adalah file layanan yang ada pada sistem Ubuntu 15.04, tetapi dengan [Install]bagian yang ditambahkan untuk membuat segalanya lebih mudah. Saya berharap perilaku ifupdi Ubuntu 15.04 sama dengan perilaku ifupdi Debian Jessie. Jika tidak, beberapa modifikasi akan diperlukan (terutama dengan baris terakhir).

Lalu, jalankan sudo systemctl enable ifup-wait-all-auto.service. Setelah mem-boot ulang komputer Anda, Anda akan melihat bahwa network-online.targettercapai setelah antarmuka dinyalakan (setidaknya).

saiarcot895
sumber
Terima kasih atas usaha, izinkan saya mencobanya sekarang dan saya akan memberi Anda umpan balik
10robinho
Saya akhirnya menjalankan versi yang sedikit dimodifikasi ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'. Tergantung hostnameuntuk memeriksa apakah alamat IP telah ditetapkan.
luka5z
Jangan coba memutar dokter itu. itu bukan karena dia menggunakan / etc / network / interfaces. Itu karena systemd sangat ceroboh dan pekerjaan diturunkan ke setiap pengguna alih-alih memecahkan masalah di mana ia dibuat.
Florian Heigl
1
fwiw, ifup-wait-all-auto.servicetelah dijatuhkan dalam ifupdownversi 0.8.5ubuntu1: "Drop ifup-wait-all-auto.service. Ini telah diimplementasikan lebih elegan dengan membuat network-online.target Ingin = networking.service secara langsung. “ [
Changelog
0

Perhatian! Baru saja mengetahuinya pada Raspbian Jessie: hapus SEMUA baris komentar di / etc / network interfaces dan itu akan berfungsi! Tampaknya menjadi parsing bug =) Dalam kasus khusus saya, saya telah meninggalkan komentar iface eth0 inet dhcpdan baru saja melupakannya beberapa tahun yang lalu, tetapi setelah upgrade ke Raspbian Jessie dan membangun kembali kernel, saya memiliki perilaku yang sangat aneh: ia menggunakan DHCP dan menolak untuk buat tuning dari / etc / network / interfaces. Jadi saya telah menghapusnya dari komentar - hanya bekerja, reboot - dan itu berfungsi! TIDAK DIBUTUHKAN PERJALANAN / PENGAJUAN SCRIPT!

Alexey Vesnin
sumber
Yang menarik, saya perlu mencoba ini. Meskipun tidak masuk akal :)
10robinho
2
Apakah Anda punya referensi tentang ini? Saya ingin membaca laporan bug dan melihat kode buggy.
ʇsәɹoɈ
Tidak, saya belum membuka tiket bug. Untuk mereproduksinya cukup tambahkan beberapa komentar di /etc/network/interfacesfile Anda - itu akan menyala jika masih ada.
Alexey Vesnin
0

Per https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ cara yang disarankan untuk memulai layanan SETELAH jaringan tingkat adalah dengan menggunakan " network-online.target " dalam file .service :

 "After=network-online.target"
 "Wants=network-online.target"

Namun setelah menggunakan " network-online.target " dan layanan saya gagal karena jaringan tidak sepenuhnya level, saya menemukan ada bug ( https://github.com/coreos/bugs/issues/1966 ) dengan itu: tidak dijamin untuk menjadi 100% sempurna.

Memang, di mana alat konfigurasi jaringan dinamis seperti " NetworkManager " digunakan seperti dalam kasus ini, keadaan jaringan tidak pernah bisa 100% tepat atau dapat diprediksi. Rupanya dari tautan yang menggambarkan bug, " network-online.target " dapat berperilaku tidak konsisten tergantung pada berbagai aplikasi yang digunakannya.

Penanganan masalah :
Anda perlu menganalisis urutan layanan start-up dan menggunakan yang memulai lebih lambat dari " network-online.target ":

 systemd-analyze plot > /home/pi/graph.svg

Ini adalah proses berulang mengubah target secara bertahap ke layanan nanti dan kemudian sampai Anda menemukan satu yang memastikan jaringan tingkat dan layanan Anda mulai tanpa kesalahan. Dalam kasus saya sendiri, saya bahkan harus memasukkan sleep 10skrip saya ke dalam layanan SystemD.

F1Linux
sumber
0

Saya pernah menemukan jawaban pada Github yang menyelesaikannya dengan terus mencoba melakukan ping ke server. Hanya ketika ping masuk, layanan berlanjut:

[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
ExecStart=<your command>

Saya diganti google.comdengan server saya sendiri karena skrip utama saya perlu terhubung ke server saya.

Sam
sumber