Khởi động Windows từ Grub2 bằng dòng lệnh

Grub2 là một bộ nạp khởi động mạnh mẽ và hỗ trợ khởi động hầu hết các hệ điều hành. Bài viết này sẽ hướng dẫn bạn khởi động Windows từ Grub2 bằng dòng lệnh.

Mặc dù bạn có thể quét và khởi động vào hầu hết các hệ điều hành đã cài đặt trên máy tính như Windows, Linux, FreeBSD và macOS từ trình đơn Grub2 của AIO Boot. Nhưng Windows là một hệ điều hành thông dụng, AIO Boot v0.9.7.6 đã thêm một trình đơn để hỗ trợ khởi động vào Windows nhanh hơn mà không cần phải quét các hệ điều hành khác (bấm phím i).

Dòng lệnh Grub2

Tất nhiên là chúng ta sẽ sử dụng trình đơn thay vì khởi động Windows từ Grub2 bằng lệnh. Nhưng có một vài lý do khiến bạn không thể truy cập vào trình đơn của Grub2. Mà lý do thường gặp là bạn đã vô tình xóa phân vùng đang chứa tệp tin cấu hình của Grub2. Sử dụng dòng lệnh của Grub2 là cách duy nhất trước khi bạn phải sử dụng các thiết bị cứu hộ khác.

Khi bạn xóa phân vùng chứa tệp tin cấu hình của Grub2 (grub.cfg) và các mô-đun của nó, Grub2 sẽ dừng lại ở chế độ rescue. Nếu các mô-đun của Grub2 đã được tải sẵn thì bạn vẫn còn cơ hội để khởi động vào Windows. Cụ thể là chúng ta cần tải mô-đun ntldr ở chế độ Legacy BIOS và mô-đun chainloader ở chế độ UEFI. Theo kinh nghiệm của tôi, trên Ubuntu, Linux Mint, Debian và các hệ điều hành Linux khác thì các mô-đun này chỉ được tải sẵn khi bạn khởi động ở chế độ UEFI. Có nghĩa là các mô-đun này đã được nhúng vào tệp grubx64.efi. AIO Boot cũng như vậy. Nhưng dù sao chúng ta cũng nên thử.

Đây là màn hình Grub2 dừng lại ở chế độ rescue.

grub rescue

error: no such device:
error: unknown filesystem.
Entering rescue mode...
grub rescue>

Đầu tiên chúng ta sẽ sử dụng lệnh search để tìm phân vùng chứa tệp tin BCD. Phân vùng này cũng chứa tệp bootmgr hoặc bootmgfw.efi. Sau đó chúng ta sẽ load tệp tin này để khởi động vào Windows.

UEFI

Đối với UEFI, tệp tin BCD sẽ nằm ở đường dẫn /EFI/Microsoft/Boot/BCD trên phân vùng EFI. Phân vùng này cũng chứa tệp tin /EFI/Microsoft/Boot/bootmgfw.efi. Sử dụng lệnh chainloader để chainload tệp tin này.

search -s root -f /EFI/Microsoft/Boot/BCD
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
boot

Legacy

Đối với Windows Vista, Windows 7 đến Windows 10, tệp tin BCD sẽ nằm ở đường dẫn /Boot/BCD. Phân vùng này cũng chứa tệp tin /bootmgr. Sử dụng lệnh ntldr để load tệp tin này.

search -s root -f /Boot/BCD
ntldr /bootmgr
boot

Đối với Windows XP/2003, bạn sẽ tìm phân vùng chứa tệp tin /ntdetect.com và load tệp /ntldr. Bạn cần sử dụng lệnh drivemap để MAP đĩa cứng mà bạn đã cài Windows XP/2003 thành đĩa cứng đầu tiên nếu nó đang không phải.

search -s root -f /ntdetect.com
drivemap -s hd0 $root
ntldr /ntldr
boot

Bạn sẽ thấy các lỗi sau nếu các mô-đun tương ứng chưa được tải sẵn như đã nói ở trên.

Unknown command 'search'.
error: unknown filesystem.
Unknown command 'chainloader'.
Unknown command 'ntldr'.
Unknown command 'drivemap'.

Nếu các tệp tin không được tìm thấy trên tất cả các phân vùng, bạn sẽ thấy một trong các lỗi sau:

error: no such device: /EFI/Microsoft/Boot/BCD.
error: no such device: /Boot/BCD.
error: no such device: /ntdetect.com.

Thêm trình đơn Grub2

