วิธีการใช้คำสั่ง Init ใน Linux

Init เป็นผู้ปกครองของกระบวนการทั้งหมด บทบาทหลักของมันคือการสร้างกระบวนการจากสคริปต์ที่เก็บไว้ในไฟล์ / etc / inittab (ดู inittab (5)) ไฟล์นี้มักจะมีรายการซึ่งทำให้ init เกิด sptyting getty ในแต่ละบรรทัดที่ผู้ใช้สามารถล็อกอินนอกจากนี้ยังควบคุมกระบวนการที่เป็นอิสระตามที่ระบบกำหนดไว้

runlevels

ระดับการทำงาน ( runlevel) คือการกำหนดค่าซอฟท์แวร์ของระบบซึ่งอนุญาตเฉพาะกลุ่มของกระบวนการที่เลือกเท่านั้น กระบวนการที่ spawned โดย init สำหรับแต่ละ runlevel เหล่านี้ถูกกำหนดไว้ในไฟล์ / etc / inittab Init สามารถอยู่ในหนึ่งในแปด runlevels: 0-6 และ S หรือ s runlevel มีการเปลี่ยนแปลงโดยมี telinit ที่ ผู้ใช้มีสิทธิพิเศษซึ่งจะส่งสัญญาณที่เหมาะสมไปยัง init บอกให้ทราบว่า runlevel ใดที่จะเปลี่ยนไป

Runlevels 0 , 1 และ 6 ถูกสงวนไว้ Runlevel 0 ถูกใช้เพื่อหยุดระบบ runlevel 6 ถูกใช้เพื่อรีบูตระบบและ runlevel 1 ใช้เพื่อให้ระบบเข้าสู่โหมดผู้ใช้เดี่ยว Runlevel S ไม่ได้หมายถึงการใช้งานโดยตรง แต่สำหรับสคริปต์ที่รันเมื่อป้อน runlevel 1. สำหรับข้อมูลเพิ่มเติมโปรดดูที่ manpages for shutdown (8) และ inittab (5)

Runlevels 7-9 ยังมีผลแม้ว่าจะไม่ได้มีการจัดทำเป็นเอกสารไว้จริงๆ เนื่องจาก "แบบดั้งเดิม" ตัวแปรยูนิกซ์ไม่ใช้ ในกรณีที่คุณอยากรู้อยากเห็น runlevels S และ s ในความเป็นจริงเหมือนกัน ภายในเป็นนามแฝงสำหรับ runlevel เดียวกัน

บูต

หลังจาก init ถูกเรียกใช้เป็นขั้นตอนสุดท้ายของลำดับการบูตเคอร์เนลค้นหาไฟล์ / etc / inittab เพื่อดูว่ามีรายการประเภท initdefault หรือไม่ (ดู inittab (5)) รายการ initdefault กำหนด runlevel เริ่มต้นของระบบ หากไม่มีรายการดังกล่าว (หรือไม่มี / etc / inittab เลย) ต้องใส่ runlevel ที่คอนโซลระบบ

Runlevel S หรือ s นำระบบไปใช้โหมดผู้ใช้คนเดียวและไม่ต้องใช้ไฟล์ / etc / inittab ในโหมดผู้ใช้คนเดียว root shell จะเปิดขึ้นใน / dev / console

เมื่อเข้าสู่โหมดผู้ใช้คนเดียว init จะอ่านสถานะ ioctl ของคอนโซล (2) จาก /etc/ioctl.save หากไม่มีไฟล์นี้ init จะ เริ่มต้นบรรทัดที่ 9600 baud และมีการตั้งค่า CLOCAL เมื่อ init ออกจากโหมดผู้ใช้คนเดียวระบบจะเก็บการตั้งค่า ioctl ของคอนโซลไว้ในไฟล์นี้เพื่อให้สามารถใช้งานได้อีกครั้งสำหรับเซสชันผู้ใช้คนถัดไปรายถัดไป

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

เมื่อเริ่มต้นกระบวนการใหม่ init จะตรวจสอบก่อนว่าไฟล์ / etc / initscript มีอยู่หรือไม่ ถ้าใช้จะใช้สคริปต์นี้เพื่อเริ่มต้นกระบวนการ

ในแต่ละครั้งที่เด็กเลิกใช้ init จะบันทึกข้อเท็จจริงและเหตุผลที่มันตายใน / var / run / utmp และ / var / log / wtmp โดยมีเงื่อนไขว่าไฟล์เหล่านี้มีอยู่

การเปลี่ยนระดับ Runlevels

