ค้นหาเว็บไซต์

LFCS: วิธีกำหนดค่าและแก้ไขปัญหา Grand Unified Bootloader (GRUB) - ตอนที่ 13


เนื่องจากการเปลี่ยนแปลงล่าสุดในวัตถุประสงค์การสอบรับรอง LFCS ที่มีผลตั้งแต่ 2 กุมภาพันธ์ 2016 เราจึงเพิ่มหัวข้อที่จำเป็นลงในซีรีส์ LFCS ที่เผยแพร่ที่นี่ เพื่อเตรียมพร้อมสำหรับการสอบนี้ ขอแนะนำให้ติดตามซีรีส์ LFCE เช่นกัน

ในบทความนี้เราจะแนะนำคุณให้รู้จักกับ GRUB และอธิบายว่าเหตุใดจึงมีความจำเป็นในการบูตโหลดเดอร์และจะเพิ่มความคล่องตัวให้กับระบบได้อย่างไร

กระบวนการบูต Linux ตั้งแต่เวลาที่คุณกดปุ่มเปิดปิดของคอมพิวเตอร์จนกว่าคุณจะได้รับระบบที่ทำงานได้อย่างสมบูรณ์ตามลำดับระดับสูงนี้:

  1. 1. กระบวนการที่เรียกว่า POST (การทดสอบตัวเองในการเปิดเครื่อง) จะทำการตรวจสอบโดยรวมเกี่ยวกับส่วนประกอบฮาร์ดแวร์ของคอมพิวเตอร์ของคุณ
  2. 2. เมื่อ POST เสร็จสิ้น ระบบจะส่งการควบคุมไปยังบูตโหลดเดอร์ ซึ่งจะโหลดเคอร์เนล Linux ในหน่วยความจำ (พร้อมกับ initramfs ) และดำเนินการ ตัวโหลดบูตที่ใช้มากที่สุดใน Linux คือ GRand Unified Boot loader หรือเรียกสั้น ๆ ว่า GRUB
  3. 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. 1) แก้ไขวิธีการทำงานของระบบโดยการระบุเคอร์เนลที่แตกต่างกันที่จะใช้
  2. 2) เลือกระหว่างระบบปฏิบัติการสำรองที่จะบูต และ
  3. 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 เป็นหนึ่งในเครื่องมือที่ได้รับการบันทึกไว้ดีที่สุด และคุณสามารถค้นหาความช่วยเหลือได้อย่างง่ายดายทั้งในเอกสารที่ติดตั้งหรือทางออนไลน์โดยใช้แหล่งข้อมูลที่เราแบ่งปันในบทความนี้

คุณมีคำถามหรือความคิดเห็น? อย่าลังเลที่จะแจ้งให้เราทราบโดยใช้แบบฟอร์มความคิดเห็นด้านล่าง เราหวังว่าจะได้ยินจากคุณ!