Thứ Bảy, 23 tháng 11, 2019

INSTALL GRUB2 TRÊN WINDOWS


INSTALL GRUB2 TRÊN WINDOWS
*****
1. TẢI VỀ GRUB2
Để tải bản mới nhất của grub, dành cho cả Windows và Linux bạn vào đường dẫn này.
https://ftp.gnu.org/gnu/grub/
2. CHUYỂN ĐẾN THƯ MỤC GIẢI NÉN CỦA GRUB VÀ CHẠY DÒNG LỆNH ĐỂ CÀI ĐẶT BOOTLOADER GRUB2 CHO Ổ ĐĨA CỦA BẠN
grub-install.exe   --boot-directory=G:\boot    --target=i386-pc    //./PHYSICALDRIVE2
- Trong đó [--boot-directory=] là vị trí lưu file boot của grub có thể thay G:\boot bằng một thư mục con trong G:, ở đây G:\boot là phân vùng cần chứa bootloader
- [--target=] là kiểu hệ điều hành cần tạo boot, [i386-pc] là cho hệ điều hành chế độ BIOS (CSM, Legacy), ngoài ra còn [x86_64-efi] cho boot hệ điều hành x64 efi, [i386-efi] cho hệ điều hành boot x86 efi
- [//./PHYSICALDRIVE2] là thứ tự ổ đĩa cần tạo grub2 bootloader, nếu là ổ USB thì chọn [--removeable]. Để biết thứ tự ổ đĩa bạn dùng lệnh list disk trong diskpart nhé. Vào cmd, gõ diskpart, gõ list disk.

grub-install.exe   --boot-directory=G:\boot    --efi-directory=G:   --target=x86_64-efi    --removable
3. Sau khi thực hiện lệnh chương trình sẽ thông báo thành công hay không.

- Nhớ rằng, để boot efi thì phân vùng chứa efi boot phải định dạng FAT32
- Nếu chọn kiểu boot efi thì cần xác định thư mục chứa boot-efi nữa qua [--efi-directory=], tuy nhiên lệnh tạo EFI chỉ thành công khi bạn đang boot OS với chế độ UEFI. Không sao, bạn chỉ cần tìm file grubx64.efi và đổi tên thành bootx64.efi và chép đè vào file bootx64.efi của windows là được, với efi x86 cũng làm tương tự.
- Ưu tiên tạo boot uefi x64 hơn nhé, vì trước sau thì chúng ta cũng phải gặp vấn đề cần giải quyết trên boot UEFI này.
- Dưới đây là vị trí file khi chọn –boot-directory=G:\boot, 2 thư mục boot và EFI này nằm ở gốc ổ G:


4. Tải file grub.cfg và đặt vào thư mục [ổ đĩa:\...\grub\]
- Sau đó thêm những menuentry {….} của hệ điều hành mà bạn muốn vào.
- Ví dụ menuentry windows 7
menuentry "Windows 7  BIOS" {
insmod part_msdos
insmod ntfs
set root='(hd0,msdos1)'
chainloader +1
}
- Những OS khác các bạn tự tìm trên mạng
menuentry "OS using grub2" {
   insmod xfs
   search --set=root --label OS1 --hint hd0,msdos8
   configfile /boot/grub/grub.cfg
}
menuentry "OS using grub2-legacy" {
   insmod ext2
   search --set=root --label OS2 --hint hd0,msdos6
   legacy_configfile /boot/grub/menu.lst
}
menuentry "Windows XP" {
   insmod ntfs
   search --set=root --label WINDOWS_XP --hint hd0,msdos1
   ntldr /ntldr
}
menuentry "Windows 7" {
   insmod ntfs
   search --set=root --label WINDOWS_7 --hint hd0,msdos2
   ntldr /bootmgr
}
menuentry "FreeBSD" {
          insmod zfs
          search --set=root --label freepool --hint hd0,msdos7
          kfreebsd /freebsd@/boot/kernel/kernel
          kfreebsd_module_elf /freebsd@/boot/kernel/opensolaris.ko
          kfreebsd_module_elf /freebsd@/boot/kernel/zfs.ko
          kfreebsd_module /freebsd@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
          set kFreeBSD.vfs.root.mountfrom=zfs:freepool/freebsd
          set kFreeBSD.hw.psm.synaptics_support=1
}
menuentry "experimental GRUB" {
          search --set=root --label GRUB --hint hd0,msdos5
          multiboot /experimental/grub/i386-pc/core.img
}

menuentry "Fedora 16 installer" {
          search --set=root --label GRUB --hint hd0,msdos5
          linux /fedora/vmlinuz lang=en_US keymap=sg resolution=1280x800
          initrd /fedora/initrd.img
}
menuentry "Fedora rawhide installer" {
          search --set=root --label GRUB --hint hd0,msdos5
          linux /fedora/vmlinuz repo=ftp://mirror.switch.ch/mirror/fedora/linux/development/rawhide/x86_64 lang=en_US keymap=sg resolution=1280x800
          initrd /fedora/initrd.img
}
menuentry "Debian sid installer" {
          search --set=root --label GRUB --hint hd0,msdos5
          linux /debian/dists/sid/main/installer-amd64/current/images/hd-media/vmlinuz
          initrd /debian/dists/sid/main/installer-amd64/current/images/hd-media/initrd.gz
}
* Với windows uefi chúng ta tìm tới bootmgfw.efi
menuentry 'Windows 10' {
    search --fs-uuid --no-floppy --set=root FF44-56B0
    chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi
}
* FF44-56B0 là UUID của phân vùng, nếu bạn dùng lệnh search --file thì sẽ có lúc, trên 1 máy tính khác có sẵn file bootmgfw.efi và chúng ta không biết là nó boot file nào. UUID của ổ đĩa, chúng ta có thể chạy thử grub2 trên giả lập và dùng lệnh "ls -l" để hiện thị UUID của phân vùng chúng ta muốn dùng. Lệnh ls –l sẽ liệt kê từ phân vùng cuối đến phân vùng đầu trên ổ đĩa, như hình dưới đây, ta nên xem dung lượng phân vùng và mã thứ tự để biết phân vùng cần chọn.

* Nếu bạn cài đặt efi trong môi trường bios sẽ bị báo lỗi, nhưng file efi của grub vẫn được tạo ra, khi đó, bạn có thể đổi tên grubx64.efi thành bootx64.efi và chép đè vào \efi\boot\bootx64.efi của windows.
* Khi cài đặt grub UEFI thì cũng đã tự động tạo thư mục grub cho BIOS rồi, cả grub uefi và grub bios đều dùng chung thư mục cấu hình bios, nên bạn chỉ cần điều chỉnh file grub.conf trong thư mục [ổ đĩa:]\[thư mục chứa grub]\grub là được. Các bạn cứ thêm đầy đủ các menuentry cho từng lựa chọn boot bios và uefi trong file grub.conf đó, khi boot trên máy tính, nếu bạn chọn menu boot này không được thì chọn menu boot kia là được.
5. Có thể tùy chỉnh màu sắc và hình nền cho menu boot bằng các thông số sau
- Hình ảnh để làm nền có kích thước 640x480px, dạng màu 8bit
- Trong file grub.conf cần phải khai báo các thông số và load module như sau.
            insmod gfxterm
            insmod png
            terminal_output gfxterm
            background_image -m stretch ${prefix}/wall.png
- Một số lệnh điều chỉnh menu
     color_normal=white/black
     menu_color_normal=white/black
     menu_color_highlight=green/black
Dưới đây là 1 file grub.conf mà tôi đã sửa lại cho dễ nhìn. Bạn copy vào file grub.conf của mình và chạy thử để xem thế nào.
if [ -s $prefix/grubenv ]; then
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="0"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
            font="${prefix}/fonts/unicode.pf2"
fi

if loadfont $font ; then
            load_video
            insmod gfxterm
            insmod png
            terminal_output gfxterm
            background_image -m stretch ${prefix}/wall.png
            color_normal=white/black
            menu_color_normal=white/black
            menu_color_highlight=green/black
fi
if [ x$feature_timeout_style = xy ] ; then
  set timeout_style=menu
  set timeout=15
else
  set timeout=15
fi

#BOOT ENTRY BEGIN

menuentry "Windows 7 BIOS" {
insmod part_msdos
insmod ntfs
set root='(hd0,msdos1)'
chainloader +1
}

menuentry 'Windows 7 efi' {
            insmod part_msdos
            insmod fat
    search --fs-uuid --no-floppy --set=root FF44-56B0
    chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi
}

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
            source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
            source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###