Cài đặt lại GRUB Boot Loader bị lỗi trên Ubuntu Image Cài đặt lại GRUB Boot Loader bị lỗi trên Ubuntu

Bài viết này sẽ hướng dẫn các bạn cài đặt lại GRUB Boot Loader bị lỗi với bản phân phối Ubuntu của hệ điều hành Linux. Trong bài viết này sẽ giới thiệu với các bạn cách cài đặt lại GRUB khi bị corrupt hoặc ổ cứng bị mất boot loader, cách khôi phục MBR ổ cứng trên Linux.

1. Giới thiệu GRUB

GRUB (Grand Unified Bootloader) là bộ tải khởi động (bootloader) có sẵn từ GNU. Một bộ tải khởi động là rất quan trọng vì không thể khởi động một hệ điều hành mà không có nó. Bộ tải khởi động chuyển điều khiển đến kernel điều hành.

GRUB là bộ tải khởi động mặc định cho nhiều bản phân phối Linux. GRUB hỗ trợ LBA (Logical Block Addressing Mode). Các tùy chọn khởi động như tham số kernel có thể được sửa đổi bằng lệnh GRUB. Hỗ trợ nhiều hệ thống tập tin: BSD FFS, DOS FAT16 và FAT32, Minix fs, Linux ext2fs và ext3fs, ReiserFS, JSF, XFS,...

Quá trình khởi động bằng GRUB yêu cầu GRUB tự tải vào bộ nhớ được thực hiện trong các bước sau:

  • Bộ tải khởi động giai đoạn 1 được BIOS nạp vào bộ nhớ. Bộ tải khởi động này còn được gọi là bộ tải khởi động chính. Nó tồn tại trên 512 byte hoặc ít hơn dung lượng đĩa trong bản ghi khởi động chính. Bộ tải khởi động chính có thể tải bộ tải khởi động giai đoạn 1.5 hoặc giai đoạn 2 nếu cần.
  • Bộ tải khởi động giai đoạn 1.5 được tải vào bộ nhớ bởi bộ tải khởi động giai đoạn 1 nếu cần. Điều này có thể cần thiết trong một số trường hợp vì một số phần cứng yêu cầu bước giữa trước khi chuyển sang trình tải giai đoạn 2.
  • Bộ tải khởi động thứ cấp còn được gọi là bộ tải khởi động giai đoạn 2 và nó có thể được tải vào bộ nhớ bởi bộ tải khởi động chính. Hiển thị menu GRUB và môi trường lệnh là các chức năng được thực hiện bởi trình tải khởi động thứ cấp. Điều này cho phép người dùng xem các tham số hệ thống và chọn hệ điều hành để khởi động.
  • Hệ điều hành hoặc kernel được tải vào bộ nhớ bởi bộ tải khởi động thứ cấp.

2. Cài đặt lại GRUB Boot Loader bị lỗi

Trong một ngày nào đó chúng ta khởi động máy chủ Ubuntu và thấy rằng các hệ điều hành không còn khởi động nữa và chúng ta phát hiện ra rằng GRUB Boot Loader không còn hoạt động. Nguyên nhân có thể GRUB Boot Loader của chúng ta bị hỏng hoặc bị xóa do các vấn đề khác nhau, các lỗi liên quan đến phần cứng hoặc phần mềm hoặc có thể được thay thế bởi các hệ điều hành khác.

Để có thể khôi phục lại GRUB Boot Loader bị lỗi chúng ta cần thực hiện tải file iso của Ubuntu tại đây. Trong ví dụ này chúng ta thực hiện khôi phục GRUB Boot Loader trên bản phân phối Ubuntu 16.04 của hệ điều hành Linux.

👉 Bước 1: Khi chúng ta đã tải xuống phiên bản ISO mới nhất của Ubuntu 16 và thực hiện ghi nó vào đĩa DVD hoặc USB. Để có thể truy cập BIOS chúng ta nhấn một phím đặc biệt (Esc, F2, F11, F12, Del, tùy thuộc vào bo mạch chủ chúng ta sử dụng) và thực hiện sửa đổi thứ tự trong Boot Menu để file ISO chứa trong DVD/USB được khởi động trước lúc khởi động máy, như hình bên dưới:

Boot Menu

