วิธีเริ่มบริการ systemd ก่อนเริ่มระบบเครือข่าย


11

ฉันกำลังพยายามตั้งค่าบริการใหม่ (ภายใต้ Debian Jessie) ที่ต้องตั้งค่าการติดตั้งบางอย่างที่จัดเก็บการกำหนดค่าเครือข่ายและบริการนี้จะต้องเสร็จสิ้นก่อนที่จะเริ่มระบบเครือข่ายบริการ

ฉันพยายามต่อไปนี้:

[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
#Before=network-pre.target
Before=networking.service

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=networking.service

การใช้systemd-analyze plotฉันเห็นว่าบริการของฉันเริ่มทำงาน แต่networking.serviceเริ่มประมาณ 3 วินาทีก่อนหน้า:

ป้อนคำอธิบายรูปภาพที่นี่

เห็นได้ชัดว่าการตั้งค่าของฉันผิด แต่ฉันมีปัญหาในการค้นหาปัญหา ... ความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก ..

ปรับปรุง

ขณะนี้ฉันแก้ไขได้โดยเปลี่ยนการกำหนดค่าบริการให้เริ่มก่อนlocal-fs.targetแทนnetworking.service:

[Unit]
DefaultDependencies=no
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
Before=local-fs.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=local-fs.target

ยังฉันต้องการที่จะเข้าใจว่าทำไมการกำหนดค่าครั้งแรกของฉันไม่ทำงานตามที่คาดไว้ ... ?


เนื่องจากวิธีการทำงานของ systemd ลำดับตัวอักษรที่สิ่งต่าง ๆ ทำงานอาจไม่สำคัญ เมื่อระบบเครือข่ายเกิดขึ้นมันจะสำเร็จตามไฟล์ในไดเรกทอรีนั้นหรือไม่?
Tom Hunt

ฉันไม่แน่ใจว่าฉันเข้าใจคำถามของคุณหรือไม่ อย่างไรก็ตาม/etc/network/interfacesมีการอ้างอิงถึงip-upสคริปต์ที่อยู่ในพาร์ติชันอื่น พาร์ติชันนั้นถูกเมาท์ด้วยสคริปต์ที่ซับซ้อน/opt/intermodul-mounts/start.shที่ต้องรันก่อนที่จะตั้งค่าเครือข่าย ขณะนี้ip-upสคริปต์ไม่เริ่มทำงานอย่างมีประสิทธิภาพเนื่องจากไม่สามารถเข้าถึงได้ในเวลาบูต ทำงานservice networking restartหลังจากนั้นแสดงอินเตอร์เฟสทั้งหมดอย่างถูกต้อง
Udo G

สำเนาซ้ำที่เป็นไปได้: superuser.com/questions/1005742/…
Josip Rodin

คำตอบ:


8

network-pre.target เป็นเป้าหมายที่อาจใช้ในการสั่งซื้อบริการก่อนที่จะกำหนดค่าอินเทอร์เฟซเครือข่ายใด ๆ เป็นวัตถุประสงค์หลักสำหรับการใช้งานกับบริการไฟร์วอลล์ที่ต้องการสร้างไฟร์วอลล์ก่อนที่จะเชื่อมต่อเครือข่ายใด ๆ ขึ้น มันเป็นยูนิตแบบพาสซีฟ: คุณไม่สามารถเริ่มได้โดยตรงและมันไม่ได้ถูกดึงเข้ามาโดยบริการจัดการเครือข่าย แต่โดยบริการที่ต้องการเรียกใช้ก่อนหน้านี้

คุณต้องการใช้network-pre.targetถ้าคุณต้องการตั้งค่าบางอย่างก่อนที่เครือข่ายจะเริ่ม

บริการที่ต้องการรันก่อนที่เครือข่ายจะได้รับการกำหนดค่าควรวาง Before = network-pre.target และตั้งค่า Wants = network-pre.target เพื่อดึงเข้าไป

คุณควรใส่สิ่งเหล่านี้ใน[Unit]ส่วน:

Before=network-pre.target
Wants=network-pre.target

การอ้างอิง


1
เฮ้ @ edwardtorvalds ฉันทำสิ่งนี้อย่างแน่นอนสำหรับการตั้งค่าการกำหนดค่าเครือข่ายบางอย่าง แต่หน่วยดูเหมือนจะไม่ทำงาน คำตอบอยู่เสมอsystemctl is-enabled <unit> แน่นอนฉันไม่สามารถเปิดใช้งานได้เพราะไม่มีstatic WantedBy=ท้ายที่สุดแล้วมันต้องการอะไร? นี่คือสิ่งที่ทำการตั้งค่าบางอย่างก่อนที่เครือข่ายควรโหลด
deitch

คุณสามารถลองโดย = remote-fs.target หรือ mount-fs.target
Edward Torvalds

2
ขอบคุณ ฉันสิ้นสุดการทำBefore=network-pre.targetและWants=network-pre.targetและเป็นที่เราทำ[Install] WantedBy=network.targetส่วนสุดท้ายบังคับให้ระบบเครือข่ายจำเป็นต้องใช้ก่อนหน้านี้วางไว้ตามลำดับ เป็นความเจ็บปวดแม้ว่า
deitch

เนื่องจากคุณมีหัวของคุณรอบ systemd ดีกว่าฉันคุณสามารถดู q อื่น ๆ ที่ฉันมี? unix.stackexchange.com/questions/277783/…ยังคงพยายามหาวิธีการ
deitch

ฉันสับสนเพราะฉันไม่มีประสบการณ์กับพาร์ติชั่นที่เข้ารหัสถ้าคุณสามารถฉันได้โปรดทำเช่นนั้น
Edward Torvalds

3

ดังที่ทำใน Debian Jessie แพ็คเกจ netfilter-persistent (อนุญาตให้โหลดกฎ iptables ก่อนที่เครือข่ายจะหมด) มีnetfilter-persistent.serviceที่มีลักษณะดังนี้:

# https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
# based on the netfilter-persistent package
[Unit]
Description=netfilter persistent configuration
DefaultDependencies=no

Before=network-pre.target
Wants=network-pre.target

Wants=systemd-modules-load.service local-fs.target
After=systemd-modules-load.service local-fs.target

Conflicts=shutdown.target
Before=shutdown.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/netfilter-persistent start
ExecStop=/usr/sbin/netfilter-persistent stop

[Install]
WantedBy=multi-user.target

ทำไมมันขัดแย้งกับshutdown.target?!
Alexis Wilke

1

ความผิดพลาดเป็นเรื่องง่ายและเป็นหนึ่งในสิ่งสำคัญที่ฉันมักจะผสมขึ้น: คุณผสมและBefore RequiredByที่ไม่ไปด้วยกัน อื่น ๆ ถูกต้องเกี่ยวกับเป้าหมาย


0
[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=basic.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
WantedBy=basic.target

การทำสิ่งต่าง ๆ ตามบรรทัดเหล่านี้จะช่วยให้มั่นใจได้ว่าเครื่องนี้ทำงานก่อนเครือข่าย แต่หลังจากการตั้งค่าที่สำคัญอื่น ๆ เกิดขึ้น

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