Linux บู๊ทส์

ปรากฎว่ากระบวนการบูตมีไม่มาก:

1. บูตโหลดเดอร์ค้นหาอิมเมจเคอร์เนลบน diskโหลดลงในหน่วยความจำแล้วเริ่ม
2. เคอร์เนลเริ่มต้นอุปกรณ์และคนขับรถของตน
3. เคอร์เนลจะเมานต์ไฟล์รูทsystem.
4. เคอร์เนลเริ่ม init โปรแกรมที่เรียกว่า
5. init ชุดส่วนที่เหลือของกระบวนการในการเคลื่อนไหว
6. กระบวนการสุดท้ายที่ init เริ่มต้นเป็นส่วนหนึ่งของลำดับการบูตช่วยให้คุณสามารถเข้าสู่ระบบ

การระบุแต่ละขั้นตอนของกระบวนการบูตนั้นมีค่าอย่างยิ่งในการแก้ไขปัญหาการบูตและทำความเข้าใจกับไฟล์ system โดยรวม ในการเริ่มต้นให้เปิดศูนย์บนบูตโหลดเดอร์ซึ่งเป็นหน้าจอเริ่มต้นหรือข้อความแจ้งที่คุณได้รับหลังจากที่คอมพิวเตอร์ทำการทดสอบตัวเองเมื่อเปิดเครื่องโดยถามว่าปฏิบัติการใด system วิ่ง. หลังจากที่คุณเลือกแล้ว บูตโหลดเดอร์จะเรียกใช้ Linux เคอร์เนล, มอบการควบคุมของ system ไปยังเคอร์เนล

มีการอภิปรายรายละเอียดของเคอร์เนลอื่น ๆ ในหนังสือเล่มนี้คัดลอกมาจากที่บทความนี้ บทความนี้จะครอบคลุมถึง ขั้นตอนการเริ่มต้น kernelขั้นตอนที่เคอร์เนลพิมพ์ข้อความจำนวนมากเกี่ยวกับฮาร์ดแวร์ที่มีอยู่ในไฟล์ system. เคอร์เนลเริ่มต้น init หลังจากที่แสดงข้อความที่ประกาศว่าเคอร์เนลได้ติดตั้งไฟล์ ไฟล์รูทsystem:

วีเอฟเอ: ติดตั้ง รูท (ext2 ไฟล์system) อ่านเท่านั้น.

หลังจากนั้นไม่นานคุณจะเห็นข้อความเกี่ยวกับการเริ่มต้นตามด้วย system ข้อความเริ่มต้นบริการและในที่สุดคุณจะได้รับแจ้งการเข้าสู่ระบบบางประเภท

หมายเหตุ : บน หมวกสีแดง Linuxโน้ตเริ่มต้นนั้นชัดเจนเป็นพิเศษเพราะ "ยินดีต้อนรับ" คุณสู่เร้ดแฮท Linux. ” หลังจากนั้นข้อความทั้งหมดจะแสดงความสำเร็จหรือความล้มเหลวในวงเล็บที่ด้านขวามือของหน้าจอ

ส่วนใหญ่ของบทนี้กับข้อเสนอที่ init เพราะมันเป็นส่วนหนึ่งของลำดับการบูตที่เป็นคุณมีการควบคุม
init

ไม่มีอะไรพิเศษเกี่ยวกับ init เป็นโปรแกรมที่เหมือนกับโปรแกรมอื่นๆ ใน Linux systemและคุณจะพบมันใน / sbin พร้อมกับอื่น ๆ system ไบนารี จุดประสงค์หลักของการเริ่มต้นคือการเริ่มต้นและหยุดโปรแกรมอื่น ๆ ตามลำดับเฉพาะ สิ่งที่คุณต้องรู้คือลำดับนี้ทำงานอย่างไร

มีรูปแบบที่แตกต่างกันเล็กน้อย แต่ส่วนใหญ่ Linux การกระจายใช้ System วีสไตล์พูดถึงที่นี่ การแจกแจงบางรุ่นใช้เวอร์ชันที่ง่ายกว่าซึ่งคล้ายกับ BSD init แต่คุณไม่น่าจะพบสิ่งนี้

