Sửa lỗi GRUB: Hướng dẫn thực tế để khôi phục hệ thống Linux qua Live USB

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

Khi Bootloader bị lỗi: Hiểu về dấu nhắc Grub Rescue

Ít có điều gì gây ức chế hơn việc nhấn nút nguồn và thấy dòng chữ grub rescue> thay vì màn hình đăng nhập. Lỗi này thường có nghĩa là bootloader không thể tìm thấy các tệp cấu hình hoặc kernel. Tôi thường thấy lỗi này xảy ra sau một bản cập nhật kernel lớn, một bản cập nhật Windows ghi đè lên boot sector, hoặc khi người dùng thay đổi kích thước phân vùng bằng GParted và làm dịch chuyển các sector bắt đầu của hệ điều hành.

Tin tốt là gì? Dữ liệu của bạn gần như chắc chắn vẫn an toàn. Hệ thống chỉ bị “mất bản đồ” dẫn đường thôi. Để khắc phục, bạn sẽ cần một Live USB của một bản phân phối phổ biến như Ubuntu 22.04 hoặc Fedora 39. Chúng ta sẽ sử dụng một kỹ thuật gọi là chroot để “bước vào bên trong” bản cài đặt đang bị lỗi và sửa chữa nó từ bên trong.

Các khái niệm cốt lõi: Legacy BIOS và UEFI

Trước khi gõ lệnh, bạn phải xác định loại firmware của mình. Phần cứng hiện đại xử lý việc khởi động khác với các máy đời cũ khi cài đặt Ubuntu Server hoặc các hệ điều hành khác.

  • Legacy BIOS (MBR): GRUB nằm trong 512 byte đầu tiên của ổ cứng.
  • UEFI (GPT): GRUB tồn tại dưới dạng tệp .efi bên trong một Phân vùng Hệ thống EFI (ESP) riêng biệt, thường là phân vùng từ 100MB đến 500MB được định dạng FAT32.

Để kiểm tra chế độ của bạn trong môi trường Live, hãy chạy lệnh ls /sys/firmware/efi. Nếu thư mục này tồn tại, bạn đang ở chế độ UEFI. Nếu không thấy, có khả năng bạn đang sử dụng Legacy BIOS.

Tại sao chúng ta sử dụng Chroot

Lệnh chroot (change root) là một “cứu cánh” thực sự. Nó cho phép bạn coi một thư mục trên Live USB như là gốc (/) thực sự của hệ thống đã cài đặt. Điều này cho phép bạn chạy các lệnh như grub-install như thể bạn đã boot thành công vào ổ cứng, bỏ qua hoàn toàn bootloader đang bị hỏng.

Quy trình khôi phục từng bước

Khởi động từ Live USB và mở terminal. Chúng ta sẽ giả định bạn đang làm việc với ổ cứng NVMe hoặc SATA tiêu chuẩn.

1. Xác định các phân vùng của bạn

Sử dụng lệnh lsblk để sơ đồ hóa ổ đĩa của bạn. Bạn cần tìm phân vùng root và phân vùng EFI của mình để quản lý dung lượng đĩa hiệu quả.

lsblk -f

Hãy tìm một phân vùng ext4 lớn (hệ thống của bạn) và một phân vùng vfat hoặc fat32 nhỏ (bootloader EFI). Trên nhiều laptop hiện đại, chúng sẽ là /dev/nvme0n1p2 (root) và /dev/nvme0n1p1 (EFI).

2. Gắn kết (Mount) các hệ thống tệp

Chúng ta cần xây dựng một đường dẫn cho môi trường chroot. Trong ví dụ này, chúng ta sẽ sử dụng /dev/sda2 làm root và /dev/sda1 làm EFI. Hãy điều chỉnh các tên này để khớp với kết quả lsblk của bạn.

# Gắn kết hệ thống chính của bạn
sudo mount /dev/sda2 /mnt

# Gắn kết phân vùng EFI (chỉ dành cho hệ thống UEFI)
sudo mount /dev/sda1 /mnt/boot/efi

