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

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 CentOS 7 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

Giả sử: 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 CentOS 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 CentOS 7.

👉 Bước 1: Sau khi chúng ta đã tải xuống phiên bản ISO mới nhất của CentOS 7 và 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 menu đầu tiên trên hình chúng ta di chuyển xuống tùy chọn Troubleshooting và nhấn phím Enter để tiếp tục quá trình khắc phục lỗi GRUB.

👉 Bước 3: Khi nhấn phím Enter thì màn hình tiếp theo sẽ được hiển thị chúng ta chọn Rescue a CentOS system và nhấn phím Enter như sau:

Rescue a CentOS system

Một màn hình mới sẽ xuất hiện với thông báo Press the Enter key to begin the installation process. Và chúng ta chỉ cần nhấn phím Enter lần nữa để tải CentOS system vào bộ nhớ.

Press the Enter key to begin the installation process

👉 Bước 4: Sau khi CentOS system tải vào RAM của chúng ta, lời nhắc khôi phục sẽ xuất hiện trên màn hình. Để tiếp tục quá trình khôi phục hệ thống chúng ta chọn tùy chọn 1 như hình bên dưới:

Tiếp tục quá trình khôi khục hệ thống

Sau đó một lời nhắc tiếp theo sẽ xuất hiện, chương trình khôi phục sẽ thông báo cho chúng ta hệ thống đã được gắn kết vào thư mục /mnt/sysimage. Tại đây theo hướng dẫn của chương trình khôi phục gợi ý chúng ta thực hiện nhập đoạn lệnh sau: chroot /mnt/sysimage để thay đổi phân cấp cây Linux từ file ISO sang phân vùng gốc được gắn trong ổ đĩa của chúng ta.

Kết quả của lệnh `chroot /mnt/sysimage`

👉 Bước 5: Tiếp theo chúng ta cần xác định ổ cứng máy bằng cách thực thi lệnh như sau:

bash-4.2# ls /dev/sd*

Sau khi bạn đã xác định được đĩa cứng của máy, chúng ta có thể bắt đầu cài đặt bộ tải khởi động GRUB bằng cách thực thi các lệnh dưới đây:

bash-4.2# ls /sbin | grep grub2  # Xác định lệnh cài đặt GRUB
bash-4.2# /sbin/grub2-install /dev/sda  # Cài đặt bộ tải khởi động trong phân vùng khởi động của đĩa cứng đầu tiên

Tất cả được thực hiện như hình bên dưới:

Quá trình thực thi lệnh cài GRUB

Sau khi GRUB Boot Loader được cài đặt thành công trong khu vực MBR trên đĩa cứng của chúng ta nhập lệnh exit để trở về và khởi động lại máy bằng cách nhập init 6 như hình minh họa phía trên.

👉 Bước 6: Sau khi khởi động lại máy, trước tiên, 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 thứ tự Boot Menu

Sau khi khởi động lại, máy sẽ khởi động trực tiếp vào menu GRUB, như hình bên dưới:

Khởi động trực tiếp vào menu GRUB

Như thế là chúng ta đã sửa chữa thành công GRUB Boot Loader trên bản phân khối CentOS 7.

Lưu ý: Sau khi khôi phục GRUB Boot Loader, máy sẽ khởi động lại một hoặc hai lần để áp dụng cấu hình GRUB mới.

Trong một số trường hợp chúng ta quên mật khẩu root và không thể đăng nhập vào hệ thống CentOS 7 thì chúng ta có thể đặt lại mật khẩu trống bằng cách khởi động file ISO của CentOS 7 ở chế độ khôi phục và làm theo các bước tương tự như trên cho đến khi đạt đến bước 4. Thì chúng ta thực thi lệnh sau để chỉnh sửa tệp mật khẩu tài khoản Linux.

bash-4.2# vi /etc/shadow

Truy cập vào file `/etc/shadow`

Kết quả khi truy cập file /ect/shadow:

Kết quả khi truy cập file /ect/shadow

Trong tệp này chúng ta xác định dòng mật khẩu root và thực hiện xóa toàn bộ chuỗi ở giữa dấu hai chấm đầu tiên “:”và dấu hai chấm thứ hai ”:”, như ảnh bên dưới:

Xóa password của user root

Sau đó chúng ta lưu tệp bằng cách nhấn các phím sau theo thứ tự: Esc tiếp theo là :wq!

👉 Bước 7: Chúng ta thực hiện thoát bảng điều khiển chroot và gõ init 6 để khởi động lại máy.

Khởi động lại máy

Sau khi khởi động lại, đăng nhập vào hệ thống CentOS bằng tài khoản root, hiện không có mật khẩu được cấu hình và thiết lập mật khẩu mới cho người dùng root bằng cách thực hiện lệnh passwd như sau:

Khôi phục password user root

Ngoài cách khôi phục password trên chúng ta cũng có thể sử dụng khôi khục mật khẩu user root trên Linux.

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@localhost ~]# fdisk -l

Disk /dev/sda: 17.2 GB, 17179869184 bytes, 33554432 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 label type: dos
Disk identifier: 0x000dacd3

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    33554431    15727616   8e  Linux LVM

Disk /dev/mapper/cl-root: 14.4 GB, 14382268416 bytes, 28090368 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/cl-swap: 1719 MB, 1719664640 bytes, 3358720 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@localhost ~]# dd if=/dev/zero of=/dev/sda bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000289955 s, 1.8 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@localhost ~]# lsscsi
[0:0:0:0]    disk    VMware   Virtual disk     2.0   /dev/sda
[3:0:0:0]    cd/dvd  NECVMWar VMware SATA CD00 1.00  /dev/sr0

Hoặc

[root@localhost ~]# fdisk -l /dev/sda

Disk /dev/sda: 17.2 GB, 17179869184 bytes, 33554432 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@localhost ~]# 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@localhost ~]# fdisk -l /dev/sda

Disk /dev/sda: 17.2 GB, 17179869184 bytes, 33554432 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 label type: dos
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    33554431    15727616   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@localhost ~]# mount /dev/sda1 /mnt
[root@localhost ~]# 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@localhost ~]# mount /dev/sda1 /mnt/boot
[root@localhost ~]# mount --bind /dev /mnt/dev
[root@localhost ~]# mount --bind /tmp /mnt/tmp
[root@localhost ~]# mount -t proc proc /mnt/proc
[root@localhost ~]# mount -t sysfs none /mnt/sys
[root@localhost ~]# 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 quan đến GRUB trên hệ thống Linux.