ระดับการทำงาน

ในเวลาใดก็ตามบน a Linux systemชุดพื้นฐานของกระบวนการกำลังทำงานอยู่ สถานะนี้ของ machine เรียกว่า runlevel และแสดงด้วยตัวเลขตั้งแต่ 0 ถึง 6 system ใช้เวลาส่วนใหญ่ใน runlevel เดียว อย่างไรก็ตามเมื่อคุณปิดไฟล์ machine down, init สลับไปยังระดับการวิ่งที่แตกต่างกันเพื่อที่จะยุติ system บริการอย่างเป็นระเบียบและบอกให้เคอร์เนลหยุดทำงาน อีกระดับหนึ่งสำหรับผู้ใช้คนเดียว modeกล่าวถึงในภายหลัง

วิธีที่ง่ายที่สุดในการจัดการกับ runlevels คือการตรวจสอบไฟล์การกำหนดค่าเริ่มต้น /etc/inittab มองหาบรรทัดดังต่อไปนี้:

ID: 5: initdefault:

บรรทัดนี้หมายความว่าไฟล์ default runlevel บน system คือ 5 บรรทัดทั้งหมดในไฟล์ inittab ใช้แบบฟอร์มนี้ โดยมีสี่ฟิลด์คั่นด้วยเครื่องหมายทวิภาคตามลำดับต่อไปนี้:
# ตัวระบุที่ไม่ซ้ำกัน (สตริงสั้นเช่นรหัสในตัวอย่างก่อนหน้านี้)
# จำนวน runlevel บังคับ (s)
# การดำเนินการที่ init ควรทำ (ในตัวอย่างก่อนหน้านี้การดำเนินการคือการตั้งค่า default runlevel ถึง 5)
# คำสั่งในการดำเนินการ (อุปกรณ์เสริม)

ไม่มีคำสั่งให้ดำเนินการใน init ก่อนหน้านี้default ตัวอย่างเนื่องจากคำสั่งไม่สมเหตุสมผลในบริบทของการตั้งค่า default ระดับการวิ่ง มองลงไปใน inittab อีกเล็กน้อยจนกว่าคุณจะเห็นบรรทัดดังนี้:

l5: 5: รอ: /etc/rc.d/rc 5

บรรทัดนี้เรียกใช้ไฟล์ system การกำหนดค่าและบริการผ่านไดเร็กทอรี rc * .d และ init.d คุณจะเห็นได้ว่า init ถูกตั้งค่าให้รันคำสั่งที่เรียกว่า /etc/rc.d/rc 5 เมื่ออยู่ในระดับรันเลเวล 5 การดำเนินการ wait จะบอกว่า init รันคำสั่งเมื่อใดและอย่างไร: รัน rc 5 ครั้งเดียวเมื่อ enterเข้ารันเลเวล 5 แล้วรอให้คำสั่งนี้เสร็จสิ้นก่อนที่จะทำอย่างอื่น

มีการกระทำที่แตกต่างกันหลายประการใน addการเริ่มต้นdefault และรอโดยเฉพาะอย่างยิ่งเกี่ยวกับการจัดการพลังงานและหน้าคู่มือ inittab (5) จะบอกคุณเกี่ยวกับสิ่งเหล่านี้ทั้งหมด สิ่งที่คุณน่าจะพบมากที่สุดมีอธิบายไว้ในส่วนต่อไปนี้

respawn

การเกิดใหม่ทำให้ init เรียกใช้คำสั่งที่ตามมา และหากคำสั่งดำเนินการเสร็จสิ้น ให้เรียกใช้อีกครั้ง คุณอาจเห็นบางอย่างที่คล้ายกับบรรทัดนี้ในไฟล์ inittab ของคุณ:

1: 2345: respawn: / sbin / mingetty tty1

