ระบบ 5 init
จะบอกคุณเพียงส่วนเล็ก ๆ ของเรื่องราว
สายตาสั้นนั้นมีผลกระทบต่อโลกลีนุกซ์ ผู้คนคิดว่าพวกเขาใช้สิ่งที่เรียกว่า "ระบบ 5 init
" และนั่นคือสิ่งที่เป็นแบบดั้งเดิมและเป็นจุดเริ่มต้นที่ดีที่สุด ในความเป็นจริงทั้งสองกรณี
ประเพณีไม่ได้อยู่ในความเป็นจริงสิ่งที่คนเช่นนี้บอกว่ามันจะเป็นสำหรับการเริ่ม ระบบ 5 init
และrc
วันที่5 ของระบบสำหรับ AT&T UNIX System 5 ซึ่งเกือบจะเป็นหลัง UNIX แรกเท่าที่เราเป็นตอนนี้หลังจากพูดคุยกับ Linux-Mandrake รุ่นแรก
ฉบับที่ 1 UNIX init
มีเพียง rc
มันไม่ได้มี ภาษาแอสเซมบลีรุ่นที่ 1 init
( ซึ่งโค้ดได้รับการกู้คืนและทำให้พร้อมใช้งานโดย Warren Toomey และคณะ ) วางกระบวนการโดยตรงและเกิดใหม่ 12 getty
กระบวนการติดตั้งระบบไฟล์เดินสาย 3 ชุดจากตารางในตัวและเรียกใช้โปรแกรมโดยตรงจากโฮมไดเรกทอรีของ mel
ชื่อผู้ใช้ getty
ตารางก็ยังโดยตรงในภาพโปรแกรม
อีกสิบปีถัดมาหลังจาก UNIX System 5 ระบบลีนุกซ์ Linux ดั้งเดิมที่เรียกว่า ในปี 1992 Miquel van Smoorenburg (อีกครั้ง) เขียน Linux init
+ rc
และเครื่องมือที่เกี่ยวข้องซึ่งตอนนี้ผู้คนเรียกว่า "ระบบ 5 init
" แม้ว่ามันจะไม่ใช่ซอฟต์แวร์จาก UNIX System 5 (และไม่ใช่แค่init
)
ระบบ 5 init
/ rc
ไม่ใช่จุดเริ่มต้นที่ดีที่สุดและแม้ว่าจะเพิ่มความรู้เกี่ยวกับ systemd ที่ไม่ครอบคลุมครึ่งหนึ่งของสิ่งที่ควรรู้ มีงานมากมายในการออกแบบระบบเริ่มต้น (สำหรับ Linux และ BSD) ที่เกิดขึ้นในช่วงสองทศวรรษที่ผ่านมาเพียงอย่างเดียว การตัดสินใจทางวิศวกรรมทุกประเภทได้รับการพูดคุยทำออกแบบนำไปปฏิบัติและฝึกฝน Unices เชิงพาณิชย์ก็มีจำนวนมากเช่นกัน
ระบบที่มีอยู่เพื่อศึกษาและเรียนรู้จาก
นี่คือรายการที่ไม่สมบูรณ์ของระบบเริ่มต้นที่สำคัญบางอย่างนอกเหนือจากที่สองเหล่านี้และหนึ่งหรือสองของจุดสำคัญ (หลาย):
- finitของ Joachim Nilsson เป็นเส้นทางของการใช้ไฟล์การกำหนดค่าที่มนุษย์อ่านได้มากขึ้น
- minitของ Felix von Leitner ไปสำหรับระบบการกำหนดค่า filesystem-is-the-database, footprints หน่วยความจำขนาดเล็กและการเริ่ม / หยุดการพึ่งพาระหว่างสิ่งต่าง ๆ ที่
init
เริ่มขึ้น
- Runitของ Gerrit Pape ไปสำหรับสิ่งที่ฉันได้อธิบายไว้ก่อนหน้านี้ว่าเป็นวิธีการวางสคริปต์เชลล์สี่ตัว
- InitNGมีวัตถุประสงค์เพื่อให้มีการขึ้นต่อกันชื่อเป้าหมายไฟล์การกำหนดค่าหลายไฟล์และไวยากรณ์การกำหนดค่าที่ยืดหยุ่นมากขึ้นพร้อมการตั้งค่าโหลดทั้งหมดสำหรับกระบวนการลูก
- พุ่งพรวดไปสำหรับการออกแบบที่สมบูรณ์การสร้างแบบจำลองระบบไม่ได้เป็นบริการและการพึ่งพาซึ่งกันและกันทั้งหมด แต่เป็นเหตุการณ์และงานทริกเกอร์โดยพวกเขา
- การออกแบบของnoshรวมถึงการผลักดันการจัดการบริการทั้งหมดออก (รวมถึงการ
getty
วางไข่และวางไข่ซอมบี้) ในผู้จัดการบริการแยกต่างหากและเพียงแค่จัดการ "API" อุปกรณ์ / symlinks / ไดเรกทอรีและระบบเหตุการณ์
- sinitคือการเริ่มต้นที่ง่ายมาก มันดำเนิน
/bin/rc.init
งานซึ่งก็คือการเริ่มโปรแกรมติดตั้งระบบแฟ้ม ฯลฯ สำหรับนี้คุณสามารถใช้สิ่งที่ต้องการminirc
นอกจากนี้ประมาณ 10 ปีที่ผ่านมามีการอภิปรายในหมู่ผู้ใช้ daemontools และอื่น ๆ ของการใช้svscan
เป็นกระบวนการที่ 1 ซึ่งนำไปสู่โครงการเช่นพอล Jarc ของ svscan เป็นกระบวนการที่ 1 การศึกษา , ความคิด Gerrit Pape ของและLaurent Bercot ของ svscan เป็นกระบวนการ 1
ซึ่งนำเราไปสู่สิ่งที่โปรแกรม # 1 ทำ
โปรแกรม # 1 ทำอะไร
แนวคิดของสิ่งที่กระบวนการ # 1 คือ "ควร" ที่จะทำคือโดยอัตนัยของพวกเขา เกณฑ์การออกแบบวัตถุประสงค์ที่มีความหมายคือขั้นตอนที่ 1 อย่างน้อยที่สุดที่ต้องทำ เคอร์เนลมีข้อกำหนดหลายประการ และมีบางสิ่งที่เฉพาะเจาะจงกับระบบปฏิบัติการหลายชนิดที่ต้องทำ เมื่อพูดถึงกระบวนการที่ # 1 ได้ทำขึ้นตามธรรมเนียมแล้วเราก็ไม่ได้เป็นอย่างนั้น
มีหลายสิ่งที่เคอร์เนลระบบปฏิบัติการและโปรแกรมอื่น ๆ ต้องการกระบวนการ # 1 ที่ไม่สามารถหลบหนีได้
ผู้คนจะบอกคุณว่าfork()
ไอเอ็นจีสิ่งต่าง ๆ และทำหน้าที่เป็นผู้ปกครองของกระบวนการเด็กกำพร้าเป็นหน้าที่สำคัญของกระบวนการ # 1 แดกดันนี่เป็นเรื่องจริง การจัดการกับกระบวนการกำพร้าคือ (กับลินุกซ์ที่ผ่านมาเมล็ดตามที่อธิบายไว้ในhttps://unix.stackexchange.com/a/177361/5132 ) เป็นส่วนหนึ่งของระบบที่หนึ่งสามารถส่วนใหญ่ปัจจัยที่ออกจากกระบวนการ # 1 ในกระบวนการอื่น ๆ เช่น โดยเฉพาะผู้จัดการบริการ ทั้งหมดนี้คือผู้จัดการฝ่ายบริการซึ่งมีกระบวนการที่ 1:
- โปรแกรม IBM AIX
srcmstr
, System Resource Controller
- Gerrit Pape
runsvdir
จาก runit
- Daniel J. Bernstein
svscan
จาก daemontools, Adam Sampson svscan
จากfreedt , Bruce Guenter svscan
จาก daemontools-encore และ Laurent Bercot s6-svscan
จาก s6
- เวย์นมาร์แชลล์
perpd
จาก perp
- สิ่งอำนวยความสะดวกการจัดการบริการใน Solaris 10
service-manager
จาก Nosh
ในทำนองเดียวกันตามที่อธิบายไว้ที่https://superuser.com/a/888936/38062/dev/initctl
แนวคิดทั้งหมดไม่จำเป็นต้องอยู่ใกล้กับกระบวนการ # 1 แดกดันมันเป็น systemd ที่มีการรวมศูนย์สูงซึ่งแสดงให้เห็นว่ามันสามารถถูกย้ายออกจากกระบวนการ # 1
ตรงกันข้ามสิ่งที่จำเป็นสำหรับinit
คนที่มักจะลืมในการออกแบบที่ปิดด้านบนของหัวของพวกเขาเป็นสิ่งเช่นการจัดการSIGINT
, SIGPWR
, SIGWINCH
และอื่น ๆ ส่งมาจากเมล็ดและตัวประกันคำขอเปลี่ยนแปลงสถานะของระบบต่างๆส่ง จากโปรแกรมที่ "รู้" ว่าสัญญาณบางอย่างไปยังกระบวนการ # 1 หมายถึงบางสิ่ง (ตัวอย่างเช่น: ตามที่อธิบายไว้ที่https://unix.stackexchange.com/a/196471/5132ชุดเครื่องมือ BSD "รู้" ที่SIGUSR1
มีความหมายเฉพาะ)
นอกจากนี้ยังมีการเตรียมใช้งานครั้งเดียวและการทำขั้นตอนสุดท้ายที่ไม่สามารถหลบหนีได้หรือจะประสบปัญหาอย่างมากจากการไม่ทำเช่นการติดตั้งระบบไฟล์ "API"หรือล้างแคชระบบไฟล์
พื้นฐานของการจัดการกับระบบไฟล์ "API" นั้นแตกต่างกันเล็กน้อยกับการทำงานของinit
rom 1st Edition UNIX: หนึ่งมีรายการของข้อมูลที่เดินสายเข้าสู่โปรแกรมและหนึ่งmount()
รายการทั้งหมดในรายการ คุณจะพบกลไกนี้ในระบบที่มีความหลากหลายเท่ากับ BSD (sic!) init
ผ่าน nosh system-manager
ไปจนถึง systemd
"ตั้งค่าระบบสำหรับเชลล์แบบง่าย ๆ "
ตามที่คุณสังเกตเห็นinit=/bin/sh
ไม่ได้รับการติดตั้งระบบไฟล์ "API" ขัดข้องในลักษณะที่ไม่น่าจับตามองโดยไม่ต้องล้างแคชเมื่อหนึ่งประเภทexit
( https://unix.stackexchange.com/a/195978/5132 ) และโดยทั่วไปจะทิ้งไว้ ถึงผู้ใช้ (super) เพื่อดำเนินการด้วยตนเองที่ทำให้ระบบใช้งานได้น้อยที่สุด
เมื่อต้องการดูว่าไม่มีใครเลือกจริง แต่ต้องทำในโปรแกรม # 1 ในกระบวนการและทำให้คุณอยู่ในหลักสูตรที่ดีสำหรับเป้าหมายการออกแบบที่ระบุไว้ตัวเลือกที่ดีที่สุดของคุณคือดูการเหลื่อมซ้อนกันในการทำงานของ runit ของ Gerrit Pape Felix von Minit ของ Leitner และsystem-manager
โปรแกรมจากแพคเกจ nosh อดีตสองรายการแสดงสองพยายามที่จะเป็นมินิมัลลิสต์ แต่ก็ยังคงจัดการกับสิ่งที่เป็นไปไม่ได้ที่จะหลีกเลี่ยง
อย่างหลังมีประโยชน์ฉันขอแนะนำสำหรับรายการคู่มืออย่างละเอียดสำหรับsystem-manager
โปรแกรมซึ่งรายละเอียดว่าระบบไฟล์ "API" ถูกเมาท์งานเริ่มต้นทำงานอะไรและมีการจัดการสัญญาณอะไรบ้าง ในระบบที่ออกแบบโดยผู้จัดการระบบเพิ่งวางไข่สามสิ่งอื่น ๆ (ผู้จัดการบริการ, คนตัดไม้และโปรแกรมเรียกใช้การเปลี่ยนแปลงสถานะ) และทำสิ่งที่หลีกเลี่ยงไม่ได้ในกระบวนการ # 1 เท่านั้น