👉 Bước 2: Khi chúng ta đã thay đổi thứ tự trong Boot Menu màn hình đầu tiên sẽ xuất hiện trong đầu ra của chúng ta như sau:

Troubleshooting

Tại đây chúng ta sẽ chọn ngôn ngữ và nhấn Enter. Trong ví dụ này chúng ta sẽ chọn ngôn ngữ là English như trên.

👉 Bước 3: Màn hình tiếp theo sẽ hiển thị như sau:

Kết quả sau khi chọn ngôn ngữ

Chúng ta sẽ nhấn phím F6 để mở menu tùy chọn khác và chọn tùy chọn Expert mode. Sau đó, nhấn phím Escape để trở về trong chế độ chỉnh sửa như hình bên dưới:

Expert Mode

Tiếp theo, chúng ta thực hiện chỉnh sửa các tùy chọn khởi động để sử dụng trực tiếp ISO của Ubuntu bằng cách thêm chuỗi này rescue/enable=true vào ngay sau quiet như hình sau:

Thêm rescue/enable=true

Sau khi chúng ta đã nhập dòng trên vào thì gõ phím Enter để tiếp tục hướng dẫn ISO của Ubuntu trực tiếp khởi động vào chế độ Rescue a broken system để khôi phục GRUB Boot Loader.

Rescue a broken system

👉 Bước 4: Trên màn hình tiếp theo, chúng ta sẽ chọn ngôn ngữ sử dụng để thực hiện khôi phục hệ thống và nhấn phím Enter để tiếp tục.

Chọn ngôn ngữ

Chọn vị trí thích hợp của chúng ta từ danh sách được hiển thị và nhấn phím Enter:

Chọn vị trí

👉 Bước 5: Trong hình tiếp theo sẽ hiện thị chọn bố cục bàn phím của chúng ta.

Chọn bố cực bàn phím

Tại đây chúng ta thực hiện chọn tùy chọn No và nhấn Enter để đến màng hình tiếp theo:

Chọn bố cục bàn phím của quốc gia:

Chọn bố cục bàn phím của quốc gia

Nhấn Enter để tiếp tục chọn kiểu bố trí bàn phím:

Chọn kiểu bố trí bàn phím

Nhấn phím Enter để tải một số thành phần bổ sung và định cấu hình mạng cần thiết cho chúng ta

Cài đặt thành phần bổ sung cho phần cứng

👉 Bước 6: Sau hệ thống sẽ yêu cầu chúng ta thực hiện thiết lập tên máy chủ. Vì chúng ta không cài đặt hệ thống nên chỉ cần để tên máy chủ của hệ thống làm mặc định Ubuntu và nhấn Enter như hình sau:

Thiết lập tên máy chủ

👉 Bước 7: Dựa trên vị trí được cung cấp thệ thống cài đặt sẽ phát hiện múi giờ của chúng ta. Thiết lập này sẽ chỉ hoạt động chính xác nếu máy của bạn được kết nối với internet. Tuy nhiên không quan trọng nếu múi giờ của chúng ta không được chính xác chúng ta có thể thực hiện cài đặt trong hệ thống. Chọn Yes như hình sau để tiếp tục:

Chọn múi giờ

👉 Bước 8: Tại đây chúng ta sẽ được chuyển vào chế độ khôi phục GRUB.

Chọn phân vùng gốc

Chọn hệ thống phân vùng gốc đối với hệ thống của chúng ta từ danh sách được cung cấp. Sau khi chọn phân vùng gốc hãy nhấn phím Enter để tiếp tục.

Tiếp theo, chúng ta sẽ được cung cấp Rescue mode tại đây chọn tùy chọn Reinstall the GRUB boot loader và nhấn phím Enter như hình bên dưới:

Cài đặt lại Ubuntu Grub Loader

Sau khi nhấn phím Enter thì màn hình nhập thiết bị đĩa máy của chúng ta, nơi GRUB sẽ được cài đặt và nhấn [Enter] để tiếp tục, như hình dưới:

Chọn đĩa để cài đặt Grub Loader

Thông thường, chúng ta nên cài đặt bộ tải khởi động trên MBR đĩa cứng máy đầu tiên là / dev/sda. Quá trình cài đặt GRUB sẽ bắt đầu ngay khi nhấn phím Enter.