โปรแกรมเก็ตตี้ให้แจ้งการเข้าสู่ระบบ บรรทัดก่อนหน้าเป็นครั้งแรกคอนโซลเสมือน (/ dev / tty1) หนึ่งที่คุณเห็นเมื่อคุณกด Alt-Control-Alt-F1 หรือ F1 การกระทำที่เกิดใหม่นำกลับเข้าสู่ระบบแจ้งหลังจากที่คุณออกจากระบบ

ctrlที่อื่น

พื้นที่ ctrlการดำเนินการ altdel ควบคุมสิ่งที่ system ทำเมื่อคุณกด CONTROL-ALT-DELETE บนคอนโซลเสมือน ส่วนใหญ่ systems นี่คือคำสั่งรีบูตบางประเภทโดยใช้คำสั่ง shutdown

sysinit

การดำเนินการ sysinit เป็นสิ่งแรกที่ init ควรทำงานเมื่อเริ่มต้นขึ้นก่อน enterในทุกระดับ

วิธีการกระบวนการในระดับการทำงานเริ่มต้น

ตอนนี้คุณพร้อมที่จะเรียนรู้วิธีเริ่มต้นไฟล์ system บริการก่อนที่จะให้คุณเข้าสู่ระบบ เรียกคืนบรรทัด inittab จากก่อนหน้านี้:

l5: 5: รอ: /etc/rc.d/rc 5

เส้นเล็ก ๆ นี้จะเรียกโปรแกรมอื่น ๆ อีกมากมาย RC ย่อมาจากคำสั่งเรียกใช้และคุณจะได้ยินคนอ้างถึงคำสั่งที่เป็นสคริปต์โปรแกรมหรือบริการ เพื่อที่จะมีคำสั่งเหล่านี้หรือไม่?

สำหรับ runlevel 5 ในตัวอย่างนี้คำสั่งอาจอยู่ใน /etc/rc.d/rc5.d หรือ /etc/rc5.d Runlevel 1 ใช้ rc1.d, runlevel 2 ใช้ rc2.d และอื่น ๆ คุณอาจพบสิ่งต่อไปนี้ items ในไดเร็กทอรี rc5.d:

S10sysklogd S20ppp S99gpm
S12kerneld S25netstd_nfs S99httpd
S15netstd_init S30netstd_misc S99rmnologin
S18netbase S45pcmcia S99sshd
S20acct S89atd
S20logoutd S89cron

คำสั่งเริ่มต้น 5 RC โปรแกรม runlevel ในไดเรกทอรีนี้โดยใช้คำสั่งในเขตเวลา GMT:

บ้าน S10sysklogd
บ้าน S12kerneld
บ้าน S15netstd_init
บ้าน S18netbase
...
บ้าน S99sshd

สังเกตอาร์กิวเมนต์เริ่มต้นในแต่ละคำสั่ง S ในชื่อคำสั่งหมายความว่าคำสั่งควรรันเมื่อเริ่มต้น modeและตัวเลข (00 ถึง 99) กำหนดตำแหน่งในลำดับที่ rc เริ่มคำสั่ง

คำสั่ง .d RC * มักจะเปลือกสคริปต์ว่าโปรแกรมเริ่มต้นใน sbin / หรือ / usr / sbin ปกติคุณสามารถคิดออกว่าหนึ่งในคำสั่งที่ไม่จริงโดยดูที่สคริปต์ที่มีน้อยหรือเพจเจอร์โปรแกรมอื่น

คุณสามารถเริ่มบริการเหล่านี้ด้วยตนเอง ตัวอย่างเช่นหากคุณต้องการเริ่มโปรแกรม httpd Web server ด้วยตนเองให้รัน S99httpd start ในทำนองเดียวกันหากคุณจำเป็นต้องฆ่าหนึ่งในบริการเมื่อไฟล์ machine เปิดอยู่คุณสามารถรันคำสั่งในไดเร็กทอรี rc * .d ด้วยอาร์กิวเมนต์ stop (เช่น S99httpd stop เป็นต้น)

