1. 程式人生 > >ubuntu16.04+windows8.1GPT分割槽下的引導

ubuntu16.04+windows8.1GPT分割槽下的引導

硬碟的分割槽表格式是GUID的,所有的引導都會放置在一個fat32的ESP隱藏分割槽裡面,我原先的系統是windows8.1,在這個環境下面,分出來50個G來安裝ubuntu16.04作業系統,按照步驟安裝完成之後,不會出現只能進入windows8.1這個系統,什麼都不做的話都能進入系統選擇介面,安裝ubuntu16.04之後,預設的引導是ubuntu的grub程式,最主要的一個配置檔案是/boot/grub/grub.cfg配置,下面我將我電腦上的這個配置貼出來:

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub # ### BEGIN /etc/grub.d/00_header ### if [ -s $prefix/grubenv ]; then set have_grubenv=true 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 recordfail { set recordfail=1 if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; 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 insmod part_gpt insmod ext2 set root='hd0,gpt8' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt8 --hint-efi=hd0,gpt8 --hint-baremetal=ahci0,gpt8 4ea9abbf-1ff0-442c-b5a4-7ee6db251e0a else search --no-floppy --fs-uuid --set=root 4ea9abbf-1ff0-442c-b5a4-7ee6db251e0a fi font="/share/grub/unicode.pf2" fi if loadfont $font ; then set gfxmode=auto load_video insmod gfxterm set locale_dir=$prefix/locale set lang=zh_CN insmod gettext fi terminal_output gfxterm if [ "${recordfail}" = 1 ] ; then set timeout=30 else if [ x$feature_timeout_style = xy ] ; then set timeout_style=menu set timeout=10 # Fallback normal timeout code in case the timeout_style feature is # unavailable. else set timeout=10 fi fi ### END /etc/grub.d/00_header ### ### BEGIN /etc/grub.d/05_debian_theme ### set menu_color_normal=white/black set menu_color_highlight=black/light-gray if background_color 44,0,30,0; then clear fi ### END /etc/grub.d/05_debian_theme ### ### BEGIN /etc/grub.d/10_linux ### function gfxmode { set gfxpayload="${1}" if [ "${1}" = "keep" ]; then set vt_handoff=vt.handoff=7 else set vt_handoff= fi } if [ "${recordfail}" != 1 ]; then if [ -e ${prefix}/gfxblacklist.txt ]; then if hwmatch ${prefix}/gfxblacklist.txt 3; then if [ ${match} = 0 ]; then set linux_gfx_mode=keep else set linux_gfx_mode=text fi else set linux_gfx_mode=text fi else set linux_gfx_mode=keep fi else set linux_gfx_mode=text fi export linux_gfx_mode menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-5aa4c845-d1c3-4466-9f3b-19188a11e88c' { recordfail load_video gfxmode $linux_gfx_mode insmod gzio if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi insmod part_gpt insmod ext2 set root='hd0,gpt7' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7 8309c187-d72e-4085-aa54-a6064f5841db else search --no-floppy --fs-uuid --set=root 8309c187-d72e-4085-aa54-a6064f5841db fi linux /vmlinuz-4.4.0-22-generic.efi.signed root=UUID=5aa4c845-d1c3-4466-9f3b-19188a11e88c ro quiet splash $vt_handoff initrd /initrd.img-4.4.0-22-generic } #submenu 'Ubuntu 高階選項' $menuentry_id_option 'gnulinux-advanced-5aa4c845-#d1c3-4466-9f3b-19188a11e88c' { # menuentry 'Ubuntu,Linux 4.4.0-22-generic' --class ubuntu --class gnu-linux --class gnu --#class os $menuentry_id_option 'gnulinux-4.4.0-22-generic-advanced-5aa4c845-#d1c3-4466-9f3b-19188a11e88c' { # recordfail # load_video # gfxmode $linux_gfx_mode # insmod gzio # if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi # insmod part_gpt # insmod ext2 # set root='hd0,gpt7' # if [ x$feature_platform_search_hint = xy ]; then # search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 #--hint-baremetal=ahci0,gpt7 8309c187-d72e-4085-aa54-a6064f5841db # else # search --no-floppy --fs-uuid --set=root 8309c187-d72e-4085-aa54-a6064f5841db # fi # echo '載入 Linux 4.4.0-22-generic ...' # linux /vmlinuz-4.4.0-22-generic.efi.signed root=UUID=5aa4c845-#d1c3-4466-9f3b-19188a11e88c ro quiet splash $vt_handoff # echo '載入初始化記憶體盤...' # initrd /initrd.img-4.4.0-22-generic # } # menuentry 'Ubuntu, with Linux 4.4.0-22-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-22-generic-init-upstart-5aa4c845-d1c3-4466-9f3b-19188a11e88c' { # recordfail # load_video # gfxmode $linux_gfx_mode # insmod gzio # if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi # insmod part_gpt # insmod ext2 # set root='hd0,gpt7' # if [ x$feature_platform_search_hint = xy ]; then # search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7 8309c187-d72e-4085-aa54-a6064f5841db # else # search --no-floppy --fs-uuid --set=root 8309c187-d72e-4085-aa54-a6064f5841db # fi # echo '載入 Linux 4.4.0-22-generic ...' # linux /vmlinuz-4.4.0-22-generic.efi.signed root=UUID=5aa4c845-d1c3-4466-9f3b-19188a11e88c ro quiet splash $vt_handoff init=/sbin/upstart # echo '載入初始化記憶體盤...' # initrd /initrd.img-4.4.0-22-generic # } # menuentry 'Ubuntu, with Linux 4.4.0-22-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-22-generic-recovery-5aa4c845-d1c3-4466-9f3b-19188a11e88c' { # recordfail # load_video # insmod gzio # if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi # insmod part_gpt # insmod ext2 # set root='hd0,gpt7' # if [ x$feature_platform_search_hint = xy ]; then # search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7 8309c187-d72e-4085-aa54-a6064f5841db # else # search --no-floppy --fs-uuid --set=root 8309c187-d72e-4085-aa54-a6064f5841db # fi # echo '載入 Linux 4.4.0-22-generic ...' # linux /vmlinuz-4.4.0-22-generic.efi.signed root=UUID=5aa4c845-d1c3-4466-9f3b-19188a11e88c ro recovery nomodeset # echo '載入初始化記憶體盤...' # initrd /initrd.img-4.4.0-22-generic # } # menuentry 'Ubuntu,Linux 4.4.0-21-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-advanced-5aa4c845-d1c3-4466-9f3b-19188a11e88c' { # recordfail # load_video # gfxmode $linux_gfx_mode # insmod gzio # if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi # insmod part_gpt # insmod ext2 # set root='hd0,gpt7' # if [ x$feature_platform_search_hint = xy ]; then # search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7 8309c187-d72e-4085-aa54-a6064f5841db # else # search --no-floppy --fs-uuid --set=root 8309c187-d72e-4085-aa54-a6064f5841db # fi # echo '載入 Linux 4.4.0-21-generic ...' # linux /vmlinuz-4.4.0-21-generic.efi.signed root=UUID=5aa4c845-d1c3-4466-9f3b-19188a11e88c ro quiet splash $vt_handoff # echo '載入初始化記憶體盤...' # initrd /initrd.img-4.4.0-21-generic # } # menuentry 'Ubuntu, with Linux 4.4.0-21-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-init-upstart-5aa4c845-d1c3-4466-9f3b-19188a11e88c' { # recordfail # load_video # gfxmode $linux_gfx_mode # insmod gzio # if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi # insmod part_gpt # insmod ext2 # set root='hd0,gpt7' # if [ x$feature_platform_search_hint = xy ]; then # search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7 8309c187-d72e-4085-aa54-a6064f5841db # else # search --no-floppy --fs-uuid --set=root 8309c187-d72e-4085-aa54-a6064f5841db # fi # echo '載入 Linux 4.4.0-21-generic ...' # linux /vmlinuz-4.4.0-21-generic.efi.signed root=UUID=5aa4c845-d1c3-4466-9f3b-19188a11e88c ro quiet splash $vt_handoff init=/sbin/upstart # echo '載入初始化記憶體盤...' # initrd /initrd.img-4.4.0-21-generic # } # menuentry 'Ubuntu, with Linux 4.4.0-21-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-recovery-5aa4c845-d1c3-4466-9f3b-19188a11e88c' { # recordfail # load_video # insmod gzio # if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi # insmod part_gpt # insmod ext2 # set root='hd0,gpt7' # if [ x$feature_platform_search_hint = xy ]; then # search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7 8309c187-d72e-4085-aa54-a6064f5841db # else # search --no-floppy --fs-uuid --set=root 8309c187-d72e-4085-aa54-a6064f5841db # fi # echo '載入 Linux 4.4.0-21-generic ...' # linux /vmlinuz-4.4.0-21-generic.efi.signed root=UUID=5aa4c845-d1c3-4466-9f3b-19188a11e88c ro recovery nomodeset # echo '載入初始化記憶體盤...' # initrd /initrd.img-4.4.0-21-generic # } #} ### END /etc/grub.d/10_linux ### ### BEGIN /etc/grub.d/20_linux_xen ### ### END /etc/grub.d/20_linux_xen ### ### BEGIN /etc/grub.d/20_memtest86+ ### ### END /etc/grub.d/20_memtest86+ ### ### BEGIN /etc/grub.d/30_os-prober ### menuentry 'Windows 8.1' --class windows --class os $menuentry_id_option 'osprober-efi-000F-0352' { insmod part_gpt insmod fat set root='hd0,gpt1' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1 000F-0352 else search --no-floppy --fs-uuid --set=root 000F-0352 fi chainloader /EFI/Microsoft/Boot/bootmgfw.efi } set timeout_style=menu if [ "${timeout}" = 0 ]; then set timeout=10 fi ### END /etc/grub.d/30_os-prober ### ### BEGIN /etc/grub.d/30_uefi-firmware ### #menuentry 'System setup' $menuentry_id_option 'uefi-firmware' { # fwsetup #} ### END /etc/grub.d/30_uefi-firmware ### ### BEGIN /etc/grub.d/40_custom ### # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. ### END /etc/grub.d/40_custom ### ### 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 ###