Cài đặt trình tải khởi động Ubuntu Grub

Sau khi hệ thống cài đặt GRUB boot loader thì sẽ chuyển trở lại Rescue mode. Tại đây chúng ta sẽ chọn tùy chọn Reboot the system để khởi động lại máy:

Khởi động lại hệ thống Ubuntu

👉 Bước 9: Trước khi khởi động lại máy, chúng ta cần phải thực hiện cài đặt BIOS và thay đổi thứ tự Boot Menu khởi động (đặt đĩa cứng với bộ tải khởi động MBR đã cài đặt ở vị trí đầu tiên theo thứ tự menu khởi động). Lưu cài đặt BIOS và khởi động lại máy để áp dụng thứ tự khởi động mới.

Thay đổi menu boot

👉 Bước 10: Cuối cùng, chúng ta có thể khởi động trực tiếp từ ổ đĩa thích hợp, có thể khởi động vào hệ điều hành đã cài đặt. Màn hình GRUB đầu tiên đã được xuất hiện như sau:

Menu khởi động Ubuntu

Cài đặt lại thủ công Grub Boot Loader

Tại bước 8 chúng ta cũng có thể cài đặt thủ công Grub Boot Loader tại Rescue mode thay vì chọn tùy chọn Reinstall the GRUB boot loader và nhấn phím Enter tại đây chúng ta chọn tùy chọn Execute a shell in /dev/ và nhấn phím [Enter] để tiếp tục.

Chọn Thực thi Shell trong phân vùng gốc

Trên màn hình tiếp theo, chọn Continue và nhấn phím Enter để mở chế độ Shell trong phân vùng gốc của chúng ta.

Chế độ mở Shell

Shell được mở thực thi lệnh sau để xác định các thiết bị đĩa cứng của máy:

# ls /dev/sd* 

Sau khi đã xác định đúng thiết bị đĩa cứng (thường là đĩa đầu tiên /dev/sda) chạy lệnh sau để cài đặt GRUB Boot Loader trên MBR đĩa cứng đã xác định.

# grub-install /dev/sda

Khi GRUB được cài đặt thành công, hãy thoát khỏi Shell bằng cách chạy lệnh exit.

# exit

Cài đặt GRUB Boot Loader

Chúng ta thoát khỏi dấu nhắc shell quay trở lại Rescue mode. Tại đây chúng ta sẽ chọn tùy chọn Reboot the system để khởi động lại máy:

Khởi động lại hệ thống Ubuntu

Sau đó thực hiện tương tự bước 9 và bước 10 phía trên để có thể khởi động trực tiếp từ ổ đĩa thích hợp mà chúng ta đã cài đặt GRUB.

3. Khôi phục MBR ổ cứng trên Linux

Đầu tiên chúng ta sử dụng lệnh fdisk để liệt kê danh sách phân vùng trên hệ thống đĩa của bạn và các phân vùng được sắp xếp theo tên /dev của thiết bị như /dev/sda... Thực thi lệnh sau:

root@ubuntu:~# fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x2a055e23

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sda1  *       2048  1499135  1497088  731M 83 Linux
/dev/sda2       1501182 41940991 40439810 19.3G  5 Extended
/dev/sda5       1501184 41940991 40439808 19.3G 8e Linux LVM

Disk /dev/mapper/ubuntu--vg-root: 18.3 GiB, 19675480064 bytes, 38428672 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/ubuntu--vg-swap_1: 976 MiB, 1023410176 bytes, 1998848 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/cryptswap1: 975.5 MiB, 1022885888 bytes, 1997824 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Để có thể minh họa cho quá trình khôi phục MBR chúng ta thực hiện xóa bản ghi khởi động chính (MBR) của hệ thống Linux bằng cách sử dụng lệnh dd như sau để có thể chuyển 512 byte đầu tiên (chứa bảng phân vùng và bộ Boot Loader) của ổ đĩa cứng /dev/sda bằng số không /dev/zero:

root@ubuntu:~# dd if=/dev/zero of=/dev/sda bs=512 count=1
1+0 records in
1+0 records out
512 bytes copied, 0.000320805 s, 1.6 MB/s

