Quản lý GRUB2 trên Linux: Hướng dẫn cấu hình, sửa lỗi và tùy chỉnh hệ thống khởi động

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Giới thiệu: Đừng để GRUB2 làm bạn ‘đứng hình’

Bạn đã bao giờ ‘đứng hình’ khi chiếc máy Linux yêu quý bỗng nhiên từ chối khởi động, chỉ hiện ra màn hình đen hay dòng grub rescue> lạnh lùng chưa? Nếu có, thì bạn đã gặp GRUB2 – bộ nạp khởi động (bootloader) mạnh mẽ và không thể thiếu của hầu hết các bản phân phối Linux hiện đại.

Ngày mới làm sysadmin, mình từng tốn cả buổi chiều chỉ để tìm hiểu nguyên nhân hệ thống không khởi động, vì mình chưa đọc kỹ log và chưa hiểu rõ GRUB2 hoạt động thế nào. Cảm giác lúc đó thật sự bế tắc! Nhưng sau nhiều lần vật lộn, mình nhận ra GRUB2 không hề đáng sợ như mình nghĩ.

Ngược lại, nó hóa ra lại rất linh hoạt nếu bạn biết cách sử dụng. Bài viết này sẽ chia sẻ những mẹo hay, các thực hành tốt nhất và cả những kinh nghiệm thực chiến. Mục tiêu là giúp bạn làm chủ GRUB2, từ cấu hình cơ bản đến sửa lỗi phức tạp và tùy chỉnh hệ thống khởi động theo ý muốn.

Khái niệm cốt lõi: GRUB2 là gì và nó làm gì?

Để làm chủ GRUB2, trước hết chúng ta cần hiểu rõ bản chất và vai trò của nó trong quá trình khởi động hệ thống.

GRUB2: Người dẫn đường của hệ điều hành

GRUB2 (Grand Unified Bootloader, phiên bản 2) là bootloader mặc định cho hầu hết các bản phân phối Linux hiện đại như Ubuntu, Fedora, Debian. Nhiệm vụ chính của nó là tải nhân Linux (kernel) và initramfs (initial RAM filesystem) vào bộ nhớ. Sau đó, GRUB2 chuyển quyền điều khiển cho kernel để hệ điều hành có thể khởi động hoàn chỉnh.

Quá trình khởi động diễn ra theo các bước chính sau:

  1. BIOS/UEFI: Firmware của máy tính khởi động và thực hiện POST (Power-On Self-Test).
  2. Tìm Bootloader: BIOS/UEFI tìm kiếm bootloader trên ổ đĩa được cấu hình (thường là Master Boot Record (MBR) hoặc phân vùng EFI).
  3. GRUB2 Stage 1/1.5: Phần nhỏ của GRUB2 được tải vào bộ nhớ, có nhiệm vụ tìm và tải Stage 2.
  4. GRUB2 Stage 2: Đây là phần chính của GRUB2. Nó đọc file cấu hình grub.cfg và hiển thị menu khởi động cho người dùng.
  5. Tải Kernel và Initramfs: Khi người dùng chọn một mục trong menu, GRUB2 sẽ tải kernel và initramfs tương ứng vào RAM.
  6. Khởi động hệ điều hành: GRUB2 chuyển quyền điều khiển cho kernel, và hệ điều hành bắt đầu khởi động.

Các file và thư mục quan trọng

Để quản lý GRUB2 hiệu quả, bạn cần làm quen với một số file và thư mục cốt lõi:

  • /boot/grub/grub.cfg (hoặc /boot/grub2/grub.cfg trên một số hệ thống): Đây là file cấu hình cuối cùng mà GRUB2 đọc khi khởi động. Quan trọng: Bạn không nên chỉnh sửa file này trực tiếp! Nó được tạo tự động bởi các script.
  • /etc/default/grub: File chứa các biến cấu hình toàn cục mà bạn có thể chỉnh sửa để tùy chỉnh GRUB2. Đây là nơi chính để bạn làm việc.
  • /etc/grub.d/: Thư mục chứa các script shell được sử dụng để tạo ra file grub.cfg. Mỗi script có nhiệm vụ thêm một phần cụ thể vào cấu hình cuối cùng (ví dụ: 10_linux cho các kernel Linux, 30_os-prober để dò tìm các hệ điều hành khác, 40_custom cho các mục tùy chỉnh của bạn).

Thực hành chi tiết: Mẹo cấu hình, sửa lỗi và tùy chỉnh GRUB2

Không để bạn đợi lâu hơn nữa, hãy cùng đi vào phần thực hành. Mình sẽ chia sẻ các mẹo và lệnh thực tế giúp bạn tự tin quản lý GRUB2.