ไดเร็กทอรี rc*.d บางไดเร็กทอรีมีคำสั่งที่ขึ้นต้นด้วย K (สำหรับ "kill" หรือ stop mode). ในกรณีนี้ rc รันคำสั่งพร้อมกับหยุดอาร์กิวเมนต์แทนการเริ่ม คุณมักจะพบคำสั่ง K ใน runlevels ที่ปิด system ลง

Adding และถอดบริการ

ถ้าคุณต้องการ addลบหรือแก้ไขบริการในไดเร็กทอรี rc*.d คุณต้องตรวจสอบไฟล์ภายในให้ละเอียดยิ่งขึ้น รายการยาวเผยให้เห็นโครงสร้างดังนี้:

lrwxrwxrwx . . S10sysklogd -> ../init.d/sysklogd
lrwxrwxrwx . . S12kerneld -> ../init.d/kerneld
lrwxrwxrwx . . S15netstd_init -> ../init.d/netstd_init
lrwxrwxrwx . . S18netbase -> ../init.d/netbase
...

คำสั่งในไดเร็กทอรี rc*.d เป็นลิงก์สัญลักษณ์ไปยังไฟล์ในไดเร็กทอรี init.d ซึ่งโดยปกติจะอยู่ใน /etc หรือ /etc/rc.d Linux การแจกแจงมีลิงก์เหล่านี้เพื่อให้สามารถใช้สคริปต์เริ่มต้นเดียวกันสำหรับระดับการทำงานทั้งหมด การประชุมนี้ไม่ได้หมายความว่าเป็นข้อกำหนด แต่มักจะทำให้องค์กรง่ายขึ้นเล็กน้อย

เพื่อป้องกันไม่ให้คำสั่งใดคำสั่งหนึ่งในไดเร็กทอรี init.d ทำงานใน runlevel ใดระดับหนึ่ง คุณอาจนึกถึงการลบลิงก์สัญลักษณ์ในไดเร็กทอรี rc * .d ที่เหมาะสม วิธีนี้ใช้ได้ แต่หากคุณทำผิดพลาดและจำเป็นต้องใส่ลิงก์กลับเข้าที่ คุณอาจมีปัญหาในการจำชื่อที่แน่นอนของลิงก์ ดังนั้น คุณไม่ควรลบลิงก์ในไดเร็กทอรี rc * .d แต่ควร add ขีดล่าง (_) ที่จุดเริ่มต้นของชื่อลิงค์ดังนี้:

MV S99httpd _S99httpd

ในเวลาบูต rc จะละเว้น _S99httpd เนื่องจากไม่ได้ขึ้นต้นด้วย S หรือ K นอกจากนี้ชื่อเดิมยังคงชัดเจนและคุณสามารถเข้าถึงคำสั่งได้อย่างรวดเร็วหากคุณไม่สะดวกและจำเป็นต้องเริ่มด้วยมือ

ไปยัง add คุณต้องสร้างสคริปต์เหมือนกับบริการอื่นๆ ในไดเร็กทอรี init.d แล้วสร้างลิงก์สัญลักษณ์ในไดเร็กทอรี rc * .d ที่ถูกต้อง วิธีที่ง่ายที่สุดในการเขียนสคริปต์คือการตรวจสอบสคริปต์ที่มีอยู่แล้วใน init.d ทำสำเนาของสคริปต์ที่คุณเข้าใจ และแก้ไขสำเนา

เมื่อ addสำหรับบริการ ตรวจสอบให้แน่ใจว่าคุณได้เลือกตำแหน่งที่เหมาะสมในลำดับการบู๊ตเพื่อเริ่มบริการ หากบริการเริ่มทำงานเร็วเกินไป บริการอาจไม่ทำงาน เนื่องจากต้องพึ่งพาบริการอื่นๆ สำหรับบริการที่ไม่จำเป็น ส่วนใหญ่ systems administratorชอบตัวเลขในยุค 90 หลังจากบริการส่วนใหญ่ที่มาพร้อมกับ system.

