ข้อมูลเชิงลึกของระบบ "Ubuntu Linux" - เราเห็นสิ่งนี้หรือไม่?
LINUX อย่างที่เราทราบกันดีว่าเป็นเคอร์เนลไม่ใช่ระบบปฏิบัติการ ซึ่งมาพร้อมกับการกระจายหลายรูปแบบ เช่น: Debian, Fedora, Ubuntu แข็งแกร่ง> ฯลฯ และอีกมากมาย Ubuntu OS ที่พัฒนาโดย Mark Shuttleworth เป็นที่รู้จักและใช้งานกันอย่างแพร่หลายในหลาย ๆ คน นอกจากนี้ เวอร์ชันใหม่ยังเปิดให้ใช้งานฟรีและเป็นโอเพ่นซอร์สเป็นประจำทุกปี ซึ่งสนับสนุนโดยนักพัฒนาหลายพันคนที่มีส่วนร่วมในการพัฒนา แต่มันทำงานอย่างไร? กระบวนการ รายการเหตุการณ์ทั้งหมดใดบ้างที่ทำให้ทำงานได้ และอะไรคือความสำคัญของกระบวนการเหล่านี้
บทความนี้จะเจาะลึกเกี่ยวกับระบบภายในของ Ubuntu OS เล็กน้อยที่น่าสนใจมากและจะช่วยให้มือใหม่มีความเข้าใจอย่างสมบูรณ์เกี่ยวกับการทำงานของระบบปฏิบัติการ
วางระบบ
Linux มีกระบวนการในการทำงาน แต่ละบริการของระบบรวมถึงการจัดการพลังงาน การบูตเครื่อง การจัดการข้อขัดข้องของระบบเป็นกระบวนการที่มีไฟล์การกำหนดค่าใน “/etc/init ” ที่อธิบายเหตุการณ์ที่ โดยจะดำเนินการและเหตุการณ์ที่เกี่ยวข้องซึ่งจะหยุดการดำเนินการ พร้อมทั้งรักษาไฟล์การกำหนดค่าอื่นๆ ที่อธิบายพฤติกรรมรันไทม์ไว้ในไดเร็กทอรี “/etc/ ” ของระบบ ดังนั้น จึงสร้างระบบ เหตุการณ์หนึ่งขับเคลื่อน
หากมีเหตุการณ์เกิดขึ้น ก็ควรจะมีคนจับมันและดำเนินการมัน?? เห็นได้ชัดว่าตัวควบคุมเป็นกระบวนการหลักของเราที่มีอยู่เป็นพาเรนต์ของกระบวนการทั้งหมดที่มีรหัสกระบวนการ 1 เช่น init นี่เป็นกระบวนการที่เริ่มต้นด้วยการเริ่มระบบและไม่เคยหยุดนิ่ง กระบวนการนี้จะตายเมื่อระบบปิดทำงานเท่านั้น เนื่องจากไม่มีกระบวนการใดที่เป็นพาเรนต์ของ init
Ubuntu เวอร์ชันก่อนหน้าก่อน 6.10 มี sysvinit รูปแบบเก่าที่ใช้ในการเรียกใช้สคริปต์ใน “/etc/rcx.d ” ทุกครั้งที่เริ่มและปิดระบบ แต่หลังจากนั้นระบบ upstart ก็เข้ามาแทนที่ระบบ sysvinit แบบเก่า แต่ยังคงให้ความเข้ากันได้แบบย้อนหลัง
Ubuntu เวอร์ชันล่าสุดมีระบบพุ่งพรวดนี้ แต่เนื่องจากวิวัฒนาการมาจาก Ubuntu 6.10 จึงได้มีการแก้ไขหลายครั้งในเวอร์ชันปัจจุบันคือ 1.13.2 ณ วันที่ 4 กันยายน 2014 ระบบพุ่งพรวดล่าสุด มีกระบวนการ 2 init หนึ่งกระบวนการสำหรับกระบวนการของระบบและอื่น ๆ ที่จัดการเซสชันผู้ใช้ที่เข้าสู่ระบบปัจจุบันและมีอยู่จนกว่าผู้ใช้จะเข้าสู่ระบบเท่านั้น หรือที่เรียกว่า x-session init .
ระบบทั้งหมดถูกจัดวางเป็นแบบลำดับชั้นซึ่งประกอบด้วยความสัมพันธ์ระหว่างบรรพบุรุษและลูกตลอดทั้งระบบขึ้นไปสู่อำนาจลง
ตัวอย่าง: ความสัมพันธ์แบบลำดับชั้นเล็กๆ ระหว่างกระบวนการ init ทั้งสองคือ: system init(1) -> display manager(kernel space) -> ตัวจัดการการแสดงผล (พื้นที่ผู้ใช้) -> ผู้ใช้ init (หรือ x-session init)
ไฟล์การกำหนดค่าสำหรับกระบวนการที่จัดการโดย system init จะอยู่ใน “/etc/init ” และสำหรับกระบวนการที่จัดการโดย session init จะอยู่ใน “/usr/share/upstart ” (ตาม ตามเวอร์ชันพุ่งพรวดปัจจุบันที่สูงกว่า 1.12) และไฟล์การกำหนดค่าเหล่านี้เป็นกุญแจสำคัญในความลับมากมายเกี่ยวกับกระบวนการตามที่อธิบายไว้ในบทความนี้
เจาะลึกเข้าไปในลำดับชั้นมากขึ้น
Ubuntu รู้จักกระบวนการสองประเภท:
- งานอายุสั้น (หรืองานแล้วตาย)
- งานที่มีอายุยืนยาว (หรืองานที่อยู่และทำงาน)
ลำดับชั้นที่ทำบนระบบนั้นเนื่องมาจากความสัมพันธ์การพึ่งพาระหว่างกระบวนการต่างๆ ซึ่งเราสามารถเข้าใจได้โดยการดูไฟล์การกำหนดค่า ก่อนอื่นเรามาเริ่มจากความสัมพันธ์แบบลำดับชั้นอย่างง่ายระหว่างกระบวนการที่ทำให้ระบบบูตและเข้าใจความสำคัญของแต่ละกระบวนการ
ลำดับชั้นการบูต
Init เป็นกระบวนการแรกที่จะเริ่มเปิดเครื่องและจัดอยู่ในงาน work-and-stay เนื่องจากไม่เคยถูกฆ่า และเฉพาะเวลาที่ init ถูกฆ่าเท่านั้นที่เปิดอยู่ การปิดเครื่องเช่น init จะตายเท่านั้นและนั่นก็เช่นกันหนึ่งครั้งต่อเซสชันและนั่นคือการปิดเครื่อง เมื่อเปิดเครื่อง init จะสร้างเหตุการณ์แรกสุดบนระบบ เช่น เหตุการณ์การเริ่มต้น ไฟล์การกำหนดค่าแต่ละไฟล์ใน “/etc/init ” มีสองบรรทัดที่กำหนดเหตุการณ์ที่ทำให้กระบวนการเริ่มต้นและหยุด เส้นเหล่านั้นถูกเน้นไว้ในภาพด้านล่าง:
นี่คือไฟล์การกำหนดค่าของกระบวนการ failsafe-x และสิ่งเหล่านี้เริ่มต้นและหยุดตามเงื่อนไขที่อธิบายเหตุการณ์ที่กระบวนการจะเริ่มต้น ในการสร้างเหตุการณ์การเริ่มต้นโดยการประมวลผล init กระบวนการเหล่านั้นที่มีการเริ่มต้นระบบเมื่อเริ่มต้นตามเงื่อนไขจะถูกดำเนินการแบบขนานและนี่จะเป็นการกำหนดลำดับชั้นเท่านั้น และกระบวนการทั้งหมดที่ดำเนินการเมื่อเริ่มต้นระบบจะเป็นลูกของ init
กระบวนการที่เริ่มต้นเมื่อเริ่มต้นระบบจะแสดงรายการไว้ด้านล่าง และงานเหล่านี้ล้วนเป็นงานที่ต้องทำงานแล้วตาย:
1. ชื่อโฮสต์ – นี่เป็นกระบวนการที่บอกระบบถึงชื่อโฮสต์ที่กำหนดไว้ในไฟล์ /etc/hostname
2. kmod – โหลดโมดูลเคอร์เนล เช่น ไดรเวอร์ทั้งหมดจากไฟล์ /etc/modules
3. mountall – กระบวนการนี้สร้างเหตุการณ์จำนวนมาก และมีหน้าที่หลักในการติดตั้งระบบไฟล์ทั้งหมดในขณะบูต รวมถึงระบบไฟล์ในเครื่องและระบบไฟล์ระยะไกล
ไฟล์ /proc ยังถูกเมาต์โดยกระบวนการนี้เช่นกัน และหลังจากงานเมานท์ทั้งหมดแล้ว เหตุการณ์สุดท้ายที่สร้างขึ้นคือเหตุการณ์ระบบไฟล์ซึ่งทำให้ลำดับชั้นดำเนินต่อไปต่อไป
4. พลีมัธ – กระบวนการนี้ดำเนินการบนการเริ่มต้น mountall และมีหน้าที่รับผิดชอบในการแสดงหน้าจอสีดำที่เห็นเมื่อเริ่มต้นระบบโดยแสดงบางอย่างดังนี้:
5. พร้อมพลีมัธ – แสดงว่าพลีมัธพร้อมแล้ว
ต่อไปนี้เป็นกระบวนการหลัก ส่วนกระบวนการอื่นๆ ที่ดำเนินการเมื่อเริ่มต้นระบบก็เช่น udev-fallback-graphics ฯลฯ การกลับมาที่ลำดับชั้นการบูต โดยสรุปเหตุการณ์และกระบวนการที่ตามมาจะเป็นตามลำดับ:
1. init พร้อมกับการสร้างเหตุการณ์การเริ่มต้น
2. การติดตั้งระบบไฟล์ mountall พลีมัธ (พร้อมกับการเริ่มต้น mountall) ที่แสดงหน้าจอสแปลช และโมดูลเคอร์เนลการโหลด kmod
3. เหตุการณ์ local-filesystem ที่สร้างโดย mountall ทำให้ dbus ทำงาน (Dbus คือบัสข้อความทั้งระบบซึ่งสร้างซ็อกเก็ตเพื่อให้กระบวนการอื่นสื่อสารถึงกันผ่านการส่งข้อความไปยังซ็อกเก็ตนี้ และผู้รับจะฟังข้อความบนซ็อกเก็ตนี้และกรองข้อความที่มีความหมายสำหรับมัน)
4. local-filesystem พร้อมด้วย dbus ที่เริ่มต้นและเหตุการณ์ static-network-up ที่เกิดจากเครือข่ายกระบวนการที่ทำงานบนเหตุการณ์ local-filesystem ทำให้ตัวจัดการเครือข่ายทำงาน
5. เหตุการณ์ ระบบไฟล์เสมือน ที่สร้างโดย mountall ทำให้ udev ทำงาน (udev เป็นตัวจัดการอุปกรณ์สำหรับ linux ที่จัดการ hot-plugging ของอุปกรณ์และรับผิดชอบในการสร้างไฟล์ในไดเร็กทอรี /dev และจัดการไฟล์เหล่านั้นด้วย) udev สร้างไฟล์สำหรับ ram, rom ฯลฯ ในไดเร็กทอรี /dev ที่ mountall ติดตั้งเสมือนเสร็จแล้ว -filesystems และได้สร้างเหตุการณ์ virtual-filesystem ซึ่งแสดงถึงการติดตั้งไดเร็กทอรี /dev
6. udev ทำให้ upstart-udev-bridge ทำงานโดยแสดงว่าเครือข่ายท้องถิ่นพร้อมใช้งาน จากนั้นหลังจากที่ mountall ติดตั้งระบบไฟล์ล่าสุดเสร็จแล้วและสร้างเหตุการณ์ระบบไฟล์
7. เหตุการณ์ ระบบไฟล์ พร้อมกับเหตุการณ์ static-network-up ทำให้งาน rc-sysinit ทำงาน ความเข้ากันได้แบบย้อนหลังระหว่าง sysvinit รุ่นเก่ากับ upstart...
9. rc-sysinit รันคำสั่ง telinit ที่บอกระดับรันระบบ
10. หลังจากได้รับระดับรันแล้ว init จะดำเนินการสคริปต์ที่ขึ้นต้นด้วย 'S' หรือ 'K' (การเริ่มงานที่มี 'S' อยู่ใน นำหน้าชื่อและฆ่าผู้ที่มี 'K' ขึ้นต้นชื่อ) ในไดเร็กทอรี /etc/rcX.d (โดยที่ 'X' คือระดับรันปัจจุบัน) .
เหตุการณ์เล็กๆ น้อยๆ นี้จะทำให้ระบบเริ่มทำงานทุกครั้งที่คุณเปิดเครื่อง และเหตุการณ์ที่กระตุ้นให้เกิดกระบวนการนี้เป็นสิ่งเดียวที่รับผิดชอบในการสร้างลำดับชั้น
ตอนนี้ส่วนเสริมอื่นที่กล่าวมาข้างต้นคือสาเหตุของเหตุการณ์ กระบวนการใดที่ทำให้เหตุการณ์ใดถูกระบุในไฟล์การกำหนดค่าเดียวกันของกระบวนการดังที่แสดงด้านล่างในบรรทัดเหล่านี้:
ด้านบนคือส่วนของไฟล์คอนฟิกูเรชันของกระบวนการ mountall นี่จะแสดงเหตุการณ์ที่มันส่งเสียงออกมา ชื่อของกิจกรรมคือชื่อที่ตามหลังคำว่า "กิจกรรม" เหตุการณ์อาจเป็นเหตุการณ์ที่กำหนดไว้ในไฟล์การกำหนดค่าข้างต้นหรืออาจเป็นชื่อของกระบวนการพร้อมกับคำนำหน้า 'starting' , 'started', 'stopping' หรือ 'stopped'
ดังนั้นเราจึงให้คำนิยามไว้สองคำ:
- เครื่องมือสร้างเหตุการณ์: รายการที่มีบรรทัด 'emits xxx' ในไฟล์การกำหนดค่า โดยที่ xxx คือชื่อของเหตุการณ์ที่เป็นเจ้าของหรือสร้างขึ้น
- ตัวจับเหตุการณ์: ตัวจับเหตุการณ์ที่มีเงื่อนไขเริ่มต้นหรือหยุดเป็น xxx หรือที่เริ่มต้นหรือหยุดในเหตุการณ์ที่สร้างหนึ่งในตัวสร้างเหตุการณ์
ดังนั้นลำดับชั้นจึงเป็นไปตามและการพึ่งพาระหว่างกระบวนการ:
Event generator (parent) -> Event catcher (child)
การเพิ่มความซับซ้อนให้กับลำดับชั้น
จนถึงตอนนี้ คุณต้องเข้าใจแล้วว่าลำดับชั้นของการพึ่งพา พาเรนต์-รอง ระหว่างกระบวนการนั้นถูกวางลงโดยกลไก การทริกเกอร์เหตุการณ์ ผ่านกลไกการบูตเครื่องแบบง่าย
ตอนนี้ ลำดับชั้นนี้ไม่เคยเป็นความสัมพันธ์แบบหนึ่งต่อหนึ่งที่มีพ่อแม่เพียงคนเดียวต่อลูกเพียงคนเดียว ในลำดับชั้นนี้ เราอาจมีผู้ปกครองตั้งแต่หนึ่งคนขึ้นไปสำหรับเด็กหนึ่งคน หรือกระบวนการหนึ่งที่เป็นผู้ปกครองของเด็กมากกว่าหนึ่งคน สำเร็จได้อย่างไร?? คำตอบอยู่ที่ไฟล์คอนฟิกูเรชันเอง
บรรทัดเหล่านี้นำมาจากกระบวนการ - เครือข่ายและที่นี่การเริ่มต้นในเงื่อนไขดูเหมือนจะซับซ้อนเกินไปเล็กน้อยซึ่งประกอบด้วยเหตุการณ์มากมาย ได้แก่ - local-filesystems, udevtrigger, container, ระดับการทำงาน, ระบบเครือข่าย
ระบบไฟล์ในเครื่องถูกปล่อยออกมาโดย mountall, udevtrigger เป็นชื่อของงาน, เหตุการณ์คอนเทนเนอร์ถูกปล่อยออกมาโดยการตรวจจับคอนเทนเนอร์, เหตุการณ์ runlevel ที่ปล่อยออกมาโดย rc-sysinit และเครือข่ายก็เป็นงานอีกครั้ง
ดังนั้นในลำดับชั้น เครือข่ายกระบวนการจึงเป็นลูกของ mountall, udevtrigger และการตรวจจับคอนเทนเนอร์ เนื่องจากไม่สามารถทำงานได้ต่อไป (การทำงานของกระบวนการคือบรรทัดทั้งหมดที่กำหนดไว้ภายใต้สคริปต์หรือส่วน exec ในไฟล์การกำหนดค่าของกระบวนการ) จนกว่ากระบวนการข้างต้นจะสร้างเหตุการณ์ขึ้นมา
ในทำนองเดียวกัน เราสามารถมีกระบวนการหนึ่งที่เป็นพาเรนต์ของหลายกระบวนการได้ หากเหตุการณ์ที่สร้างโดยกระบวนการหนึ่งถูกแคชไว้โดยหลาย ๆ คน
แยกแยะประเภทงาน
ตามที่กำหนดไว้ก่อนหน้านี้ เราสามารถมีงานอายุสั้น (หรืองาน งานแล้วตาย) หรืองานอายุยืน (หรือ งานประจำ) แต่จะแยกแยะได้อย่างไรระหว่าง พวกเขา??
งานที่มีเงื่อนไข 'start on' และ 'stop on' ระบุไว้ในไฟล์การกำหนดค่าและมีคำว่า 'task' อยู่ในงาน ไฟล์การกำหนดค่าคืองาน work-and-die ที่เริ่มต้นในเหตุการณ์ที่สร้างขึ้น รันสคริปต์หรือส่วน exec (ในขณะที่ดำเนินการ งานจะบล็อกเหตุการณ์ที่ทำให้เกิดเหตุการณ์เหล่านั้น) และตายหลังจากนั้นปล่อยเหตุการณ์เหล่านั้นที่พวกเขาบล็อก .
งานเหล่านั้นที่ไม่มีเงื่อนไข "หยุด" ในไฟล์การกำหนดค่าถือเป็นงานที่มีอายุการใช้งานยาวนานหรืองาน อยู่และทำงาน และงานเหล่านั้นไม่มีวันตาย ขณะนี้งานที่อยู่และทำงานสามารถจำแนกเพิ่มเติมได้เป็น:
- ผู้ที่ไม่มีเงื่อนไขการเกิดใหม่และผู้ใช้รูทสามารถฆ่าได้
- ผู้ที่มีเงื่อนไขการเกิดใหม่ในไฟล์กำหนดค่า และรีสตาร์ทหลังจากถูกฆ่า เว้นแต่งานจะเสร็จสิ้น
บทสรุป
ดังนั้น แต่ละกระบวนการใน LINUX จึงขึ้นอยู่กับบางกระบวนการและมีบางกระบวนการขึ้นอยู่กับมัน และความสัมพันธ์นี้มีหลายต่อหลายรายการ และระบุด้วยระบบพุ่งพรวดพร้อมกับรายละเอียดอื่น ๆ ของกระบวนการ