如何在UEFI模式下Win8與Ubuntu多系統的安裝?

我的主板支持UEFI,然後我將硬碟GPT分區了

我有兩個U盤,是Win8與Ubuntu的系統安裝盤

我先安裝Win8,然後安裝Ubuntu,可是安裝完Ubuntu之後就再也看不到Win8啟動項了,修復完Win8的啟動項後就無法進入Ubuntu了。

有高手能夠告訴我一下,怎麼樣用UEFI引導這兩個系統嗎?如果我是兩個硬碟的話,是不是就簡單多了,只要在開機的時候選擇啟動的硬碟就行了呢?

可以的話過程詳細點啊,非常感謝各位~~


因為uefi默認是去執行uefi分區的/efi/boot/bootx64.efi這個文件,win8安裝時會首先創建自己的目錄/efi/microsoft/boot,並在裡面放置bootmgfw.efi(有efi shell可以直接執行這個來啟動win8),然後再把bootmgfw.efi拷一份到/efi/boot里並命名成bootx64.efi,這樣系統默認就從win8啟動了;

然後你裝ubuntu的時候,ubuntu也會創建/efi/ubutntu/這個目錄並放一個grub.efi(也可能叫grubx64.efi,記不清了),作用類似於win8的bootmgfw.efi。然後ubuntu再把grub.efi複製一份到/efi/boot並命名成bootx64.efi里想讓自己成為默認啟動項,但這樣就覆蓋了win8的那個,結果就出現了題主說的情況。

解決的辦法其實是用efi shell的bcfg這個命令分別為win8和ubuntu添加啟動項到bios的啟動設備列表裡,然後設置其實一個為默認啟動。或者默認從grub啟動然後讓grub來管理系統啟動列表。


sudo update-grub


先裝的win8,再裝的arch,把win8的保留分區刪了,然後共用efi系統分區,此分區掛載在arch的/boot/efi目錄下,最後只能進arch。按網上搜索的辦法修復了無數次都無效,最後重裝win,掛載方法與前面一樣(參見arch的wiki中grub的安裝)。重裝win後,u盤啟動進arch,chroot進已經安裝好的arch,安裝grub。

說一下自己的一份可以正確啟動的配置以供參考吧。

1. 固件設置中,UEFI ONLY, cms禁用,安全啟動禁用。

2.efi系統分區(/boot/efi)的結構是這樣的.(efi分區掛到arch的/boot/efi目錄下)

$ tree /boot/efi -L 4

/boot/efi

└── EFI

├── arch_grub

│ └── grubx64.efi

├── Boot

│ └── bootx64.efi

└── Microsoft

└── Boot

├── BCD

├── BCD.LOG

├── BCD.LOG1

├── BCD.LOG2

├── bg-BG

├── bootmgfw.efi

├── bootmgr.efi

├── BOOTSTAT.DAT

├── boot.stl

├── cs-CZ

├── da-DK

├── de-DE ..... 略去一堆語言的文件,不重要

其中,/EFI/Boot/bootx64.efi和/EFI/Microsoft/Boot/bootmgfw.efi是同樣文件的不同命名,在這裡下載他們。

3. 主要配置文件,

/etc/grub.d/40_custom (用於生成/boot/grub/grub.cfg中的自定義引導項),其中uuid(下面的E41F-6734)和hint-string(下面的--hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2) 的獲取在archwiki中grub那節都有詳細說明

#!/bin/sh
exec tail -n +3 $0