Sau khi thực thi lệnh trên chúng ta sẽ thực hiện khôi phục MBR bằng cách như bên dưới:

👉 Bước 1: Để có thể tìm đúng ổ cứng chúng ta sử dụng lệnh lsscsi hoặc lệnh fdisk để kiểm tra như bên dưới:

root@ubuntu:~# lsscsi
[2:0:0:0]    disk    VMware,  VMware Virtual S 1.0   /dev/sda
[4:0:0:0]    cd/dvd  NECVMWar VMware SATA CD01 1.00  /dev/sr0

Hoặc

root@ubuntu:~# fdisk -l /dev/sda
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

👉 Bước 2: Khi chúng ta đã tìm đúng tên của ổ cứng thì công cụ Testdisk sẽ giúp chúng ta trong quá trình thực hiện khôi phục MBR. Thực thi lệnh testdisk để có thể phát hiện các phân vùng và viết lại MBR bằng cách thực hiện các bước sau:

Bước 2.1: Bắt đầu lệnh testdisk và chọn một file nhật ký để ghi lại các thay đổi:

root@ubuntu:~# testdisk

File log testdisk

Bước 2.2: Chọn một ổ đĩa cứng và chọn Proceed:

Chọn ổ cứng

Bước 2.3: Chọn phân vùng trong bước này thì hệ thống sẽ tự động dự đoán và làm nổi bật sự lựa chọn bảng phân vùng tốt nhất đối với ổ đĩa của chúng ta:

Chọn phân vùng

Bước 2.4: Chúng ta cần chọn Analyse để tiếp tục:

Chọn Analyse

Sau đó chúng ta chọn Quick Seach:

Chọn quick seach

Phân vùng đã được phát hiện chúng ta nhấn phím Enter để tiếp tục:

Phát hiện phân vùng

Sau khi nhấn Enter kết quả hiển thị như hình bên dưới, chúng ta sẽ di chuyển qua tùy chọn Write để ghi lại MBR:

Ghi lại MBR

Chúng ta cần xác định sẽ ghi lại MBR bằng cách nhấn phím Y:

Xác nhận ghi MBR

Quá trình ghi lại MBR thành công nhấn Enter để kết thúc:

Ghi MBR thành công

👉 Bước 3: Bây giờ, lệnh fdisk cũng liệt kê lại các phân vùng đã xác định:

root@ubuntu:~# fdisk -l /dev/sda
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sda1  *       2048  1499135  1497088  731M 83 Linux
/dev/sda2       1501184 41940991 40439808 19.3G 8e Linux LVM

Nếu chúng takhởi động lại hệ thống ngay bây giờ thì sẽ thất bại do thiếu bộ tải khởi động. Do đó chúng ta cần cài đặt lại GRUB(2) sử dụng phương pháp trực tiếp như sau:

root@ubuntu:~#  mount /dev/sda1 /mnt
root@ubuntu:~# grub-install --no-floppy --root-directory=/mnt /dev/sda

Nếu phiên bản GRUB trên phương pháp trực tiếp mới hơn phiên bản trên máy chủ của chúng ta (GRUB2 so với GRUB-legacy). Trong trường hợp này, các tệp cấu hình có sẵn không tương thích và chúng cần phải gắn kết tất cả các phân vùng hệ thống và sử dụng môi trường chroot:

root@ubuntu:~# mount /dev/sda1 /mnt/boot
root@ubuntu:~# mount --bind /dev /mnt/dev
root@ubuntu:~# mount --bind /tmp /mnt/tmp
root@ubuntu:~# mount -t proc proc /mnt/proc
root@ubuntu:~# mount -t sysfs none /mnt/sys
root@ubuntu:~# chroot /mnt /bin/bash

Bây giờ, Boot Loader có thể được cài đặt lại:

grub-install --no-floppy /dev/sda

4. Lời kết

Qua bài trên, giúp cho chúng ta hiểu hơn về cách khôi phục GRUB Boot Loader trên hệ điều hành Linux. Ngoài ra, bài viết trên còn hổ trợ chúng ta trong việc cài đặt lại MBR của ổ đĩa trên hệ điều hành Linux giúp cho chúng ta có thể khắc phục các sự cố liên quan đến MBR cũng như sự cố liên quá đến GRUB trên hệ thống Linux.