Debian systemd network-online.target çalışmıyor mu?


24

Debian Jessie'de bir sistem servisi oluşturmaya çalışıyorum. Ulaşıldıktan sonra başlamak için ihtiyacım var network-online.target.

Sorun network-online.targetaynı zamanda ve aynı zamanda yangın network.targetolduğunu benim arayüzler henüz yapılandırılmamış, sadece DHCP sorgusu başladı.

Bu sorun Debian'a özgü görünüyor, çünkü eski ağ yapılandırmasını kullanıyor.

Bu sorun nasıl atlanır veya nasıl network-online.targetçalışılır?


Çıktı nedir systemctl list-dependencies network-online.target? Ayrıca, network-online.targetgerekli olmayabilir İnternet erişimi olduğu anlamına geldiğini unutmayın . Daha fazla bilgi için bu sayfaya bakın .
saiarcot895

Komutun çıktısı: network-online.target ● └─systemd-networkd-wait-online.service Bu sayfayı zaten okudum, orada temel kavramı anladım, ancak yine de ağ kritik servislerinin başlayabileceği tanımlanmış bir noktaya sahip olmamak çok garip. En azından uygun DHCP ataması için bekleyebilirdi.
10robinho,

Bu, network-online.targetyalnızca systemd-networkd-wait-online.servicehazır olduğunu söylemeye bağlı olduğu anlamına gelir . NetworkManager'ın hazır olduğunu söylemeye bağlı değildir ve ifuptüm bağlantıların başarıyla yapıldığını kontrol etmeyin (ağınızı yapılandırmak için bu yöntemi kullanıyorsanız). Ubuntu, diğer taraftan, bağlıdır ifupve NetworkManager'a bağlıdır , ancak değildir systemd-networkd-wait-online..
saiarcot895

/etc/network/interfacesAğınızı nasıl yapılandırıyorsunuz: sistem .networkdosyaları veya Ağ Yöneticisi?
saiarcot895

Haklısın network-online.targetve network.targethemen sonra tetikleniyorsun ifup. Debian default kullanıyorum, bu yüzden /etc/network/interfacesdhcp adresi ile. Ağın daha iyi bir çözüm olabileceği görülüyor, ancak uygulanması kolay değil.
10robinho

Yanıtlar:


18

Kullandığınız yana /etc/network/interfaces, her arabiriminin durumunu izlemek için bir systemd hizmetini gerekir. Bakıp kullanmadığınızı kontrol edin /lib/systemd/system/ifup-wait-all-auto.service( ifupdownpaket tarafından Ubuntu 15.04'te kurulmuş). Değilse /etc/systemd/system/ifup-wait-all-auto.service, aşağıdakileri oluşturun ve yapıştırın:

[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

Bu, Ubuntu 15.04 sisteminde mevcut olan servis dosyasıdır, ancak [Install]işleri biraz daha kolaylaştırmak için eklenen bölüm bulunmaktadır. ifup15.04 Ubuntu'daki davranışların ifupDebian Jessie'deki davranışlarla aynı olmasını umuyorum . Aksi takdirde, bazı değişiklikler gerekli olacaktır (özellikle son satırda).

Ardından koşun sudo systemctl enable ifup-wait-all-auto.service. Bilgisayarınızı yeniden network-online.targetbaşlattıktan sonra, arabirimlerin açılmasından sonra (en azından) ulaşıldığını görmelisiniz .


Çaba için teşekkürler, şimdi deneyeyim ve geri bildirim vereyim
10robinho

Biraz değiştirilmiş versiyonu çalıştırdım ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'. hostnameIP adresinin atanmış olup olmadığını kontrol etmeye bağlıdır .
luka5z

Doktoru döndürmeyi denemeyin. çünkü / etc / network / interfaces kullanıyor. Bunun nedeni systemd'nin özensiz olması ve işin yaratıldığı sorunu çözmek yerine her kullanıcıya boşaltılmasıdır.
Florian Heigl

1
fwiw, versiyonunda ifup-wait-all-auto.servicedüşürüldü : ”Bırak ifup-wait-all-auto.service. . Bu “networking.service doğrudan = network-online.target istediğini yaparak daha zarif uygulamaya konmuştur [changelog ]ifupdown0.8.5ubuntu1
myrdd

0

Dikkat! Sadece bir Raspbian Jessie'den anladım: / etc / network arayüzlerinde TÜM yorumlu satırları kaldırın ve işe yarayacak! Bir ayrıştırma hatası gibi görünüyor =) Özel durumumda yorum bıraktım iface eth0 inet dhcpve sadece eonlar önce unuttum, ancak Raspbian Jessie'ye yükselttikten ve bir çekirdeği yeniden inşa ettikten sonra çok garip davrandım: DHCP kullandı ve reddetti / etc / network / interfaces'ten bir ayar yapın. Bu yüzden herhangi bir yorumdan çıkardım - sadece çalışma çizgileri, yeniden başlatma - ve işe yarıyor! HİÇBİR YAZMA / EDİTLEME GEREK YOK!


Interestin, bunu denemeliyim. Çok mantıklı
gelmese de

2
Bununla ilgili referansın var mı? Hata raporlarını okumak ve buggy kodunu görmek istiyorum.
ɈsәɹoɈ

Hayır, böcek bileti açmadım. Çoğaltmak için sadece /etc/network/interfacesdosyanıza bazı yorumlar ekleyin - hala oradaysa ateşlenecektir.
Alexey Vesnin

0

Başına https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ bir hizmeti başlatmak için tavsiye edilen bir yol SONRA ağ seviyesidir "kullanmaktır network-online.target içinde" .service dosyası:

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

Ancak " network-online.target " kullandıktan sonra ve ağım tamamen düz olmadığından servisim başarısız oluyor, bununla ilgili bir hata olduğunu keşfettim ( https://github.com/coreos/bugs/issues/1966 ): % 100 yanılmaz olmak.

Aslında, " NetworkManager " gibi dinamik ağ konfigürasyon araçlarının bu durumda kullanıldığı gibi, ağ durumunun hiçbir zaman% 100 kesin veya tahmin edilebilir olması mümkün değildir. Anlaşılan hatayı açıklayan bağlantıdan " network-online.target ", kullanıldığı farklı uygulamalara bağlı olarak tutarsız davranabilir.

Geçici çözüm :
Hizmetlerin başlangıç ​​sırasını analiz etmeniz ve " network-online.target " öğesinden daha sonra başlayan bir hizmet kullanmanız gerekir :

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

Bu, ağ kurmanın düz olmasını ve hizmetinizin hatasız bir şekilde başlamasını sağlayana kadar hedefleri aşamalı olarak sonraki ve sonraki servislere değiştiren yinelemeli bir işlemdir. Kendi durumumda bile sleep 10, SystemD servisinin çağırdığı betiğime yazmam gerekti.


0

Bir keresinde Github'da sürekli olarak bir sunucuya ping yapmaya çalışarak bir cevap buldum . Yalnızca ping geldiğinde servis devam eder:

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

google.comAna betiğimin sunucuma bağlanması gerektiğinden kendi sunucumla değiştirdim .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.