และตอนนี้ 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 สำหรับการเรียกติดต่อบรรทัดคำสั่งหลักของ systemctl
systemd: พวกเขาทั้งหมดแมปไป (และในความเป็นจริง) โปรแกรมเดียวที่เหมือนกัน (ตามแบบแผนเชลล์จะบอกว่าชื่อนั้นถูกเรียกใช้โดย)
เป้าหมายไม่ใช่ 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.target
default.target
systemctl
- systemd มีความคิดของไม่มีระดับการทำงานในปัจจุบัน การทำงานของคำสั่งเหล่านี้ไม่เป็นไปตามเงื่อนไข "ถ้าคุณอยู่ในระดับรันN "
--force
ตัวเลือกไปhalt
, reboot
และpoweroff
คำสั่งเป็นเช่นเดียวกับการพูดว่า--force --force
ไปsystemctl halt
, systemctl reboot
และsystemctl poweroff
คำสั่ง ทำให้systemctl
ลองโทรออกreboot()
โดยตรง โดยปกติจะพยายามแยกเป้าหมาย
telinit
init
ไม่ได้เป็นเช่นเดียวกับ พวกเขาเป็นโปรแกรมที่แตกต่างกันในโลก systemd หลังเป็นชื่ออื่นสำหรับsystemd
โปรแกรมไม่ใช่สำหรับsystemctl
โปรแกรม systemd
โปรแกรมไม่จำเป็นต้องรวบรวมกับใด ๆ เข้ากันได้รถตู้ Smoorenburg ที่ทั้งหมดและในบางระบบปฏิบัติการ systemd บ่นเกี่ยวกับการถูกเรียกไม่ถูกต้องถ้าหนึ่งในความพยายามinit N
อ่านเพิ่มเติม