Nếu bạn có phân vùng /boot riêng biệt, hãy gắn nó vào /mnt/boot trước khi tiếp tục. Việc quên gắn phân vùng boot riêng là lý do phổ biến nhất khiến việc sửa chữa thất bại, đặc biệt nếu bạn đang sử dụng LVM trên Linux.

3. Liên kết (Bind) các thư mục hệ thống

Các công cụ sửa chữa cần truy cập vào thông tin phần cứng và tiến trình của bạn. Chúng ta “liên kết” các hệ thống tệp ảo này từ Live USB vào hệ thống đã được gắn kết của mình.

for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done

Dòng lệnh duy nhất này đảm bảo rằng /run luôn sẵn sàng. Các phiên bản GRUB hiện đại yêu cầu /run để phát hiện UUID của ổ đĩa một cách chính xác.

4. Truy cập vào môi trường

Bây giờ, hãy chuyển ngữ cảnh vào hệ thống đã cài đặt:

sudo chroot /mnt

Dấu nhắc terminal của bạn sẽ thay đổi. Bây giờ bạn đang thực sự chạy với quyền root trên bản cài đặt bị lỗi của mình.

5. Cài đặt lại và cập nhật GRUB

Đối với hệ thống UEFI, hãy cài đặt lại các tệp bootloader và làm mới cấu hình. Lưu ý rằng chúng ta nhắm mục tiêu vào ổ đĩa (ví dụ: /dev/sda), chứ không phải phân vùng.

grub-install /dev/sda
update-grub

Trên Arch hoặc Fedora, lệnh cập nhật là grub-mkconfig -o /boot/grub/grub.cfg. Lệnh này quét các ổ đĩa để tìm kernel và hệ điều hành, sau đó xây dựng menu mà bạn thấy khi khởi động.

6. Dọn dẹp và khởi động lại

Thoát khỏi môi trường và ngắt kết nối (unmount) mọi thứ một cách sạch sẽ. Điều này giúp ngăn ngừa hỏng hóc hệ thống tệp.

exit
sudo umount -R /mnt
sudo reboot

Khôi phục các mục Windows bị thiếu

Windows có bị biến mất khỏi menu khởi động không? Kể từ phiên bản GRUB 2.06, công cụ os-prober thường bị tắt theo mặc định vì lý do bảo mật. Để khôi phục nó, hãy chỉnh sửa cấu hình của bạn khi đang ở trong chroot:

sudo nano /etc/default/grub

Add GRUB_DISABLE_OS_PROBER=false vào cuối tệp. Lưu lại (Ctrl+O) và thoát (Ctrl+X). Chạy lại lệnh update-grub, và menu dual-boot của bạn sẽ quay trở lại.

Những kinh nghiệm “xương máu” để ổn định khởi động

Tôi đã sửa chữa hàng trăm hệ thống như thế này, và ba thói quen sau đây sẽ giúp ngăn chặn hầu hết các rắc rối trong tương lai:

  • Đặt nhãn cho ổ đĩa: Sử dụng e2label để đặt tên cho các phân vùng. Sẽ dễ dàng hơn nhiều khi tìm “Linux_Root” thay vì /dev/nvme0n1p3 khi bạn đang ở trong shell khôi phục.
  • Giữ lại Live USB: Đừng định dạng lại ổ USB đó sau khi sửa xong. Hãy luôn mang nó theo bên mình. Cuối cùng bạn sẽ cần nó để kiểm tra hệ thống tệp (fsck) hoặc khi gặp lỗi khởi động khác.
  • Theo dõi sức khỏe SSD: Nếu GRUB liên tục bị lỗi không rõ lý do, ổ cứng của bạn có thể đang gặp vấn đề. Chạy lệnh sudo smartctl -a /dev/sda để kiểm tra các sector bị phân bổ lại (reallocated sectors).

Lời kết

Sửa chữa bootloader thủ công là một cách tuyệt vời để hiểu cách Linux tương tác với phần cứng của bạn. Mặc dù có các công cụ “Boot Repair” tự động, nhưng chúng thường thêm các script không cần thiết làm xáo trộn hệ thống. Bằng cách sử dụng phương pháp chroot, bạn duy trì toàn quyền kiểm soát và đảm bảo việc sửa chữa diễn ra sạch sẽ nhất có thể.

Share: