ในการพึ่งพาการกำหนดค่าเครือข่าย systemd
มันง่ายมากที่จะส่งผลกระทบต่อการสั่งซื้อหน่วยของ systemd ในอีกทางหนึ่งคุณต้องระวังเกี่ยวกับสิ่งที่รับประกันว่าจะเสร็จสมบูรณ์
กำหนดค่าบริการของคุณ
ในระบบปัจจุบันการสั่งซื้อหลังจากnetwork.target
เพิ่งรับประกันได้ว่าบริการเครือข่ายได้เริ่มขึ้นแล้วไม่ใช่ว่ามีการกำหนดค่าจริงบางอย่าง คุณต้องสั่งซื้อหลังจากนั้นnetwork-online.target
และดึงมันเข้าไปเพื่อให้บรรลุ
[Unit]
Wants=network-online.target
After=network-online.target
เพื่อความเข้ากันได้กับระบบเก่าคุณอาจต้องสั่งซื้อหลังจาก network.target เช่นกัน
[Unit]
Wants=network-online.target
After=network.target network-online.target
นั่นคือไฟล์หน่วยบริการของคุณและสำหรับ systemd
การติดตั้งซอฟต์แวร์เวอร์ชันปัจจุบัน
ตอนนี้คุณต้องแน่ใจว่าใช้network-online.target
งานได้ตามที่คาดไว้ (หรืออย่างน้อยคุณก็สามารถใช้งานได้network.target
)
NetworkManagerเวอร์ชันปัจจุบันเสนอสิ่งNetworkManager-wait-online.service
ที่ถูกดึงเข้ามาnetwork-online.target
ด้วยบริการของคุณ บริการพิเศษนี้ช่วยให้มั่นใจว่าบริการของคุณจะรอจนกว่าการเชื่อมต่อทั้งหมดที่กำหนดค่าให้เริ่มต้นจะสำเร็จโดยอัตโนมัติล้มเหลวหรือหมดเวลา
เวอร์ชันปัจจุบันของsystemd-networkdบล็อกบริการของคุณจนกว่าอุปกรณ์ทั้งหมดจะได้รับการกำหนดค่าตามที่ร้องขอ มันง่ายกว่าที่จะรองรับการกำหนดค่าที่ใช้ในเวลาบูตเท่านั้น (โดยเฉพาะเวลาเริ่มต้นของ `systemd-networkd.service)
เพื่อความสมบูรณ์/etc/init.d/network
บริการใน Fedora ที่ตีความโดย systemd รุ่นปัจจุบันบล็อกnetwork.target
และบล็อกทางอ้อมnetwork-online.target
และบริการของคุณ นี่เป็นตัวอย่างของการใช้งานสคริปต์
หากการติดตั้งของคุณไม่ว่าจะเป็น daemon หรือตามสคริปต์จะทำงานเป็นหนึ่งในบริการการจัดการเครือข่ายด้านบนก็จะชะลอการเริ่มต้นบริการของคุณจนกว่าการกำหนดค่าเครือข่ายจะเสร็จสมบูรณ์สำเร็จล้มเหลวด้วยเหตุผลที่ดีหรือหมดเวลา เฟรมให้เสร็จสมบูรณ์
คุณอาจต้องการตรวจสอบว่าnetctlทำงานในลักษณะเดียวกันหรือไม่และข้อมูลนั้นจะเป็นส่วนเสริมที่สำคัญสำหรับคำตอบนี้หรือไม่
การใช้งานในซอฟต์แวร์รุ่นเก่า
ฉันไม่คิดว่าคุณจะเห็น systemd เวอร์ชันเก่าพอที่จะทำงานได้ไม่ดี แต่คุณสามารถตรวจสอบว่าอย่างน้อยnetwork-online.target
มีอยู่และได้รับคำสั่งหลังจากnetwork.target
นั้น
ก่อนหน้าNetworkManagerรับประกันได้ว่าจะมีการเชื่อมต่ออย่างน้อยหนึ่งการเชื่อมต่อ และแม้กระทั่งการทำงานคุณก็ต้องเปิดใช้งานNetworkManager-wait-online.service
อย่างชัดเจน สิ่งนี้ได้รับการแก้ไขใน Fedora มานาน แต่เพิ่งจะใช้กับต้นน้ำ
systemctl enable NetworkManager-wait-online.service
หมายเหตุเกี่ยวกับการใช้งาน network.target และ network-online.target
คุณไม่จำเป็นต้องทำให้ซอฟต์แวร์ของคุณขึ้นอยู่กับNetworkManager.service
หรือNetworkManager-wait-online.service
ไม่หรือบริการเฉพาะอื่น ๆ แต่ทุกบริการจัดการเครือข่ายควรสั่งตัวเองก่อนและเลือกnetwork.target
network-online.target
บริการจัดการเครือข่ายตามสคริปต์ง่ายควรจะเสร็จสิ้นการกำหนดค่าเครือข่ายก่อนที่จะออกและควรสั่งตัวเองก่อนและทำให้ทางอ้อมก่อนnetwork.target
network-online.target
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
บริการการจัดการเครือข่ายบน daemon ควรสั่งซื้อเองก่อนnetwork.target
แม้ว่าจะไม่มีประโยชน์มาก
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
บริการที่รอให้ daemon เสร็จสิ้นควรสั่งตัวเองหลังจากบริการที่เฉพาะเจาะจงและก่อนหน้าnetwork-online.target
นี้ ควรใช้Requisite
กับบริการ daemon เพื่อให้ล้มเหลวทันทีหากไม่ได้ใช้บริการการจัดการเครือข่ายที่เกี่ยวข้อง
[Unit]
Requisite=...
After=...
Before=network-online.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
แพคเกจควรติดตั้ง symlink ไปยังบริการที่รอในwants
ไดเรกทอรีnetwork-online.target
เพื่อที่จะได้รับการดึงโดยบริการที่ต้องการรอเครือข่ายที่กำหนดค่า
ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/
เอกสารที่เกี่ยวข้อง
บันทึกสุดท้าย
ฉันหวังว่าฉันไม่เพียง แต่ช่วยตอบคำถามของคุณในเวลาที่คุณถามเท่านั้น แต่ยังช่วยปรับปรุงสถานการณ์ในการกระจายอัปสตรีมและ Linux เพื่อให้ฉันสามารถให้คำตอบที่ดีกว่าตอนที่เขียนต้นฉบับ .