這個配置的寫法感覺就是shell指令碼,這個檔案是ubuntu自動生成的,一般情況可以不用改。
裡面以#開頭的是批註,可以不用看,我們需要看的就是前面以menuentry開頭的內容,這個內容所代表的就是開機頁面啟動顯示的系統引導,例如:

menuentry 'Windows 8.1' --class windows --class os $menuentry_id_option 'osprober-efi-000F-0352' {
    insmod part_gpt
    insmod fat
    set root='hd0,gpt1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1  000F-0352
    else
      search --no-floppy --fs-uuid --set=root 000F-0352
    fi
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

在grub.cfg裡面,我上面的內容代表的我windows8.1的引導,如果沒有這個內容,那麼將無法進入windows8.1。
chainloader /EFI/Microsoft/Boot/bootmgfw.efi,這個代表我電腦裡面windows8.1系統的啟動管理所存在的位置,同理我電腦上面的ubuntu系統的引導配置:

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-5aa4c845-d1c3-4466-9f3b-19188a11e88c' {
    recordfail
    load_video
    gfxmode $linux_gfx_mode
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_gpt
    insmod ext2
    set root='hd0,gpt7'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  8309c187-d72e-4085-aa54-a6064f5841db
    else
      search --no-floppy --fs-uuid --set=root 8309c187-d72e-4085-aa54-a6064f5841db
    fi
    linux   /vmlinuz-4.4.0-22-generic.efi.signed root=UUID=5aa4c845-d1c3-4466-9f3b-19188a11e88c ro  quiet splash $vt_handoff
    initrd  /initrd.img-4.4.0-22-generic
}