menuentry "Microsoft Windows 8 x86_64 UEFI-GPT" {
insmod part_gpt
insmod fat
insmod search_fs_uuid
insmod chain
search --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 E41F-6734
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

menuentry "System shutdown" {
echo "System shutting down..."
halt
}

menuentry "System restart" {
echo "System rebooting..."
reboot
}

/boot/grub/grub.cfg: (由命令grub-mkconfig -o /boot/grub/grub.cfg生成)

### BEGIN /etc/grub.d/00_header ###
insmod part_gpt
insmod part_msdos
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
insmod part_gpt
insmod ext2
set root="hd0,gpt5"
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5 02dbcdb7-8b21-435f-a3a1-91b5712f257f
else
search --no-floppy --fs-uuid --set=root 02dbcdb7-8b21-435f-a3a1-91b5712f257f
fi
font="/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
set gfxmode=auto
load_video
insmod gfxterm
set locale_dir=$prefix/locale
set lang=en_US
insmod gettext
fi
terminal_input console
terminal_output gfxterm
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=5
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/10_linux ###
menuentry "Arch Linux" --class arch --class gnu-linux --class gnu --class os $menuentry_id_option "gnulinux-simple-02dbcdb7-8b21-435f-a3a1-91b5712f257f" {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set root="hd0,gpt5"
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5 02dbcdb7-8b21-435f-a3a1-91b5712f257f
else
search --no-floppy --fs-uuid --set=root 02dbcdb7-8b21-435f-a3a1-91b5712f257f
fi
echo "Loading Linux linux ..."
linux /boot/vmlinuz-linux root=UUID=02dbcdb7-8b21-435f-a3a1-91b5712f257f rw quiet
echo "Loading initial ramdisk ..."
initrd /boot/initramfs-linux.img
}
submenu "Advanced options for Arch Linux" $menuentry_id_option "gnulinux-advanced-02dbcdb7-8b21-435f-a3a1-91b5712f257f" {
menuentry "Arch Linux, with Linux linux" --class arch --class gnu-linux --class gnu --class os $menuentry_id_option "gnulinux-linux-advanced-02dbcdb7-8b21-435f-a3a1-91b5712f257f" {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set root="hd0,gpt5"
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5 02dbcdb7-8b21-435f-a3a1-91b5712f257f
else
search --no-floppy --fs-uuid --set=root 02dbcdb7-8b21-435f-a3a1-91b5712f257f
fi
echo "Loading Linux linux ..."
linux /boot/vmlinuz-linux root=UUID=02dbcdb7-8b21-435f-a3a1-91b5712f257f rw quiet
echo "Loading initial ramdisk ..."
initrd /boot/initramfs-linux.img
}
menuentry "Arch Linux, with Linux linux (fallback initramfs)" --class arch --class gnu-linux --class gnu --class os $menuentry_id_option "gnulinux-linux-fallback-02dbcdb7-8b21-435f-a3a1-91b5712f257f" {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set root="hd0,gpt5"
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5 02dbcdb7-8b21-435f-a3a1-91b5712f257f
else
search --no-floppy --fs-uuid --set=root 02dbcdb7-8b21-435f-a3a1-91b5712f257f
fi
echo "Loading Linux linux ..."
linux /boot/vmlinuz-linux root=UUID=02dbcdb7-8b21-435f-a3a1-91b5712f257f rw quiet
echo "Loading initial ramdisk ..."
initrd /boot/initramfs-linux-fallback.img
}
}

menuentry "Microsoft Windows 8 x86_64 UEFI-GPT" {
insmod part_gpt
insmod fat
insmod search_fs_uuid
insmod chain
search --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 E41F-6734
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

menuentry "System shutdown" {
echo "System shutting down..."
halt
}

menuentry "System restart" {
echo "System rebooting..."
reboot
}
### 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 ###

### BEGIN /etc/grub.d/60_memtest86+ ###
### END /etc/grub.d/60_memtest86+ ###

4.差不多這些吧,不懂win啟動的細節,修復不好只能重裝了。。。


UEFI自帶引導的。Linux下可以用efibootmgr管理。添加win的引導也是相當容易。可以參考下arch的文檔,基本通用的。Unified Extensible Firmware Interface

當然,UEFI的引導一般為Windows開了小門,很可能會自動激活win的引導為默認,你改了之後它還是改回來的(解決方案:禁用後重新添加新項,不可禁用的情況下,直接替換)。因為你先裝的win,後裝的Linux,所以應該沒有這個問題,只要把win的efi引導文件配置進去就行了(efibootmgr)。

PS:如果你後裝的Ubuntu,我不太清楚你是不是使用了新的efi分區(一個很小的FAT分區,很可能Ubuntu安裝的時候沒有自動識別原來windows的efi分區,又或者你手動指定了另一個分區),如果你沒有使用windows原來的efi分區的話,那麼win的引導顯然是找不到的。當然,做法很簡單,把win的efi文件從原來的分區拷貝到現在的分區即可。efi分區默認掛載點應該在/boot/efi

典型的efibootmgr輸出如下:

-&> % efibootmgr -v
BootCurrent: 0000
Timeout: 0 seconds
BootOrder: 0000,3000,0001,0002,0003,2001,2002,2003
Boot0000* Windows Boot Manager HD(1,20000,100000,8c2edb26-db0f-49f4-8b08-e04cfd8413f1)File(EFIMicrosoftBootootmgfw.efi)RC
Boot0001* arch HD(1,20000,100000,8c2edb26-db0f-49f4-8b08-e04cfd8413f1)File(EFIarchgrubx64.efi)
Boot0002* Windows 8.1 HD(1,20000,100000,8c2edb26-db0f-49f4-8b08-e04cfd8413f1)File(EFIMicrosoftBootwin.bootmgfw.efi)
Boot0003* Syslinux HD(1,20000,100000,8c2edb26-db0f-49f4-8b08-e04cfd8413f1)File(EFIsyslinuxsyslinux.efi)
Boot2001* USB Drive (UEFI) RC
Boot2002* Internal CD/DVD ROM Drive (UEFI) RC
Boot3000* Internal Hard Disk or Solid State Disk RC

* * *

補充下grub在UEFI下的位置。

UEFI首先通過grub的EFI文件引導grub,然後grub通過其它efi文件引導別的(當然,也包括Linux內核)。

在UEFI環境下,grub不是必要的。實際上Linux內核可以直接作為efi文件引導。應該就是所謂的EFISTUB,具體我也不太清楚。這個我成功配置過,用了幾個月,但是相當不穩定,可能會因為某次內核的更新而引導失敗。所以,選擇用grub之類的中轉是一個相當穩妥的方案。

個人建議:不要用grub配置windows的引導。只要你的EFI分區配置正確,那麼你總是可以通過UEFI來引導(在我這邊是F9調出引導界面)。你也不需要考慮雙硬碟,選擇硬碟優先順序什麼的(這事我還真干過,但改優先順序絕對不是一件很方便的操作,花費的時間遠多於UEFI的配置)。

UEFI可以選擇從EFI文件引導,如果你發現沒有UEFI的windows引導項的話,可以直接找windows的efi文件。找不到?那顯然是你的EFI分區配置有問題,把windows的efi下的目錄拷貝到當前efi分區即可。這是一個不錯的錯誤排查方案:)


現在ubuntu+win8的引導不管是MBR還是EFI+GPT都用grub來引導比較好。

你的ubuntu是什麼版本?

根據我個人經驗,並且在13.10與14.04的daily-build版驗證了的。在UEFI+GPT環境下,先安裝win8,之後再安裝ubuntu,安裝ubuntu的時候,選擇將boot loader放在windows的efi分區。

安裝完畢後可能出現開機直接進入windows,ubuntu好像根本沒安裝一樣,這時在開機時進入啟動硬體的選擇界面,我的HP電腦是按F9,其餘電腦可能有不同,裡面應該有Ubuntu的啟動項。

以後都可以這樣進入ubuntu,但是想要開機自動出現選擇系統的界面,即用grub引導的話,可以ubuntu中安裝boot-repair,運行,選擇推薦操作就可以了,等修復完畢,重啟應該就OK了。PS:boot-repair可以在安裝盤裡面的try ubuntu選項進去的ubuntu試用界面安裝運行,也可以在安裝好的ubuntu中運行。

以上是最簡單一鍵式傻瓜操作了。還有一種稍微複雜一點點的笨辦法,可以看看這裡:https://blog-kongkong.rhcloud.com/2014/02/07/%E8%AE%BE%E7%BD%AE%E7%94%B1grub2%E5%BC%95%E5%AF%BCubuntuwindowsefigpt%E5%8F%8C%E7%B3%BB%E7%BB%9F/

對grub一竅不通的話就不要亂嘗試了。祝你一切順利。


很簡單,開機按F12鍵,你會看到一個單獨的win8啟動項,它是獨立的,已經跳出grub之外


我的是先安裝了win10,然後在SSD上剩餘的37G里想裝個Linux。機器是UEFI+GPT。無論是Ubuntu15.10還是Deepin15.1都是安裝完以後重啟就直接進win10,用過了boot-repair的推薦修復,也是一樣。系統里EasyUEFI調了一下,還是不行。

作為一名Linux接觸不多的准小白,看了樓上那些雲山霧罩的回復後已經徹底的絕望了。


剛剛花了一下午時間,終於搞定了。

通過Linux安裝U盤進入臨時的Linux系統,並聯網

  1. 重建Linux的EFI文件

# 掛載安裝的Linux分區
sudo mount /dev/sd*** /mnt
# 掛載EFI分區
sudo mount /dev/sd** /mnt/boot/efi
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
# chroot到安裝的Linux
sudo chroot /mnt
# 重裝grub-efi
apt-get install --reinstall grub-efi
# 安裝Linux的efi
grub-install /dev/sd*
# 更新grub配置
update-grub

注意 : sd* 為你的磁碟 , sd** 為你的EFI分區,sd*** 為你的Linux分區具體編號請使用 GParted 查看上訴操作後,查看grubx64.efi是否成功創建

file /boot/efi/EFI/debian/grubx64.efi

如果創建成功,會顯示/boot/efi/EFI/debian/grubx64.efi: PE32+ executable (EFI application) x86-64 (stripped to external PDB), for MS Windows

查看啟動項是否創建成功

efibootmgr

2. 第一步操作完,如果你就重啟,你會發現你的啟動菜單里找不到Windows,所以這一步添加Windows菜單

  • 使用blkid /dev/sda* ,sda*為你的啟動分區編號,自己修改。得到UUID,填到步驟2中。
  • 編輯/etc/grub.d/40_custom 文件,在末尾添加下面內容,替換下面的UUID:4F84-EE2E,下面的hd0,gpt2中,hd代表硬碟,0代表第一塊硬碟,hd0對應Gparted中的sda,gpt代表gpt分區表,後面的2代表第二個分區。

menuentry "Windows 10" {
insmod part_gpt
insmod fat
insmod search_fs_uuid
insmod chain
set root="(hd0,gpt2)"
search --fs-uuid --no-floppy --set=root 4F84-EE2E
chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi
}

  • 最後更新grub.cfg

sudo update-grub

3. 重啟,這時開機會啟動Grub,Windows和Linux都在菜單上


直接用grub2替換默認引導器,GRUB2直接引導win跟linux分區里的efi啟動文件就好,我就這麼乾的,很好用。


我是給SurfacePro安了GRUB,與 @蘇好鐵 的方法非常類似。

但由於我想把Ubuntu安裝在MicroSD卡上,而SurfacePro默認的快速啟動是不載入MicroSD讀卡器和其他USB驅動的(所以你即使有時間按到F7,看到了啟動菜單也只有硬碟的那個),為了保證每次開機都可以引導到Fedora(移動硬碟當中)或者Ubuntu(MicroSD卡),安裝GRUB(版本是隨Ubuntu發送的GRUB2)。

分區為:

  1. 600M WinRETools
  2. 200M EFI
  3. 128M MSR
  4. Windows
  5. 500M boot(ext3)
  6. 350 Recover

這500M是從Windows那個大分區擠出來的,其餘是安Windows的時候自動分的

對應Linux的掛載點為:500M掛在/boot,200Mefi掛在/boot/efi,其他分區不掛。

接下來記不清了,給個大概吧:

最開始是進Win8,高級重啟之後進Fedora(或者是LiveCD?),grub update生成新的菜單,efibootmgr修改默認啟動順序,用GRUB的EFI文件覆蓋 /boot/efi/EFI/BOOT/BOOTX64.EFI(不確定這一步是否必要)。我的efibootmgr是這樣的

# efibootmgr -v
BootCurrent: 0002
Timeout: 2 seconds
BootOrder: 0002,0001,0003
Boot0001* Windows Boot Manager
Boot0002* ubuntu
Boot0003* UEFI: Generic-USB3.0 CRW -SD1.00

我是因為怕EFI分區太小,還有就是每次更新內核的話這個200M不夠用,所以另外划了個/boot分區。


推薦閱讀:

對非IT從業者來說,日常辦公所用的桌面系統,用linux取代windows的主要障礙在哪裡?
魅族有關ubuntu touch的營銷做得怎麼樣?
如何看待「ubuntu團隊」微博爆出mx4pro的配置?
有什麼工作是 Ubuntu 無法完成的?
軟體該不該自繪界面而不用系統默認的界面?

TAG:Linux | Ubuntu | Windows7 | 硬碟分區 | 雙系統 |