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:
👉 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:
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:
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:
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:
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.
👉 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 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
:
👉 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.
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:
Nhấn Enter
để tiếp tục 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
👉 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:
👉 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:
👉 Bước 8: Tại đây chúng ta sẽ được chuyển vào chế độ khôi phục GRUB.
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:
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:
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
.
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:
👉 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.
👉 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:
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.
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.
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
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:
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
Bước 2.2: Chọn một ổ đĩa cứng và chọn Proceed
:
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:
Bước 2.4: Chúng ta cần chọn Analyse
để tiếp tục:
Sau đó chúng ta 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:
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:
Chúng ta cần xác định sẽ ghi lại MBR bằng cách nhấn phím Y
:
Quá trình ghi lại MBR thành công nhấn Enter
để kết thúc:
👉 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.