SysV, พุ่งพรวดและ systemd init สคริปต์อยู่ร่วมกัน


15

บนระบบของฉัน (16.04) มีไฟล์/lib/systemd/system/network-manager.serviceและ/etc/init.d/network-managerตัวอย่างเช่น

ฉันไม่เข้าใจว่า (และสาเหตุ) ทำงานอย่างไร sudo service network-manager restartฉันมักจะเริ่มต้นใหม่โดยผู้จัดการเครือข่าย ไม่ควรทำให้ระบบยุ่งเหยิงอย่างนี้เหรอ? มันยังคงทำงานอยู่

เหตุใดจึงservice --status-allแสดงรายการบริการทุกประเภท ไม่ควรใช้ 16.04 systemd แทนที่จะพุ่งพรวด?

มีคนอธิบายว่าการอยู่ร่วมกันนี้ทำงานอย่างไร

คำตอบ:


17

ระบบ init หนึ่งระบบสามารถใช้งานได้พร้อมกัน ในวันที่ 16.04 นั่นคือ systemd

จำนวนแพ็กเกจมาพร้อมกับไฟล์สำหรับระบบเริ่มต้นหลายระบบดังนั้นจึงสามารถจัดการกับระบบเริ่มต้นหลายระบบบนระบบปฏิบัติการที่แตกต่างกัน บน Ubuntu บางครั้งสคริปต์สำหรับระบบ init หลายระบบจะถูกติดตั้งแม้ว่าจะไม่ได้ใช้งานทั้งหมดในเวลาเดียวกัน

ระบบ init รุ่นใหม่พยายามที่จะรักษาความเข้ากันได้กับระบบเก่า โดยเฉพาะอย่างยิ่ง systemd พยายามที่จะรักษาความเข้ากันได้กับสคริปต์เริ่มต้นทั้ง Upstart และ SysV

ในกรณีของสคริปต์ "init.d" ที่คุณพูดถึงนั่นคือสคริปต์ init "SysV" ไม่ใช่สคริปต์พุ่งพรวด นอกจากนี้สคริปต์เริ่มต้นของ "SysV" จะเริ่มทำงานเมื่อบูตหากเชื่อมโยงไปยังไดเรกทอรีเช่น "/etc/rc5.d" เท่านั้น คุณจะพบว่าตัวจัดการเครือข่ายไม่มี symlink ติดตั้งอยู่ที่นั่น

หากต้องการทำความเข้าใจวิธีsystemdจัดการสคริปต์เริ่มต้นของ "SysV" ดูที่systemd ใช้ /etc/init.d scirpts อย่างไร .

ตอนนี้เพื่อตอบคำถามเกี่ยวกับสาเหตุที่ทำให้รีสตาร์ท Network Manager ด้วย "service network-manager restart" serviceคำสั่งที่ใช้กับทั้งสคริปต์พุ่งพรวดและ SysV สคริปต์ init เลือกอดีต /etc/init/network-manager.confผู้จัดการเครือข่ายนอกจากนี้ยังมีสคริปต์พุ่งพรวดติดตั้งบนที่ 16.04

หากคุณตรวจสอบผลลัพธ์ของsudo strace service network-manager restartคุณจะได้รับความรู้สึกของสิ่งที่เกิดขึ้น อันดับแรกเอาต์พุตแสดงว่าsystemctlกำลังถูกเรียกใช้เพื่อระบุว่าคำสั่งกำลังถูกเปลี่ยนเส้นทางไปยัง systemd ก่อนอื่นไม่นานหลังจากที่เปิดขึ้น/usr/bin/serviceมาคุณจะเห็นว่ามันเริ่มอ่านในไฟล์เป็นเชลล์สคริปต์:

open("/usr/sbin/service", O_RDONLY)     = 3
...
read(10, "#!/bin/sh\n\n#####################"..., 8192) = 8192

ตอนนี้เรารู้แล้วว่าserviceเป็นเชลล์สคริปต์เราสามารถไปดูซอร์สโค้ดของมันได้ ในซอร์สโค้ดเราพบว่าis_systemdมีการตรวจพบและตั้งค่า สำหรับกรณี systemd systemctl restart network-managerคุณสามารถเห็นได้ว่าคำสั่งที่ได้รับการเขียนใหม่ให้เป็น

ดังนั้นในขณะที่ระบบเริ่มต้นทั้งสามนั้นมีอยู่จริงและมีความเข้ากันได้บ้างก็มีความซับซ้อนหลายระดับ เพื่อลดความซับซ้อนของสิ่งที่เกิดขึ้นในอนาคตควรใช้ไฟล์ systemd unit และsystemctlเครื่องมือในการจัดการบริการ

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