Nếu bạn cài đặt Ubuntu hoặc các hệ điều hành Linux khác song song với Windows thì Windows sẽ được tự động thêm vào trình đơn Grub2. Nếu bạn cài đặt Grub2 thủ công, bạn có thể thêm Windows vào trình đơn Grub2 thủ công. Dưới đây là kịch bản Grub2 mà tôi đã viết cho AIO Boot:

menuentry "Windows" {
	insmod regexp
	set saved_root=$root
	for dev in (*,*); do
	regexp -s device '\((.*)\)' $dev
	if searchindevice "$device" ; then
		probe -s fstype -f $device
		if [ -z "$fstype" ] -o [ "$fstype" == "procfs" ]; then continue; fi
		probe -s tscheme -p $device
		if [ -n "$pc" ] -a [ "$tscheme" == "msdos" ]; then
			if test \
				   '(' -f ($device)/bootmgr -a -f ($device)/boot/bcd ')' \
				   -o \
				   '(' -f ($device)/bootmgr -a -f ($device)/boot/Bcd ')' \
				   -o \
				   '(' -f ($device)/bootmgr -a -f ($device)/boot/BCD ')' \
				   -o \
				   '(' -f ($device)/bootmgr -a -f ($device)/Boot/bcd ')' \
				   -o \
				   '(' -f ($device)/bootmgr -a -f ($device)/Boot/Bcd ')' \
				   -o \
				   '(' -f ($device)/bootmgr -a -f ($device)/Boot/BCD ')' \
				   -o \
				   '(' -f ($device)/bootmgr -a -f ($device)/BOOT/bcd ')' \
				   -o \
				   '(' -f ($device)/bootmgr -a -f ($device)/BOOT/Bcd ')' \
				   -o \
				   '(' -f ($device)/bootmgr -a -f ($device)/BOOT/BCD ')' \
				; then
				set root="$device"
				ntldr /bootmgr
				boot
			elif test \
				   '(' -f ($device)/ntldr -a -e ($device)/ntdetect.com -a -f ($device)/boot.ini ')' \
				   -o \
				   '(' -f ($device)/ntldr -a -e ($device)/ntdetect.com -a -f ($device)/BOOT.INI ')' \
				   -o \
				   '(' -f ($device)/ntldr -a -e ($device)/NTDETECT.COM -a -f ($device)/boot.ini ')' \
				   -o \
				   '(' -f ($device)/ntldr -a -e ($device)/NTDETECT.COM -a -f ($device)/BOOT.INI ')' \
				   -o \
				   '(' -f ($device)/NTLDR -a -e ($device)/ntdetect.com -a -f ($device)/boot.ini ')' \
				   -o \
				   '(' -f ($device)/NTLDR -a -e ($device)/ntdetect.com -a -f ($device)/BOOT.INI ')' \
				   -o \
				   '(' -f ($device)/NTLDR -a -e ($device)/NTDETECT.COM -a -f ($device)/boot.ini ')' \
				   -o \
				   '(' -f ($device)/NTLDR -a -e ($device)/NTDETECT.COM -a -f ($device)/BOOT.INI ')' \
				; then
				set root="$device"
				regexp -s devnum 'hd([0-9]+)' $root
				if test "$devnum" != "0"; then drivemap -s hd0 $root; fi
				ntldr /ntldr
				boot
			fi
		elif [ -n "$efi" ] -a [ "$fstype" == "fat" ] -a [ "$tscheme" == "gpt" ] -a [ -f ($device)/EFI/Microsoft/Boot/bootmgfw.efi ] -a [ -f ($device)/EFI/Microsoft/Boot/BCD ]; then
			root="$device"
			chainloader /EFI/Microsoft/Boot/bootmgfw.efi
			boot
		fi
		unset tscheme
		unset fstype
	fi
    done
	set root=$saved_root
	if [ "${grub_platform}" == "efi" ]; then set mode="UEFI mode"; else set mode="Legacy BIOS mode"; fi
	echo "Did not find the Windows operating system can be booted in ${mode}."
	echo
	echo -n "Press ESC to return to the menu "
	sleep -i -v 60
}

Trình đơn trên sẽ tự động quét và khởi động vào hệ điều hành Windows đang cài trên máy tính. Hỗ trợ Windows Vista, Windows 7 đến Windows 10 cho cả hai chế độ UEFI và Legacy BIOS. Hỗ trợ Windows XP/2003/2000 ở chế độ Legacy. Tôi nghĩ Windows 98/ME không cần phải được thêm vào.

Share this...Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInPin on PinterestShare on RedditShare on TumblrShare on VKBuffer this pageDigg thisEmail this to someoneFlattr the authorPrint this pageShare on StumbleUponShare on Yummly