Mẹo cấu hình GRUB2 cơ bản và nâng cao

Việc cấu hình GRUB2 chủ yếu xoay quanh việc chỉnh sửa file /etc/default/grub và sau đó cập nhật cấu hình.

Hiểu file cấu hình chính: /etc/default/grub

File này chứa các biến quan trọng mà bạn có thể thay đổi. Luôn sử dụng trình soạn thảo văn bản yêu thích của bạn (nano, vim) với quyền root để chỉnh sửa:

sudo nano /etc/default/grub

Một số biến phổ biến và cách sử dụng chúng:

  • GRUB_DEFAULT=0: Đặt mục khởi động mặc định. 0 là mục đầu tiên trong menu GRUB2. Bạn có thể dùng số thứ tự, tên chính xác của mục (ví dụ: GRUB_DEFAULT="Ubuntu, with Linux 5.15.0-78-generic") hoặc saved để GRUB2 nhớ lựa chọn cuối cùng của bạn.
  • GRUB_TIMEOUT=5: Thời gian (giây) GRUB2 hiển thị menu trước khi tự động khởi động mục mặc định. Đặt -1 để GRUB2 chờ vô thời hạn.
  • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash": Các tham số được truyền cho kernel Linux khi khởi động. quietsplash giúp quá trình khởi động mượt mà hơn. Bạn có thể thêm nomodeset nếu gặp vấn đề về đồ họa, hoặc init=/bin/bash để vào chế độ cứu hộ (sẽ nói chi tiết hơn ở phần sửa lỗi).
  • GRUB_DISABLE_OS_PROBER=true: Nếu bạn không muốn GRUB2 tự động dò tìm các hệ điều hành khác (ví dụ: Windows, các bản Linux khác) trên các phân vùng khác, hãy đặt biến này thành true. Điều này giúp menu GRUB2 của bạn gọn gàng hơn. Tuy nhiên, bạn sẽ phải tự thêm các mục boot cho OS khác nếu cần.

Sau khi chỉnh sửa /etc/default/grub, bạn phải chạy lệnh sau để cập nhật file grub.cfg:

sudo update-grub  # Dành cho Debian/Ubuntu và các dẫn xuất
# Hoặc
sudo grub2-mkconfig -o /boot/grub2/grub.cfg # Dành cho Fedora/RHEL/CentOS và các dẫn xuất

Mình thường gọi lệnh update-grub là ‘thần chú’. Nếu quên nó, mọi thay đổi của bạn sẽ không có tác dụng và bạn sẽ mất thời gian tự hỏi ‘tại sao lại không được nhỉ?’.

Tùy chỉnh menu khởi động với /etc/grub.d/

Nếu bạn muốn thêm một mục khởi động tùy chỉnh, ví dụ như khởi động một hệ điều hành khác mà os-prober không nhận ra, hoặc cần khởi động một chương trình cứu hộ đặc biệt, bạn nên sử dụng script /etc/grub.d/40_custom.

Mở file 40_custom (hoặc tạo nó nếu chưa có) và thêm cấu hình của bạn:

sudo nano /etc/grub.d/40_custom

Ví dụ, để thêm một mục khởi động Windows (cho hệ thống UEFI):

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.
# You can also change the default setting to that entry by editing the GRUB_DEFAULT setting
# in /etc/default/grub.