Linux การแจกแจงมักจะมาพร้อมกับคำสั่งเพื่อเปิดใช้งานและปิดใช้งานบริการในไดเร็กทอรี rc * .d ตัวอย่างเช่น ใน Debian คำสั่งคือ update-rc.d และใน Red Hat Linuxคำสั่งคือ chkconfig อินเทอร์เฟซผู้ใช้แบบกราฟิกก็มีให้เช่นกัน การใช้โปรแกรมเหล่านี้ช่วยให้ไดเร็กทอรีเริ่มต้นทำงานสอดคล้องกันและช่วยในการอัปเกรด

คำแนะนำ: หนึ่งในที่พบบ่อยที่สุด Linux installปัญหาของเอชั่นคือเซิร์ฟเวอร์ XFree86 ที่กำหนดค่าไม่ถูกต้องซึ่งเปิดและปิด ซึ่งทำให้ making system ใช้ไม่ได้บนคอนโซล หากต้องการหยุดพฤติกรรมนี้ ให้บูตเป็นผู้ใช้รายเดียว mode และเปลี่ยนบริการ runlevel หรือ runlevel ของคุณ ค้นหาสิ่งที่มี xdm, gdm หรือ kdm ในไดเร็กทอรี rc*.d หรือ /etc/inittab ของคุณ

การควบคุม init

ในบางครั้ง คุณต้องเริ่มต้นเล็กน้อยเพื่อบอกให้เปลี่ยนระดับรัน อ่านไฟล์ inittab อีกครั้ง หรือเพียงแค่ shut down system. เนื่องจาก init เป็นกระบวนการแรกเสมอในไฟล์ systemรหัสกระบวนการคือ 1 เสมอ

คุณสามารถควบคุม init กับ telinit ตัวอย่างเช่นถ้าคุณต้องการที่จะเปลี่ยนไป runlevel 3 ใช้คำสั่งนี้:

telinit 3

เมื่อเปลี่ยน runlevels init จะพยายามหยุดกระบวนการใดๆ ที่ไม่ได้อยู่ในไฟล์ inittab สำหรับ runlevel ใหม่ ดังนั้น คุณควรระมัดระวังเกี่ยวกับการเปลี่ยน runlevels

เมื่อคุณต้องการ add หรือลบงานที่เกิดใหม่หรือทำการเปลี่ยนแปลงอื่นใดกับไฟล์ inittab คุณต้องแจ้ง init เกี่ยวกับการเปลี่ยนแปลงและทำให้ไฟล์อ่านซ้ำ บางคนใช้ kill -HUP 1 เพื่อบอกให้ init ทำสิ่งนี้ วิธีดั้งเดิมนี้ใช้ได้กับ Unix เกือบทุกเวอร์ชัน ตราบใดที่คุณพิมพ์ถูกต้อง อย่างไรก็ตาม คุณยังสามารถเรียกใช้คำสั่ง telinit นี้:

telinit Q

คุณยังสามารถใช้ telinit s เพื่อเปลี่ยนเป็นผู้ใช้รายเดียว mode.

ปิด

init ยังควบคุมวิธีการ system ปิดและรีบูต วิธีที่เหมาะสมในการ shut down a Linux machine คือการใช้คำสั่ง shutdown

มีสองวิธีพื้นฐานในการใช้การปิดระบบ หากคุณหยุด systemมันจะปิดไฟล์ macลดระดับลงและทำให้มันลง เพื่อให้ machine หยุดทันทีใช้คำสั่งนี้:

ปิด -h ในขณะนี้

ส่วนใหญ่ modern macไฮน์ด้วย . เวอร์ชันล่าสุดที่สมเหตุสมผล Linux, หยุดตัดอำนาจไปที่ macไฮน์ คุณยังสามารถรีบูตไฟล์ macไฮน์ สำหรับการรีบูตให้ใช้ -r แทน -h

กระบวนการปิดเครื่องใช้เวลาหลายวินาที คุณไม่ควรรีเซ็ตหรือปิดเครื่อง macในช่วงนี้

