Debian systemd network-online.target ไม่ทำงาน?


24

ฉันกำลังพยายามสร้างบริการ systemd บน Debian Jessie ฉันต้องการมันเพื่อเริ่มต้นหลังจากnetwork-online.targetถึง

ปัญหาคือnetwork-online.targetไฟไหม้ในเวลาเดียวกันเป็นnetwork.targetและในเวลานั้นอินเทอร์เฟซของฉันยังไม่ได้กำหนดค่าเพียงแค่เริ่มแบบสอบถาม DHCP

ดูเหมือนว่าปัญหานี้เป็นปัญหาเฉพาะของ Debian เนื่องจากใช้การกำหนดค่าเครือข่ายดั้งเดิม

วิธีหลีกเลี่ยงปัญหานี้หรือวิธีการnetwork-online.targetทำงานอย่างไร


ผลลัพธ์ของsystemctl list-dependencies network-online.targetอะไร นอกจากนี้โปรดทราบว่าnetwork-online.targetอาจไม่จำเป็นหมายความว่ามีการเข้าถึงอินเทอร์เน็ต ดูหน้านี้สำหรับข้อมูลเพิ่มเติม
saiarcot895

ผลลัพธ์ของคำสั่งคือ: network-online.target ● └─systemd-networkd-wait-online.service ฉันได้อ่านหน้านั้นแล้วฉันเข้าใจแนวคิดพื้นฐานที่นั่น แต่ก็ยังแปลกมากที่ไม่มีจุดกำหนดที่สามารถเริ่มบริการสำคัญของเครือข่ายได้ อย่างน้อยก็สามารถรอการกำหนด DHCP ที่เหมาะสม
10robinho

ซึ่งหมายความว่าnetwork-online.targetขึ้นอยู่กับการsystemd-networkd-wait-online.serviceบอกว่าพร้อมแล้วเท่านั้น ไม่ได้ขึ้นอยู่กับ NetworkManager ว่าพร้อมหรือไม่ตรวจสอบว่ามีการifupเชื่อมโยงทั้งหมดเรียบร้อยแล้ว (ถ้าคุณใช้วิธีการนั้นเพื่อกำหนดค่าเครือข่ายของคุณ) อูบุนตูในมืออื่น ๆ ขึ้นอยู่กับifupและ NetworkManager systemd-networkd-wait-online.แต่ไม่ได้สำหรับ
saiarcot895

คุณกำหนดค่าเครือข่ายของคุณอย่างไร: ไฟล์/etc/network/interfacessystemd .networkหรือ NetworkManager
saiarcot895

คุณมีสิทธิnetwork-online.targetและจะมีการหารือทันทีหลังจากnetwork.target ifupฉันใช้ค่าเริ่มต้น debian ดังนั้น/etc/network/interfacesด้วยที่อยู่ dhcp ดูเหมือนว่า networkd อาจเป็นทางออกที่ดีกว่า แต่ก็ไม่ง่ายที่จะนำไปใช้
10robinho

คำตอบ:


18

เมื่อคุณใช้/etc/network/interfacesงานคุณจะต้องใช้บริการ systemd เพื่อตรวจสอบสถานะของแต่ละอินเตอร์เฟส ตรวจสอบเพื่อดูว่าคุณมี/lib/systemd/system/ifup-wait-all-auto.service(ติดตั้งโดยifupdownแพคเกจใน Ubuntu 15.04) ถ้าไม่ใช่ให้สร้าง/etc/systemd/system/ifup-wait-all-auto.serviceและวางในสิ่งต่อไปนี้:

