ซีรี่ส์ RHCSA: การจัดการกระบวนการใน RHEL 7: การบูต การปิดระบบ และทุกสิ่งในระหว่างนั้น - ตอนที่ 5
เราจะเริ่มบทความนี้ด้วยการแก้ไขโดยรวมและโดยย่อของสิ่งที่เกิดขึ้นนับตั้งแต่ช่วงเวลาที่คุณกดปุ่ม เปิด/ปิด เพื่อเปิดเซิร์ฟเวอร์ RHEL 7 ของคุณจนกว่าคุณจะเห็นการเข้าสู่ระบบ หน้าจอในอินเทอร์เฟซบรรทัดคำสั่ง
โปรดทราบว่า:
1. ใช้หลักการพื้นฐานเดียวกันนี้ อาจมีการปรับเปลี่ยนเล็กน้อยกับลีนุกซ์รุ่นอื่นๆ ด้วยเช่นกัน และ
2. คำอธิบายต่อไปนี้ไม่ได้มีวัตถุประสงค์เพื่อแสดงคำอธิบายที่ครบถ้วนสมบูรณ์ของกระบวนการบูต แต่เป็นเพียงข้อมูลพื้นฐานเท่านั้น
กระบวนการบูตลินุกซ์
1. POST (การทดสอบตัวเองเมื่อเปิดเครื่อง) จะเริ่มต้นและดำเนินการตรวจสอบฮาร์ดแวร์
2. เมื่อ POST เสร็จสิ้น การควบคุมระบบจะถูกส่งต่อไปยังบูตโหลดเดอร์ระยะแรก ซึ่งจัดเก็บไว้ในเซกเตอร์สำหรับบูตของฮาร์ดดิสก์ตัวใดตัวหนึ่ง (สำหรับรุ่นเก่า ระบบที่ใช้ BIOS และ MBR) หรือพาร์ติชันเฉพาะ (U) EFI
3. จากนั้นบูตโหลดเดอร์ขั้นแรกจะโหลดบูตโหลดเดอร์ขั้นที่สอง ซึ่งส่วนใหญ่มักจะเป็น GRUB (GRand Unified Boot Loader) ซึ่งอยู่ภายใน /boot ซึ่งจะโหลดเคอร์เนลและระบบไฟล์ที่ใช้ RAM เริ่มต้น (หรือที่เรียกว่า initramfs ซึ่งมีโปรแกรมและไฟล์ไบนารีที่ดำเนินการที่จำเป็นเพื่อท้ายที่สุด ติดตั้งระบบไฟล์รูทจริง)
4. เราจะพบกับหน้าจอเริ่มต้นที่ให้เราเลือกระบบปฏิบัติการและเคอร์เนลที่จะบูต:
5. เคอร์เนลจะตั้งค่าฮาร์ดแวร์ที่เชื่อมต่อกับระบบ และเมื่อติดตั้งระบบไฟล์รูทแล้ว ให้เรียกใช้กระบวนการด้วย PID 1 ซึ่งในทางกลับกันจะเริ่มต้นกระบวนการอื่นๆ และนำเสนอ เราพร้อมแจ้งการเข้าสู่ระบบ
หมายเหตุ: หากเราต้องการทำในภายหลัง เราสามารถตรวจสอบข้อมูลเฉพาะของกระบวนการนี้โดยใช้คำสั่ง dmesg และกรองเอาต์พุตโดยใช้เครื่องมือที่เรา ได้อธิบายไว้ในบทความก่อนหน้าของชุดนี้แล้ว
ในตัวอย่างข้างต้น เราใช้ คำสั่ง ps ที่รู้จักกันดีเพื่อแสดงรายการกระบวนการปัจจุบันที่กระบวนการหลัก (หรืออีกนัยหนึ่งคือ กระบวนการที่เริ่มต้นกระบวนการเหล่านั้น) เป็น systemd (ตัวจัดการระบบและบริการที่ลีนุกซ์รุ่นใหม่ส่วนใหญ่เปลี่ยนไปใช้) ระหว่างการเริ่มต้นระบบ:
ps -o ppid,pid,uname,comm --ppid=1
โปรดจำไว้ว่าธง -o (ย่อมาจาก –format) ช่วยให้คุณสามารถนำเสนอผลลัพธ์ของ ps ในรูปแบบที่กำหนดเองเพื่อให้เหมาะกับความต้องการของคุณโดยใช้ คำหลักที่ระบุในส่วน ตัวระบุรูปแบบมาตรฐาน ใน man ps
อีกกรณีหนึ่งที่คุณจะต้องกำหนดเอาต์พุตของ ps แทนที่จะใช้ค่าเริ่มต้นคือ เมื่อคุณต้องการค้นหากระบวนการที่ทำให้ CPU และ/หรือโหลดหน่วยความจำมีนัยสำคัญ และจัดเรียงตามนั้น:
ps aux --sort=+pcpu # Sort by %CPU (ascending)
ps aux --sort=-pcpu # Sort by %CPU (descending)
ps aux --sort=+pmem # Sort by %MEM (ascending)
ps aux --sort=-pmem # Sort by %MEM (descending)
ps aux --sort=+pcpu,-pmem # Combine sort by %CPU (ascending) and %MEM (descending)
บทนำสู่ SystemD
การตัดสินใจเพียงไม่กี่อย่างในโลก Linux ทำให้เกิดข้อโต้แย้งมากกว่าการนำ systemd มาใช้โดย Linux รุ่นหลักๆ ชื่อผู้สนับสนุนของ Systemd เป็นข้อได้เปรียบหลักตามข้อเท็จจริงต่อไปนี้:
อ่านเพิ่มเติม: เรื่องราวเบื้องหลัง 'init' และ 'systemd'
1. Systemd ช่วยให้สามารถประมวลผลแบบขนานได้มากขึ้นในระหว่างการเริ่มต้นระบบ (ซึ่งตรงข้ามกับ SysVinit รุ่นเก่าซึ่งมีแนวโน้มที่จะช้าลงเสมอเนื่องจากเริ่มกระบวนการทีละรายการ ให้ตรวจสอบ หากอันหนึ่งขึ้นอยู่กับอันอื่น แล้วรอให้ daemons เปิดตัวเพื่อให้สามารถเริ่มบริการเพิ่มเติมได้) และ
2. ทำงานเป็นการจัดการทรัพยากรแบบไดนามิกในระบบที่ทำงานอยู่ ดังนั้น บริการต่างๆ จะเริ่มทำงานเมื่อจำเป็น (เพื่อหลีกเลี่ยงการใช้ทรัพยากรระบบหากไม่ได้ใช้งาน) แทนที่จะเปิดใช้งานโดยไม่มีเหตุผลที่ถูกต้องระหว่างการบูต
3. ความเข้ากันได้แบบย้อนหลังกับสคริปต์ SysViit
Systemd ถูกควบคุมโดยยูทิลิตี้ systemctl หากคุณมาจากพื้นหลัง SysViit คุณจะคุ้นเคยกับ:
- เครื่องมือ บริการ ซึ่ง - ในระบบเก่าเหล่านั้น - ถูกใช้เพื่อจัดการสคริปต์ SysVinit และ
- ยูทิลิตี้ chkconfig ซึ่งทำหน้าที่ในการอัปเดตและสอบถามข้อมูลระดับรันสำหรับบริการของระบบ
- ปิดเครื่อง ซึ่งคุณต้องใช้หลายครั้งเพื่อรีสตาร์ทหรือหยุดระบบที่ทำงานอยู่
ตารางต่อไปนี้แสดงความคล้ายคลึงกันระหว่างการใช้เครื่องมือเดิมเหล่านี้กับ systemctl:
Legacy tool | Systemctl equivalent | Description |
service name start | systemctl start name | Start name (where name is a service) |
service name stop | systemctl stop name | Stop name |
service name condrestart | systemctl try-restart name | Restarts name (if it’s already running) |
service name restart | systemctl restart name | Restarts name |
service name reload | systemctl reload name | Reloads the configuration for name |
service name status | systemctl status name | Displays the current status of name |
service –status-all | systemctl | Displays the status of all current services |
chkconfig name on | systemctl enable name | Enable name to run on startup as specified in the unit file (the file to which the symlink points). The process of enabling or disabling a service to start automatically on boot consists in adding or removing symbolic links inside the /etc/systemd/system directory. |
chkconfig name off | systemctl disable name | Disables name to run on startup as specified in the unit file (the file to which the symlink points) |
chkconfig –list name | systemctl is-enabled name | Verify whether name (a specific service) is currently enabled |
chkconfig –list | systemctl –type=service | Displays all services and tells whether they are enabled or disabled |
shutdown -h now | systemctl poweroff | Power-off the machine (halt) |
shutdown -r now | systemctl reboot | Reboot the system |
Systemd ยังแนะนำแนวคิดของหน่วย (ซึ่งอาจเป็นได้ทั้งบริการ จุดเชื่อมต่อ อุปกรณ์ หรือซ็อกเก็ตเครือข่าย) และเป้าหมาย (ซึ่งเป็นวิธีที่ systemd จัดการเพื่อเริ่มกระบวนการที่เกี่ยวข้องหลายอย่างพร้อมกัน เวลา และสามารถพิจารณาได้ - แม้ว่าจะไม่เท่ากัน - เท่ากับระดับการทำงานในระบบ ที่ใช้ SysViit
สรุป
งานอื่นๆ ที่เกี่ยวข้องกับการจัดการกระบวนการรวมถึงแต่ไม่จำกัดเพียงความสามารถในการ:
1. ปรับลำดับความสำคัญในการดำเนินการเท่าที่การใช้ทรัพยากรระบบเกี่ยวข้องกับกระบวนการ:
ซึ่งสามารถทำได้ผ่านยูทิลิตี renice ซึ่งจะเปลี่ยนแปลงลำดับความสำคัญของกำหนดการของกระบวนการที่ทำงานอยู่ตั้งแต่หนึ่งกระบวนการขึ้นไป กล่าวง่ายๆ ก็คือ ลำดับความสำคัญของกำหนดการเป็นคุณลักษณะที่ช่วยให้เคอร์เนล (มีอยู่ในเวอร์ชัน => 2.6) สามารถจัดสรรทรัพยากรระบบตามลำดับความสำคัญในการดำเนินการที่กำหนด (หรือความดี ในช่วงจาก -20 ถึง 19) ของกระบวนการที่กำหนด
ไวยากรณ์พื้นฐานของ renice มีดังนี้:
renice [-n] priority [-gpu] identifier
ในคำสั่งทั่วไปด้านบน อาร์กิวเมนต์แรกคือค่าลำดับความสำคัญที่จะใช้ ในขณะที่อาร์กิวเมนต์อื่นสามารถตีความได้ว่าเป็น IDs กระบวนการ (ซึ่งเป็นการตั้งค่าเริ่มต้น) ID กลุ่มกระบวนการ ID ผู้ใช้ หรือ ชื่อผู้ใช้ ผู้ใช้ปกติ (นอกเหนือจากรูท) สามารถแก้ไขลำดับความสำคัญของกำหนดการของกระบวนการที่เขาหรือเธอเป็นเจ้าของเท่านั้น และเพิ่มระดับความดีเท่านั้น (ซึ่งหมายถึงการใช้ทรัพยากรระบบน้อยลง)
2. ฆ่า (หรือขัดจังหวะการดำเนินการตามปกติ) ของกระบวนการตามความจำเป็น:
ในแง่ที่แม่นยำยิ่งขึ้น การฆ่ากระบวนการถือเป็นการส่งสัญญาณให้ดำเนินการเสร็จสิ้นอย่างสวยงาม (SIGTERM=15) หรือทันที (SIGKILL=9) ผ่านการฆ่าหรือ pkill คำสั่ง
ความแตกต่างระหว่างเครื่องมือทั้งสองนี้คือ เครื่องมือแรกใช้เพื่อยุติกระบวนการเฉพาะหรือกลุ่มกระบวนการทั้งหมด ในขณะที่เครื่องมือหลังอนุญาตให้คุณทำสิ่งเดียวกันตามชื่อและคุณลักษณะอื่นๆ
นอกจากนี้ pkill ยังมาพร้อมกับ pgrep ซึ่งจะแสดง PID ที่จะได้รับผลกระทบหากใช้ pkill ตัวอย่างเช่น ก่อนที่จะรัน:
pkill -u gacanepa
การดูอย่างรวดเร็วว่า PID ใดที่ gacanepa เป็นเจ้าของอาจเป็นประโยชน์:
pgrep -l -u gacanepa
ตามค่าเริ่มต้น ทั้ง kill และ pkill จะส่งสัญญาณ SIGTERM ไปยังกระบวนการ ดังที่เราได้กล่าวไว้ข้างต้น สัญญาณนี้สามารถถูกเพิกเฉยได้ (ในขณะที่กระบวนการดำเนินการเสร็จสิ้นหรือตลอดไป) ดังนั้นเมื่อคุณต้องการหยุดกระบวนการที่ทำงานอยู่อย่างจริงจังด้วยเหตุผลที่ถูกต้อง คุณจะต้องระบุ SIGKILL สัญญาณบนบรรทัดคำสั่ง:
kill -9 identifier # Kill a process or a process group
kill -s SIGNAL identifier # Idem
pkill -s SIGNAL identifier # Kill a process by name or other attributes
บทสรุป
ในบทความนี้ เราได้อธิบายพื้นฐานของกระบวนการบูตในระบบ RHEL 7 และวิเคราะห์เครื่องมือบางอย่างที่พร้อมใช้งานเพื่อช่วยคุณในการจัดการกระบวนการโดยใช้ยูทิลิตี้ทั่วไป และคำสั่งเฉพาะ systemd
โปรดทราบว่ารายการนี้ไม่ได้มีวัตถุประสงค์เพื่อครอบคลุมหัวข้อนี้ทั้งหมด ดังนั้นคุณสามารถเพิ่มเครื่องมือและคำสั่งที่คุณต้องการลงในบทความนี้ได้โดยใช้แบบฟอร์มความคิดเห็นด้านล่าง ยินดีต้อนรับคำถามและความคิดเห็นอื่น ๆ