ในตัวอย่างก่อนหน้านี้เป็นเวลาที่จะ shut down. อาร์กิวเมนต์นี้จำเป็น แต่มีหลายวิธีในการระบุ หากคุณต้องการ macลดลงในอนาคตวิธีหนึ่งคือการใช้ + n โดยที่ n คือจำนวนนาทีที่ปิดเครื่องควรรอก่อนที่จะทำงาน สำหรับอื่นๆ optionsดูที่หน้าคู่มือการปิดระบบ (8)

ที่จะทำให้ system รีบูตใน 10 นาทีเรียกใช้คำสั่งนี้:

ปิด -R + 10

On Linux, การปิดระบบจะแจ้งให้ทุกคนที่เข้าสู่ระบบว่า machine กำลังลดลง แต่ทำงานได้จริงเล็กน้อย หากคุณระบุเวลานอกเหนือจากนี้ การปิดระบบจะสร้างไฟล์ชื่อ /etc/nologin เมื่อไฟล์นี้ปรากฏขึ้น system ห้ามทุกคนเข้าสู่ระบบยกเว้น superuser

เมื่อ system ในที่สุดเวลาปิดเครื่องก็มาถึงการปิดเครื่องจะบอกให้ init เปลี่ยนเป็น runlevel 0 เพื่อหยุดและ runlevel 6 เพื่อรีบูต เมื่อเริ่มต้น enters runlevel 0 หรือ 6 สิ่งต่อไปนี้เกิดขึ้นทั้งหมดซึ่งคุณสามารถตรวจสอบได้โดยดูที่สคริปต์ภายใน rc0.d และ rc6.d:

1 ว่ามันฆ่ากระบวนการ init ทุกความสามารถ (มันจะเมื่อเปลี่ยนระดับการทำงานอื่น ๆ )

# คำสั่ง rc0.d / rc6.d เริ่มต้นทำงานการล็อก system ไฟล์เข้าที่และเตรียมการอื่นๆ สำหรับการปิดเครื่อง
# คำสั่ง rc0.d/rc6.d ถัดไปยกเลิกการต่อเชื่อมไฟล์ทั้งหมดsystems นอกเหนือจากรูท
# คำสั่งเพิ่มเติม rc0.d/rc6.d ประกอบไฟล์รูทใหม่system อ่านเท่านั้น.
# คำสั่ง rc0.d/rc6.d ยังคงเขียนข้อมูลที่บัฟเฟอร์ทั้งหมดออกไปยังไฟล์system ด้วยโปรแกรมซิงค์
# สุดท้ายคำสั่ง rc0.d / rc6.d บอกเคอร์เนลที่จะเริ่มต้นหรือหยุดด้วยการรีบูต, หยุดหรือโปรแกรม poweroff

โปรแกรมรีบูตและหยุดทำงานแตกต่างกันไปในแต่ละระดับการทำงานซึ่งอาจทำให้เกิดความสับสน โดย default, โปรแกรมเหล่านี้เรียกปิดด้วย -r หรือ -h optionsแต่ถ้า system อยู่ที่ระดับการหยุดทำงานหรือรีบูตแล้วโปรแกรมจะบอกให้เคอร์เนลปิดตัวเองทันที หากคุณต้องการปิดไฟล์ macรีบร้อน (โดยไม่คำนึงถึงความเสียหายที่อาจเกิดขึ้นจากการปิดระบบที่ไม่เป็นระเบียบ) ให้ใช้ตัวเลือก -f

เป็นคนรักเทคโนโลยี ฉันเขียนบทความด้วยความสุขบน StealthSettings.com ตั้งแต่ปี 2006 ฉันมีประสบการณ์ที่หลากหลายในระบบปฏิบัติการ: macOS, Windows, และ Linux, รวมถึงภาษาโปรแกรมและแพลตฟอร์มบล็อก (WordPress) และสำหรับร้านค้าออนไลน์ (WooCommerce, Magento, PrestaShop)

แสดงความคิดเห็น