[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

นี่คือไฟล์บริการที่มีอยู่ในระบบ Ubuntu 15.04 แต่ด้วย[Install]ส่วนที่เพิ่มเข้ามาเพื่อทำให้สิ่งต่าง ๆ ง่ายขึ้นเล็กน้อย ฉันหวังว่าพฤติกรรมของifupใน Ubuntu 15.04 จะเหมือนกับพฤติกรรมของifupใน Debian Jessie หากไม่มีการแก้ไขจะมีความจำเป็น (โดยเฉพาะอย่างยิ่งกับบรรทัดสุดท้าย)

sudo systemctl enable ifup-wait-all-auto.serviceจากนั้นเรียกใช้ หลังจากรีบูตคอมพิวเตอร์ของคุณคุณจะเห็นว่าnetwork-online.targetถึงหลังจากที่อินเทอร์เฟซถูกนำขึ้นมา (อย่างน้อย)


ขอบคุณสำหรับความพยายามให้ฉันลองตอนนี้และฉันจะให้ข้อเสนอแนะ
10robinho

ฉันลงเอยด้วยเวอร์ชันที่แก้ไขเล็กน้อยExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'แล้ว มันขึ้นอยู่กับhostnameการตรวจสอบว่าที่อยู่ IP ได้รับมอบหมาย
luka5z

อย่าลองหมุนหมอ ไม่ใช่เพราะเขาใช้ / etc / network / interfaces มันเป็นเพราะ systemd นั้นเลอะเทอะมากและงานก็ถูกส่งไปยังผู้ใช้ทุกคนแทนที่จะแก้ปัญหาที่มันถูกสร้างขึ้น
Florian Heigl

1
fwiw, ifup-wait-all-auto.serviceถูกดร็อปในifupdownเวอร์ชัน0.8.5ubuntu1: ” ปล่อย ifup-wait-all-auto.service สิ่งนี้ได้ถูกนำไปใช้อย่างหรูหรายิ่งขึ้นโดยทำให้ network-online.target Wants = networking.service โดยตรง " [changelog ]
myrdd

0

ความสนใจ! แค่คิดออกใน Raspbian Jessie: ลบบรรทัดที่มีความคิดเห็นทั้งหมดใน / etc / network interface และมันจะทำงาน! ดูเหมือนว่าจะเป็นข้อผิดพลาดในการแยกวิเคราะห์ =) ในกรณีเฉพาะของฉันฉันได้แสดงความคิดเห็นiface eth0 inet dhcpและเพิ่งลืมไปเมื่อวานนี้ แต่หลังจากอัปเกรดเป็น Raspbian Jessie แล้วสร้างเคอร์เนลฉันมีพฤติกรรมแปลก ๆ : ใช้ DHCP และปฏิเสธที่จะ ทำการปรับจูนจาก / etc / network / interfaces ดังนั้นฉันจึงถอดมันออกจากความคิดเห็นใด ๆ - เพียงแค่ทำงานในสายรีบูต - และมันใช้งานได้! ไม่มีการจับแพทช์สคริปต์ / การแก้ไขที่จำเป็น!


ที่น่าสนใจฉันต้องลองสิ่งนี้ แม้ว่าจะไม่ได้ทำให้รู้สึกมาก :)
10robinho

2
คุณมีข้อมูลอ้างอิงเกี่ยวกับเรื่องนี้หรือไม่? ฉันต้องการอ่านรายงานข้อผิดพลาดและดูโค้ดบั๊กกี้
ʇsәɹoɈ

ไม่ฉันไม่ได้เปิดตั๋วบั๊ก ในการทำซ้ำเพียงเพิ่มความคิดเห็นใน/etc/network/interfacesไฟล์ของคุณ- มันจะเริ่มทำงานหากยังมีอยู่
Alexey Vesnin

0

ต่อhttps://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/วิธีที่แนะนำให้เริ่มต้นการให้บริการหลังการเครือข่ายระดับคือการใช้ " network-online.target " ใน.serviceไฟล์:

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

อย่างไรก็ตามหลังจากใช้ " network-online.target " และบริการของฉันล้มเหลวเนื่องจากระบบเครือข่ายยังไม่สมบูรณ์ฉันพบว่ามีข้อผิดพลาด ( https://github.com/coreos/bugs/issues/1966 ) กับมัน: ไม่รับประกันว่าจะ ถูกต้อง 100%

แท้จริงแล้วที่เครื่องมือการกำหนดค่าเครือข่ายแบบไดนามิกเช่น " NetworkManager " ถูกนำมาใช้ในกรณีนี้สถานะของเครือข่ายจะไม่แม่นยำหรือคาดการณ์ได้ 100% เห็นได้ชัดจากลิงก์ที่อธิบายข้อผิดพลาด " network-online.target " สามารถทำงานได้อย่างไม่สอดคล้องกันขึ้นอยู่กับแอปพลิเคชันต่างๆที่ใช้

วิธีแก้ปัญหา :
คุณต้องวิเคราะห์ลำดับการเริ่มต้นบริการและใช้รายการที่เริ่มต้นช้ากว่า " network-online.target ":

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

นี่เป็นกระบวนการที่วนซ้ำเพื่อเปลี่ยนเป้าหมายที่เพิ่มขึ้นเป็นบริการในภายหลังและหลังจากนั้นจนกว่าคุณจะพบระบบที่มั่นใจได้ว่าเครือข่ายอยู่ในระดับและบริการของคุณจะเริ่มโดยไม่มีข้อผิดพลาด ในกรณีของตัวเองฉันต้องใส่sleep 10ในสคริปต์ของฉันบริการ SystemD เรียกว่า


0

ฉันเคยพบคำตอบใน Githubที่แก้ไขได้โดยพยายาม ping เซิร์ฟเวอร์อย่างต่อเนื่อง เมื่อ ping ผ่านมาบริการจะดำเนินต่อไป:

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

ฉันแทนที่google.comด้วยเซิร์ฟเวอร์ของตัวเองเพราะสคริปต์หลักของฉันจำเป็นต้องเชื่อมต่อกับเซิร์ฟเวอร์ของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.