หลังจากที่มีกระบวนการทั้งหมดที่ระบุไว้ init จะรอให้ process descendant ตายลงสัญญาณ powerfail หรือจนกว่าจะมีการส่งสัญญาณโดย telinit เพื่อเปลี่ยน runlevel ของระบบ เมื่อเงื่อนไขใดเงื่อนไขหนึ่งข้างต้นเกิดขึ้นระบบจะตรวจสอบไฟล์ / etc / inittab อีกครั้ง สามารถเพิ่มรายการใหม่ลงในไฟล์นี้ได้ตลอดเวลา อย่างไรก็ตาม init ยังคงรอให้หนึ่งในสามเงื่อนไขข้างต้นเกิดขึ้น เพื่อให้สามารถตอบสนองได้ทันท่วงทีคำสั่ง telinit Q หรือ q สามารถเรียกใช้ init เพื่อตรวจสอบไฟล์ / etc / inittab ใหม่

ถ้า init ไม่อยู่ในโหมดผู้ใช้เดี่ยวและรับสัญญาณ powerfail (SIGPWR) จะอ่านไฟล์ / etc / powerstatus จากนั้นจะเริ่มต้นคำสั่งตามเนื้อหาของไฟล์นี้:

ล้มเหลว)

กำลังไฟไม่ทำงาน UPS จะให้กำลังไฟ ดำเนินการ powerwait และรายการ powerfail

ตกลง)

พลังงานได้รับการคืนค่าแล้วให้เรียกใช้รายการ powerokwait

ต่ำ)

ไฟดับและ UPS มีแบตเตอรี่เหลือน้อย ดำเนินการรายการ powerfailnow

ถ้า / etc / powerstatus ไม่มีหรือมีอะไรอื่นแล้วตัวอักษร F , O หรือ L , init จะทำตัวราวกับว่ามันได้อ่านตัวอักษร F

ไม่แนะนำให้ใช้ SIGPWR และ / etc / powerstatus คนที่ต้องการโต้ตอบกับ init ควรใช้ช่องควบคุม / dev / initctl - ดูซอร์สโค้ดของแพคเกจ sysvinit เพื่อดูเอกสารเพิ่มเติมเกี่ยวกับเรื่องนี้

เมื่อ init ถูกร้องขอให้เปลี่ยน runlevel จะส่ง SIGTERM สัญญาณเตือนไปยังกระบวนการทั้งหมดที่ไม่ได้กำหนดไว้ใน runlevel ใหม่ จากนั้นรอ 5 วินาทีก่อนที่จะมีการยกเลิกกระบวนการเหล่านี้โดยใช้สัญญาณ SIGKILL โปรดทราบว่า init สันนิษฐานว่ากระบวนการทั้งหมดเหล่านี้ (และลูกหลานของพวกเขา) ยังคงอยู่ในกลุ่มกระบวนการเดียวกันซึ่ง init ที่ สร้างขึ้นสำหรับพวกเขา หากกระบวนการใดเปลี่ยนแปลงการเข้าร่วมกลุ่มกระบวนการจะไม่ได้รับสัญญาณเหล่านี้ กระบวนการดังกล่าวจะต้องถูกแยกออกจากกัน

telinit

/ sbin / telinit เชื่อมโยงกับ / sbin / init ใช้อาร์กิวเมนต์หนึ่งอักขระและส่งสัญญาณ init เพื่อดำเนินการที่เหมาะสม อาร์กิวเมนต์ต่อไปนี้ใช้เป็นคำสั่งสำหรับ telinit :

0 , 1 , 2 , 3 , 4 , 5 หรือ 6

บอก init เพื่อเปลี่ยนไปใช้ระดับการทำงานที่ระบุ

a , b , c

บอก init เพื่อประมวลผลเฉพาะรายการไฟล์ / etc / inittab ที่ มี runlevel a , b หรือ c

Q หรือ q

บอก init ตรวจสอบไฟล์ / etc / inittab อีกครั้ง

S หรือ s

บอก init เพื่อเปลี่ยนไปใช้โหมดผู้ใช้คนเดียว

U หรือ u

บอก init เพื่อดำเนินการตัวเองอีกครั้ง (รักษาสถานะ) ไม่มีการตรวจสอบไฟล์ / etc / inittab อีกครั้ง ระดับการเรียกใช้ควรเป็นหนึ่งใน Ss12345 มิฉะนั้นคำขอจะถูกละเว้นโดยไม่ตั้งใจ

telinit สามารถบอก init ได้ นานเท่าไรควรรอระหว่างการส่งสัญญาณ SIGTERM และ SIGKILL ค่าเริ่มต้นคือ 5 วินาที แต่สามารถเปลี่ยนแปลงได้โดยใช้ตัวเลือก -t sec

telinit สามารถเรียกใช้เฉพาะผู้ใช้ที่มีสิทธิ์ที่เหมาะสมเท่านั้น

ไบนารี init ตรวจสอบว่าเป็น init หรือ telinit โดยดูจาก id กระบวนการ รหัสกระบวนการของ init ที่ แท้จริงคือ 1 จากนี้เป็นไปได้ว่าแทนที่จะโทร telinit หนึ่งยังสามารถใช้เพียงแทน init เป็นทางลัด