menuentry "Windows 10" {
    insmod part_gpt
    insmod fat
    insmod search_fs_uuid
    insmod chain
    search --fs-uuid --set=root --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1 YOUR_WINDOWS_EFI_PARTITION_UUID
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

Lưu ý: Bạn cần thay thế YOUR_WINDOWS_EFI_PARTITION_UUID bằng UUID thực của phân vùng EFI của Windows. Bạn có thể tìm thấy UUID bằng lệnh sudo blkid.

Sau khi thêm, đừng quên chạy sudo update-grub!

Cấu hình tham số kernel lúc khởi động

Đôi khi, bạn cần truyền các tham số đặc biệt cho kernel để khắc phục sự cố hoặc thay đổi hành vi hệ thống. Bạn có thể làm điều này tạm thời hoặc vĩnh viễn.

  • Tạm thời: Khi menu GRUB2 xuất hiện, chọn mục kernel bạn muốn, nhấn phím e để chỉnh sửa. Tìm dòng bắt đầu bằng linux /boot/vmlinuz-... và thêm tham số vào cuối dòng đó. Nhấn F10 (hoặc Ctrl+X) để khởi động với các tham số mới. Thay đổi này chỉ có hiệu lực cho lần khởi động đó.
  • Vĩnh viễn: Chỉnh sửa biến GRUB_CMDLINE_LINUX_DEFAULT trong /etc/default/grub như đã đề cập ở trên, sau đó chạy sudo update-grub.

Mình hay dùng init=/bin/bash khi cần vào chế độ single-user để sửa lỗi mà không cần mật khẩu root, hoặc systemd.unit=multi-user.target nếu muốn bỏ qua môi trường đồ họa.

Sửa lỗi GRUB2 thường gặp

Đây là phần mà mình tin rằng nhiều bạn sẽ thấy hữu ích nhất.

Khi hệ thống không khởi động (GRUB Rescue)

Nếu bạn thấy dấu nhắc grub rescue>, điều đó có nghĩa là GRUB2 đã được tải một phần nhưng không thể tìm thấy file grub.cfg hoặc các module cần thiết. Đừng hoảng sợ!

Các bước để khôi phục (tạm thời) từ GRUB Rescue:

  1. Tìm phân vùng root: Dùng lệnh ls để liệt kê các ổ đĩa và phân vùng. Ví dụ: ls (hd0,msdos1)/ hoặc ls (hd0,gpt1)/. Tìm phân vùng chứa thư mục /boot/grub (hoặc /boot/grub2). Ví dụ, nếu bạn thấy (hd0,gpt2)/boot/grub, thì phân vùng root của bạn có thể là (hd0,gpt2).
  2. Đặt biến môi trường:
  3. set prefix=(hd0,gpt2)/boot/grub  # Thay (hd0,gpt2) bằng phân vùng của bạn
    set root=(hd0,gpt2)
  4. Tải các module cần thiết:
  5. insmod normal
    normal
  6. Nếu thành công, bạn sẽ thấy menu GRUB2 và có thể khởi động hệ điều hành. Sau khi vào được hệ thống, bạn phải cài đặt lại GRUB2 để khắc phục vĩnh viễn:
  7. sudo grub-install /dev/sda  # Thay /dev/sda bằng ổ đĩa chính của bạn (ví dụ: /dev/nvme0n1)
    sudo update-grub

Hồi xưa mình từng loay hoay mãi với bước ls này, thử từng phân vùng một cho đến khi tìm được đúng cái chứa /boot/grub. Mẹo nhỏ là hãy nhớ cấu trúc phân vùng của bạn!

Khôi phục GRUB2 sau khi cài đặt hệ điều hành khác hoặc lỗi MBR/GPT

Việc cài đặt một hệ điều hành khác (nhất là Windows) thường ghi đè lên bootloader của Linux. Để khôi phục, bạn cần dùng một Live CD/USB của Linux (Ubuntu Live, Fedora Live, SystemRescueCD).

  1. Khởi động từ Live CD/USB.
  2. Mở Terminal và xác định phân vùng root của Linux:
  3. sudo fdisk -l
    # Hoặc
    sudo blkid

    Giả sử phân vùng root của bạn là /dev/sda2 và phân vùng boot riêng (nếu có) là /dev/sda1.

  4. Mount các phân vùng:
  5. sudo mount /dev/sda2 /mnt
    # Nếu có phân vùng /boot riêng:
    sudo mount /dev/sda1 /mnt/boot
    # Nếu dùng UEFI và có phân vùng EFI riêng (thường là FAT32, ví dụ /dev/sdaX):
    sudo mount /dev/sdaX /mnt/boot/efi # Thay sdaX bằng phân vùng EFI của bạn
  6. Chroot vào hệ thống của bạn:
  7. for i in /dev /dev/pts /proc /sys /run; do sudo mount --bind $i /mnt$i; done
    sudo chroot /mnt

    Lúc này, bạn đang ở trong môi trường của hệ thống Linux bị lỗi.

  8. Cài đặt lại GRUB2 và cập nhật cấu hình:
  9. grub-install /dev/sda # Thay /dev/sda bằng ổ đĩa mà bạn muốn cài GRUB2 vào (ví dụ: /dev/nvme0n1), không phải phân vùng!
    update-grub # Hoặc grub2-mkconfig -o /boot/grub2/grub.cfg
  10. Thoát chroot và khởi động lại:
  11. exit
    sudo reboot

Bước chroot này cực kỳ quan trọng. Mình nhớ hồi đó không biết cách mount đúng các thư mục /dev, /proc, /sys nên grub-install cứ báo lỗi liên tục. Phải mất cả buổi chiều chỉ để tìm đúng cái lệnh for i in... này.

Gỡ lỗi với chế độ Verbose và Single User Mode

Khi gặp sự cố khởi động, việc có thêm thông tin gỡ lỗi là vô giá.

  • Chế độ Single User (hoặc Rescue Mode): Để vào chế độ này, khi menu GRUB2 xuất hiện, nhấn e để chỉnh sửa mục khởi động. Tìm dòng linux /boot/vmlinuz-... và thêm single hoặc init=/bin/bash vào cuối dòng. Điều này sẽ khởi động hệ thống vào một shell root cơ bản, rất hữu ích để sửa chữa các file cấu hình bị hỏng hoặc reset mật khẩu.
  • Chế độ Verbose: Nếu bạn muốn xem chi tiết quá trình khởi động, thay vì quiet splash, bạn có thể xóa chúng đi và thêm debug hoặc loglevel=7 vào GRUB_CMDLINE_LINUX_DEFAULT. Điều này sẽ hiển thị tất cả các thông báo từ kernel và các dịch vụ khởi động, giúp bạn pinpoint vấn đề.

Những mẹo nâng cao và thực hành tốt nhất

Bảo mật GRUB2 với mật khẩu

Nếu bạn quản lý server vật lý hoặc máy tính cá nhân có nhiều người dùng, việc bảo vệ menu GRUB2 bằng mật khẩu là rất quan trọng. Điều này ngăn chặn người dùng trái phép chỉnh sửa tham số kernel hoặc khởi động vào chế độ single-user để truy cập root.

Tạo mật khẩu mã hóa:

sudo grub-mkpasswd-pbkdf2

Bạn sẽ được yêu cầu nhập mật khẩu hai lần và nhận lại một chuỗi hash. Sao chép chuỗi này và thêm vào file /etc/grub.d/40_custom hoặc /etc/grub.d/00_header (tùy thuộc vào bản phân phối, 40_custom an toàn hơn):

set superusers="username"
password_pbkdf2 username <chuỗi hash của bạn>

Sau đó, thêm dòng --users username vào các mục menuentry mà bạn muốn bảo vệ.

Bạn cũng có thể thêm các dòng sau vào /etc/grub.d/40_custom để bảo vệ toàn bộ menu (trừ các mục không cần root):

cat << EOF
set superusers="youradmin"
password_pbkdf2 youradmin grub.pbkdf2.sha512.10000.C650B3E8...

menuentry 'My Secure Linux' --users youradmin {
    ... (your linux boot commands) ...
}
EOF

Đừng quên sudo update-grub!

Sao lưu cấu hình GRUB2

Đây là một thói quen tốt mà mình luôn khuyên mọi người. Trước khi thực hiện bất kỳ thay đổi lớn nào, hãy sao lưu các file cấu hình quan trọng:

sudo cp /etc/default/grub /etc/default/grub.bak.$(date +%F)
sudo cp -r /etc/grub.d/ /etc/grub.d.bak.$(date +%F)
sudo cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak.$(date +%F)

Nếu có gì đó không ổn, bạn có thể dễ dàng khôi phục lại.

Cập nhật GRUB2 đúng cách

Việc cập nhật GRUB2 thường diễn ra tự động khi bạn cập nhật kernel hoặc các gói liên quan đến GRUB2. Tuy nhiên, nếu bạn cài đặt lại GRUB2 thủ công (ví dụ: sau khi khôi phục từ lỗi bootloader), hãy nhớ:

  • Sử dụng grub-install /dev/sdX để cài GRUB2 vào MBR/GPT của toàn bộ ổ đĩa (/dev/sdX là ổ đĩa, không phải một phân vùng cụ thể).
  • Sử dụng update-grub (hoặc grub2-mkconfig) để tạo lại file grub.cfg sau khi thay đổi các file trong /etc/default/grub hoặc /etc/grub.d/.

Kết luận: Làm chủ GRUB2, làm chủ hệ thống khởi động

Ban đầu, quản lý GRUB2 có thể khiến bạn nản lòng. Nhưng khi nắm vững các khái niệm và áp dụng những mẹo mình chia sẻ, bạn sẽ thấy nó thực sự rất mạnh mẽ. Nó cho phép bạn kiểm soát hoàn toàn quá trình khởi động Linux, từ tùy chỉnh menu, truyền tham số kernel, đến sửa lỗi hệ thống không khởi động. Mọi thứ đều nằm trong tầm tay bạn.

Hãy nhớ, đừng ngại thử nghiệm (luôn có bản sao lưu trước khi làm nhé!), bởi vì đó là cách tốt nhất để học hỏi và tích lũy kinh nghiệm thực chiến. Chúc các bạn thành công trên hành trình làm chủ Linux của mình!

Share: