LFCS: วิธีกำหนดค่าและแก้ไขปัญหา Grand Unified Bootloader (GRUB) - ตอนที่ 13
เนื่องจากการเปลี่ยนแปลงล่าสุดในวัตถุประสงค์การสอบรับรอง LFCS ที่มีผลตั้งแต่ 2 กุมภาพันธ์ 2016 เราจึงเพิ่มหัวข้อที่จำเป็นลงในซีรีส์ LFCS ที่เผยแพร่ที่นี่ เพื่อเตรียมพร้อมสำหรับการสอบนี้ ขอแนะนำให้ติดตามซีรีส์ LFCE เช่นกัน
ในบทความนี้เราจะแนะนำคุณให้รู้จักกับ GRUB และอธิบายว่าเหตุใดจึงมีความจำเป็นในการบูตโหลดเดอร์และจะเพิ่มความคล่องตัวให้กับระบบได้อย่างไร
กระบวนการบูต Linux ตั้งแต่เวลาที่คุณกดปุ่มเปิดปิดของคอมพิวเตอร์จนกว่าคุณจะได้รับระบบที่ทำงานได้อย่างสมบูรณ์ตามลำดับระดับสูงนี้:
- 1. กระบวนการที่เรียกว่า POST (การทดสอบตัวเองในการเปิดเครื่อง) จะทำการตรวจสอบโดยรวมเกี่ยวกับส่วนประกอบฮาร์ดแวร์ของคอมพิวเตอร์ของคุณ
- 2. เมื่อ POST เสร็จสิ้น ระบบจะส่งการควบคุมไปยังบูตโหลดเดอร์ ซึ่งจะโหลดเคอร์เนล Linux ในหน่วยความจำ (พร้อมกับ initramfs ) และดำเนินการ ตัวโหลดบูตที่ใช้มากที่สุดใน Linux คือ GRand Unified Boot loader หรือเรียกสั้น ๆ ว่า GRUB
- 3. เคอร์เนลตรวจสอบและเข้าถึงฮาร์ดแวร์ จากนั้นรันกระบวนการเริ่มต้น (ส่วนใหญ่รู้จักกันในชื่อทั่วไป “init ”) ซึ่งจะทำการบูตระบบให้เสร็จสิ้นโดยการเริ่มต้น บริการ
ในตอนที่ 7 ของซีรีส์นี้ (“SysVinit, Upstart และ Systemd”) เราได้แนะนำระบบการจัดการบริการและเครื่องมือที่ใช้โดย Linux รุ่นใหม่ คุณอาจต้องการตรวจสอบบทความนั้นก่อนที่จะดำเนินการต่อไป
ขอแนะนำ GRUB Boot Loader
GRUB เวอร์ชันหลักสองเวอร์ชัน (v1 บางครั้งเรียกว่า GRUB Legacy และ v2) สามารถพบได้ในระบบสมัยใหม่ แม้ว่าส่วนใหญ่จะ การแจกแจงใช้ v2 เป็นค่าเริ่มต้นในเวอร์ชันล่าสุด มีเพียง Red Hat Enterprise Linux 6 และอนุพันธ์ของมันเท่านั้นที่ยังคงใช้ v1 ในปัจจุบัน
ดังนั้น เราจะเน้นที่คุณลักษณะของ v2 ในคู่มือนี้เป็นหลัก
ไม่ว่า GRUB จะเป็นเวอร์ชันใดก็ตาม บูตโหลดเดอร์จะอนุญาตให้ผู้ใช้:
- 1) แก้ไขวิธีการทำงานของระบบโดยการระบุเคอร์เนลที่แตกต่างกันที่จะใช้
- 2) เลือกระหว่างระบบปฏิบัติการสำรองที่จะบูต และ
- 3) เพิ่มหรือแก้ไขบทการกำหนดค่าเพื่อเปลี่ยนตัวเลือกการบูต เหนือสิ่งอื่นใด
ปัจจุบัน GRUB ได้รับการดูแลโดยโครงการ GNU และได้รับการบันทึกไว้อย่างดีในเว็บไซต์ของพวกเขา คุณควรใช้เอกสารอย่างเป็นทางการของ GNU ในขณะที่อ่านคู่มือนี้
เมื่อระบบบู๊ต คุณจะเห็นหน้าจอ GRUB ต่อไปนี้ในคอนโซลหลัก ในตอนแรก คุณจะได้รับแจ้งให้เลือกระหว่างเคอร์เนลสำรอง (ตามค่าเริ่มต้น ระบบจะบูตโดยใช้เคอร์เนลล่าสุด) และได้รับอนุญาตให้ป้อนบรรทัดคำสั่ง GRUB (ด้วย c
) หรือแก้ไขตัวเลือกการบูต (โดยการกดปุ่ม e
)
สาเหตุหนึ่งที่คุณควรพิจารณาบูตด้วยเคอร์เนลรุ่นเก่าก็คืออุปกรณ์ฮาร์ดแวร์ที่เคยทำงานอย่างถูกต้องและได้เริ่มต้น “การทำงาน ” หลังจากอัปเกรด (ดูลิงก์นี้ใน AskUbuntu ฟอรั่มเป็นตัวอย่าง)
การกำหนดค่า GRUB v2 ถูกอ่านขณะบูตจาก /boot/grub/grub.cfg
หรือ /boot/grub2/grub.cfg
ในขณะที่ /boot/grub/grub.conf
หรือ /boot/grub/menu.lst
ใช้ใน v1 ไฟล์เหล่านี้ไม่สามารถแก้ไขได้ด้วยมือ แต่ได้รับการแก้ไขตามเนื้อหาของ /etc/default/grub
และไฟล์ที่พบใน /etc/grub.d
ใน CentOS 7 นี่คือไฟล์การกำหนดค่าที่สร้างขึ้นเมื่อติดตั้งระบบครั้งแรก:
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
นอกจากเอกสารออนไลน์แล้ว คุณยังสามารถค้นหาคู่มือ GNU GRUB ได้โดยใช้ข้อมูลดังต่อไปนี้:
info grub
หากคุณสนใจตัวเลือกที่มีให้สำหรับ /etc/default/grub โดยเฉพาะ คุณสามารถเรียกใช้ส่วนการกำหนดค่าได้โดยตรง:
info -f grub -n 'Simple configuration'
เมื่อใช้คำสั่งด้านบน คุณจะพบว่า GRUB_TIMEOUT
ตั้งเวลาระหว่างช่วงเวลาที่หน้าจอเริ่มต้นปรากฏขึ้นและการบูตอัตโนมัติของระบบจะเริ่มขึ้น เว้นแต่ผู้ใช้จะขัดจังหวะ เมื่อตัวแปรนี้ถูกตั้งค่าเป็น -1
การบูตจะไม่เริ่มต้นจนกว่าผู้ใช้จะทำการเลือก
เมื่อมีการติดตั้งระบบปฏิบัติการหรือเคอร์เนลหลายระบบในเครื่องเดียวกัน GRUB_DEFAULT
ต้องใช้ค่าจำนวนเต็มที่ระบุระบบปฏิบัติการหรือรายการเคอร์เนลใดในหน้าจอเริ่มต้นของ GRUB ที่ควรเลือกเพื่อบูตตามค่าเริ่มต้น รายการสามารถดูได้ไม่เฉพาะในหน้าจอเริ่มต้นที่แสดงด้านบน แต่ยังใช้คำสั่งต่อไปนี้ด้วย:
ใน CentOS และ openSUSE:
awk -F\' '$1=="menuentry " {print $2}' /boot/grub2/grub.cfg
ในอูบุนตู:
awk -F\' '$1=="menuentry " {print $2}' /boot/grub/grub.cfg
ในตัวอย่างนี้ที่แสดงในภาพด้านล่าง หากเราต้องการบูตด้วยเคอร์เนลเวอร์ชัน 3.10.0-123.el7.x86_64 (รายการที่ 4) เราจำเป็นต้องตั้งค่า GRUB_DEFAULT
ถึง 3
(รายการจะมีหมายเลขภายในเริ่มต้นด้วยศูนย์) ดังนี้:
GRUB_DEFAULT=3
ตัวแปรการกำหนดค่า GRUB ตัวสุดท้ายที่น่าสนใจเป็นพิเศษคือ GRUB_CMDLINE_LINUX
ซึ่งใช้ในการส่งผ่านตัวเลือกไปยังเคอร์เนล ตัวเลือกที่สามารถส่งผ่าน GRUB ไปยังเคอร์เนลได้นั้นได้รับการบันทึกไว้อย่างดีในไฟล์พารามิเตอร์เคอร์เนลและใน man 7 bootparam
ตัวเลือกปัจจุบันในเซิร์ฟเวอร์ CentOS 7 ของฉันคือ:
GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet"
เหตุใดคุณจึงต้องการปรับเปลี่ยนพารามิเตอร์เคอร์เนลเริ่มต้นหรือส่งตัวเลือกพิเศษ พูดง่ายๆ ก็คือ อาจมีบางครั้งที่คุณต้องบอกพารามิเตอร์ฮาร์ดแวร์บางอย่างแก่เคอร์เนลว่าเคอร์เนลอาจไม่สามารถระบุได้ด้วยตัวเอง หรือให้แทนที่ค่าที่จะตรวจพบ
สิ่งนี้เกิดขึ้นกับฉันเมื่อไม่นานมานี้เมื่อฉันลองใช้ Vector Linux ซึ่งเป็นอนุพันธ์ของ Slackware บนแล็ปท็อปอายุ 10 ปีของฉัน หลังการติดตั้ง ตรวจไม่พบการตั้งค่าที่ถูกต้องสำหรับการ์ดแสดงผลของฉัน ดังนั้นฉันจึงต้องแก้ไขตัวเลือกเคอร์เนลที่ส่งผ่าน GRUB เพื่อให้ทำงานได้
อีกตัวอย่างหนึ่งคือเมื่อคุณต้องการนำระบบเข้าสู่โหมดผู้ใช้คนเดียวเพื่อดำเนินงานบำรุงรักษา คุณสามารถทำได้โดยเพิ่มคำว่า single ต่อท้าย GRUB_CMDLINE_LINUX
แล้วรีบูต:
GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet single"
หลังจากแก้ไข /etc/defalt/grub
คุณจะต้องเรียกใช้ update-grub
(Ubuntu) หรือ grub2-mkconfig -o /boot/grub2/grub cfg
(CentOS และ openSUSE) หลังจากนั้นเพื่ออัปเดต grub.cfg
(ไม่เช่นนั้น การเปลี่ยนแปลงจะสูญหายไปเมื่อบู๊ตเครื่อง)
คำสั่งนี้จะประมวลผลไฟล์การกำหนดค่าการบูตที่กล่าวถึงก่อนหน้านี้เพื่ออัปเดต grub.cfg
วิธีการนี้ช่วยให้มั่นใจได้ว่าการเปลี่ยนแปลงจะมีผลถาวร ในขณะที่ตัวเลือกที่ส่งผ่าน GRUB ในเวลาบูตจะคงอยู่เฉพาะในช่วงเซสชันปัจจุบันเท่านั้น
แก้ไขปัญหา Linux GRUB
หากคุณติดตั้งระบบปฏิบัติการตัวที่สองหรือหากไฟล์การกำหนดค่า GRUB ของคุณเสียหายเนื่องจากข้อผิดพลาดของมนุษย์ มีหลายวิธีที่คุณสามารถทำให้ระบบของคุณกลับมาใช้งานได้และสามารถบูตได้อีกครั้ง
ในหน้าจอเริ่มต้น กด c
เพื่อรับบรรทัดคำสั่ง GRUB (โปรดจำไว้ว่าคุณสามารถกด e
เพื่อแก้ไขตัวเลือกการบูตเริ่มต้น) และใช้ความช่วยเหลือเพื่อนำตัวเลือกที่มีอยู่ คำสั่งในพรอมต์ GRUB:
เราจะมุ่งเน้นไปที่ ls ซึ่งจะแสดงรายการอุปกรณ์และระบบไฟล์ที่ติดตั้ง และเราจะตรวจสอบสิ่งที่พบ ในภาพด้านล่าง เราจะเห็นว่ามีฮาร์ดไดรฟ์ 4 ตัว (hd0
ถึง hd3
)
ดูเหมือนว่ามีเพียง hd0
เท่านั้นที่ถูกแบ่งพาร์ติชัน (ตามหลักฐานโดย msdos1 และ msdos2 โดยที่ 1 และ 2 คือหมายเลขพาร์ติชัน และ msdos คือโครงร่างการแบ่งพาร์ติชัน)
ตอนนี้เรามาตรวจสอบพาร์ติชันแรกบน hd0
(msdos1) เพื่อดูว่าเราจะพบ GRUB ที่นั่นหรือไม่ วิธีการนี้จะช่วยให้เราบูต Linux และใช้เครื่องมือระดับสูงอื่น ๆ เพื่อซ่อมแซมไฟล์การกำหนดค่าหรือติดตั้ง GRUB ใหม่ทั้งหมดหากจำเป็น:
ls (hd0,msdos1)/
ดังที่เราเห็นในพื้นที่ที่ไฮไลต์ เราพบไดเร็กทอรี grub2 ในพาร์ติชันนี้:
เมื่อเราแน่ใจว่า GRUB อยู่ใน (hd0,msdos1) ให้บอก GRUB ว่าจะค้นหาไฟล์การกำหนดค่าได้จากที่ไหน จากนั้นสั่งให้พยายามเปิดเมนู:
set prefix=(hd0,msdos1)/grub2
set root=(hd0,msdos1)
insmod normal
normal
จากนั้นในเมนู GRUB ให้เลือกรายการแล้วกด Enter เพื่อบูตโดยใช้ เมื่อระบบบูตแล้ว คุณสามารถออกคำสั่ง grub2-install /dev/sdX
(เปลี่ยน sdX
ด้วยอุปกรณ์ที่คุณต้องการติดตั้ง GRUB บน) ข้อมูลการบูตจะได้รับการอัปเดตและไฟล์ที่เกี่ยวข้องทั้งหมดจะถูกกู้คืน
grub2-install /dev/sdX
สถานการณ์ที่ซับซ้อนอื่นๆ ได้รับการบันทึกไว้พร้อมกับการแก้ไขที่แนะนำในคู่มือการแก้ไขปัญหา Ubuntu GRUB2 แนวคิดที่อธิบายไว้นั้นใช้ได้กับการแจกแจงแบบอื่นเช่นกัน
สรุป
ในบทความนี้ เราได้แนะนำให้คุณรู้จักกับ GRUB โดยระบุว่าคุณสามารถค้นหาเอกสารทั้งออนไลน์และออฟไลน์ได้จากที่ใด และอธิบายวิธีจัดการกับสถานการณ์ที่ระบบหยุดการบูทอย่างถูกต้องเนื่องจากปัญหาที่เกี่ยวข้องกับบูทโหลดเดอร์
โชคดีที่ GRUB เป็นหนึ่งในเครื่องมือที่ได้รับการบันทึกไว้ดีที่สุด และคุณสามารถค้นหาความช่วยเหลือได้อย่างง่ายดายทั้งในเอกสารที่ติดตั้งหรือทางออนไลน์โดยใช้แหล่งข้อมูลที่เราแบ่งปันในบทความนี้
คุณมีคำถามหรือความคิดเห็น? อย่าลังเลที่จะแจ้งให้เราทราบโดยใช้แบบฟอร์มความคิดเห็นด้านล่าง เราหวังว่าจะได้ยินจากคุณ!