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 เป็นทางลัด