และตอนนี้ systemd ตอบ
คุณกำลังใช้ Red Hat Enterprise Linux ต่อแท็กในคำถามของคุณ ตั้งแต่เวอร์ชัน 7 ที่ใช้ systemd ไม่มีคำตอบอื่นใดที่ถูกต้องสำหรับโลกของ systemd; หรือแม้แต่บางข้อสมมติในคำถามของคุณ
- ลืมเรื่อง runlevels ; มีอยู่ แต่เป็นเพียงความเข้ากันได้เท่านั้น เอกสาร systemd ระบุว่าแนวคิดนั้น "ล้าสมัย" หากคุณเริ่มเรียนรู้สิ่งนี้ในระบบปฏิบัติการ systemd อย่าเริ่มต้นที่นั่น
- ลืมหน้าคู่มือที่อ้างอิงไปยัง marcelm; มันไม่ได้มาจากชุดเครื่องมือที่เหมาะสมเลยและเป็นคำอธิบายของคำสั่งของชุดเครื่องมืออื่นซึ่งไม่ถูกต้องสำหรับ systemd's มันเป็น
haltคำสั่งสำหรับinitยูทิลิตี้ จาก van Smoorenburg "System 5"
- ละเว้นข้อความที่
/sbin/haltเป็นลิงก์สัญลักษณ์ไปที่/sbin/reboot; นั่นไม่เป็นความจริงกับ systemd ไม่มีrebootโปรแกรมแยกต่างหากเลย
- ละเว้นคำสั่งที่
haltหรือrebootเรียกใช้shutdownโปรแกรมด้วยอาร์กิวเมนต์บรรทัดคำสั่ง พวกเขายังไม่เป็นความจริงกับ systemd ไม่มีshutdownโปรแกรมแยกต่างหากเลย
ชุดเครื่องมือการจัดการทุกระบบมียูทิลิตี้เวอร์ชันเหล่านี้ systemd, พุ่งพรวดNoshรถตู้ Smoorenburg initและ BSD initทุกคนมีของตัวเองhalt, poweroffและอื่น ๆ ในแต่ละกลศาสตร์ของพวกเขาจะแตกต่างกันเล็กน้อย ดังนั้นหน้าคู่มือของพวกเขา
ในชุดเครื่องมือ systemd halt, poweroff,reboot , telinitและshutdownมีทั้งหมด/bin/systemctlเชื่อมโยงสัญลักษณ์ พวกเขามีทุก shims หลังเข้ากันได้ว่าเป็นเพียง shorthands สำหรับการเรียกติดต่อบรรทัดคำสั่งหลักของ systemctlsystemd: พวกเขาทั้งหมดแมปไป (และในความเป็นจริง) โปรแกรมเดียวที่เหมือนกัน (ตามแบบแผนเชลล์จะบอกว่าชื่อนั้นถูกเรียกใช้โดย)
เป้าหมายไม่ใช่ runlevels
ส่วนใหญ่ของคำสั่งเหล่านี้จะ shorthands บอก systemd ใช้systemctlเพื่อแยกเฉพาะเป้าหมาย การแยกได้อธิบายไว้ในsystemctlหน้าคู่มือ (qv) แต่อาจเป็นไปได้สำหรับจุดประสงค์ของคำตอบนี้ให้คิดว่าเป็นการเริ่มต้นเป้าหมายและหยุดผู้อื่น เป้าหมายมาตรฐานที่ใช้ใน systemd แสดงอยู่ในsystemd.specialหน้าคู่มือ (8)
ไดอะแกรมบนbootupหน้าคู่มือ (7) ในชุดเครื่องมือ systemd โดยเฉพาะอย่างยิ่งหนึ่งล่าสุดแสดงให้เห็นว่ามีเป้าหมาย "สุดท้าย" สามประการที่เกี่ยวข้องที่นี่:
halt.target- เมื่อระบบมาถึงสถานะของการแยกเป้าหมายนี้อย่างสมบูรณ์แล้วมันจะเรียกว่าการเรียกของreboot(RB_HALT_SYSTEM)ระบบ เคอร์เนลจะพยายามเข้าสู่โปรแกรมตรวจสอบ ROM หรือเพียงแค่หยุด CPU (ใช้กลไกใดก็ได้ที่เหมาะสมสำหรับการทำเช่นนั้น)
reboot.target- เมื่อระบบมาถึงสถานะของการแยกเป้าหมายนี้อย่างสมบูรณ์แล้วมันจะเรียกว่าการเรียกของreboot(RB_AUTOBOOT)ระบบ (หรือเทียบเท่ากับสายคำสั่งเวทมนต์) เคอร์เนลจะพยายามเรียกการรีบูต
poweroff.target- เมื่อระบบมาถึงสถานะของการแยกเป้าหมายนี้อย่างสมบูรณ์แล้วมันจะเรียกว่าการเรียกของreboot(RB_POWER_OFF)ระบบ เคอร์เนลจะพยายามลบพลังงานออกจากระบบหากเป็นไปได้
สิ่งเหล่านี้เป็นสิ่งที่คุณควรคำนึงถึงในฐานะระบบสุดท้ายไม่ใช่ระดับที่ใช้ ขอให้สังเกตจากแผนภาพว่าระบบเป้าหมาย systemd นั้นเข้ารหัสสิ่งที่อยู่ในระบบอื่นโดยปริยายมากกว่าชัดเจน: เช่นความคิดที่ว่าเป้าหมายสุดท้ายเหล่านี้รวมshutdown.targetเป้าหมายไว้แล้วดังนั้นจึงอธิบายบริการที่ต้องหยุดก่อนปิด พวกเขามีความขัดแย้งกับshutdown.targetเป้าหมาย
systemctlพยายามส่งคำขอไปยังsystemd-logindผู้ใช้ที่โทรหาไม่ใช่ผู้ใช้ขั้นสูง systemd-shutdowndนอกจากนี้ยังผ่านการปิดล่าช้าไป และบางชวเลขทำให้เกิดการwallแจ้งเตือน ความซับซ้อนเหล่านั้นซึ่งจะทำให้คำตอบนี้ยาวขึ้นหลายเท่าโดยสมมติว่าคุณเป็นผู้ใช้ขั้นสูงและไม่ได้ร้องขอการกระทำตามกำหนดเวลา:
systemctl isolate halt.target มีชวเลข:
shutdown -H now
systemctl halt
- ไม่มีเครื่องตกแต่ง
halt
systemctl isolate reboot.target มีชวเลข:
shutdown -r now
telinit 6
systemctl reboot
- ไม่มีเครื่องตกแต่ง
reboot
systemctl isolate poweroff.target มีชวเลข:
shutdown -P now
telinit 0
shutdown now
systemctl poweroff
- ไม่มีเครื่องตกแต่ง
poweroff
systemctl isolate rescue.target มีชวเลข:
telinit 1
systemctl rescue
systemctl isolate multi-user.target มีชวเลข:
telinit 2
telinit 3
telinit 4
systemctl isolate graphical.target มีชวเลข:
หลังจากแยกวิเคราะห์ไวยากรณ์บรรทัดคำสั่งต่างกันในที่สุดทั้งหมดเหล่านี้จะสิ้นสุดในเส้นทางรหัสเดียวกันภายในsystemctlโปรแกรม
หมายเหตุ:
- พฤติกรรมแบบดั้งเดิมของตัวเลือกน้อย
shutdown nowได้รับการเปลี่ยนไปใช้โหมดผู้เดียว นี่ไม่ใช่กรณีที่มี systemd rescue.target- โหมดผู้ใช้คนเดียวที่ถูกเปลี่ยนชื่อโหมดช่วยเหลือใน systemd - ไม่สามารถเข้าถึงได้ด้วยshutdownคำสั่ง
telinit จริงๆไม่สนใจทั้งหมดเหล่านั้นและการเชื่อมโยงสัญลักษณ์ในระบบแฟ้มที่หน้าคู่มืออธิบาย การแม็พก่อนหน้านี้ถูกเดินสายเข้าในโปรแกรมในตารางrunlevelN.targetdefault.targetsystemctl
- systemd มีความคิดของไม่มีระดับการทำงานในปัจจุบัน การทำงานของคำสั่งเหล่านี้ไม่เป็นไปตามเงื่อนไข "ถ้าคุณอยู่ในระดับรันN "
--forceตัวเลือกไปhalt, rebootและpoweroffคำสั่งเป็นเช่นเดียวกับการพูดว่า--force --forceไปsystemctl halt, systemctl rebootและsystemctl poweroffคำสั่ง ทำให้systemctlลองโทรออกreboot()โดยตรง โดยปกติจะพยายามแยกเป้าหมาย
telinitinitไม่ได้เป็นเช่นเดียวกับ พวกเขาเป็นโปรแกรมที่แตกต่างกันในโลก systemd หลังเป็นชื่ออื่นสำหรับsystemdโปรแกรมไม่ใช่สำหรับsystemctlโปรแกรม systemdโปรแกรมไม่จำเป็นต้องรวบรวมกับใด ๆ เข้ากันได้รถตู้ Smoorenburg ที่ทั้งหมดและในบางระบบปฏิบัติการ systemd บ่นเกี่ยวกับการถูกเรียกไม่ถูกต้องถ้าหนึ่งในความพยายามinit N
อ่านเพิ่มเติม