這個就是我係統裡面的ubuntu引導。
在這個配置下面還有許多加了註釋的引導,例如ubuntu高階選項和Sytem setup這兩個引導,這是我自己加上了註釋,ubuntu生成這個grub.cfg的時候是沒有註釋的,那個時候開機啟動的時候顯示4個選項,第一個進入ubuntu,第三個進入windows8.1,剩餘的兩個基本沒什麼用,所以我為了介面簡化,加上了的註釋。
這裡面還有一些其他配置,裡面開機時候出現系統選擇引導介面預設等待時間,可以修改:

  if [ x$feature_timeout_style = xy ] ; then
    set timeout_style=menu
    set timeout=10
  # Fallback normal timeout code in case the timeout_style feature is
  # unavailable.
  else
    set timeout=10
  fi
set timeout_style=menu
if [ "${timeout}" = 0 ]; then
  set timeout=10
fi

那個set timeout=10,這裡面的進行了一個判斷,有一個timeout變數,這個變數就是儲存系統預設等待時間的變數,這些我們都可以不管,之後將set timeout=10後面的10改成其他的數字,那麼系統預設等待時間就會改變了。
因為使用的是ubuntu的grub引導,所以預設啟動的系統就是ubuntu,但是這個預設是可以改的:

if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="0"
fi

裡面有一個set default=”0”,這個0指向的就是ubuntu系統,我們可以更改成為windows對應的數字,也就是windows是第幾個引導而已,上面就是我的grub.cfg配置,預設的ubuntu引導