本文為作者原創,允許轉載,但必須注明原文地址: https://www.cnblogs.com/byronxie/p/9949789.html
動機
最近在自學MIT6.828 Operating System Engineering, 這門課程的代碼是針對Linux系統(Ubuntu)的。
我有一台WIN10平板電腦,基本信息如下:
- 型號是酷比魔方KNOTE8
- 處理器是Intel Core m3-7Y30 CPU @1.00GHz 1.61GHz
- RAM 8.00GB
學習編程,必須要動手練習。為了讓MIT6.828的課程的代碼跑起來,我先后:
- 先裝了一個虛擬機 Virtual Box, 這個虛擬機是免費的,但是速度太慢了。我的平板電腦是支持觸屏的,但Virtual Box對觸屏支持很差。速度慢+體驗差,所以我決定放棄虛擬機。
- 在WIN10上安裝Cywin,模擬Linux環境。結果編譯MIT6.828中的代碼時一直報錯缺少一些依賴的庫。這個問題很難修復,所以就放棄了。
- 為了速度快+體驗好,我決定裝WIN10+Ubuntu雙系統。
手邊只有一個平板電腦,沒有U盤,光盤,所以計划是直接從硬盤安裝Ubuntu操作系統。
網上有相關資料,但很零散,所以我就寫一篇完整的,希望可以幫助有同樣需求的人,可以少走一些彎路。
適用
下面介紹的WIN10+Ubuntu雙系統安裝教程適用於下面情況:
1. 電腦中已經有一個Windows操作系統
雖然我自己是WIN10操作系統,但對WIN8, WIN7應該也適用。
2. 你電腦硬盤的分區是 GPT分區,非MBR分區。
如果不知道如何查看電腦硬盤是GPT分區還是MBR分區,參照[2]
如果你硬盤分區格式是MBR,恭喜你,你可以通過EasyBCD輕松地安裝雙系統,建議你到百度搜索相關教程。EasyBCD是免費的哦
3. 電腦的啟動方式是 UEFI,而非傳統的BIOS模式
如果你的電腦是傳統的BIOS啟動方式,恭喜你,你可以通過EasyBCD輕松地安裝雙系統.
4. 你想直接通過硬盤安裝 (你電腦不支持,或者你不想通過U盤、光盤安裝)
如果上面的條件你都滿足,那么下面的教程應該適合你。
安裝概覽
我怎么折騰的過程就不分享了,直接上成功的經驗吧。
在開始具體一步步操作之前,先大概介紹一下安裝的過程。
1. 壓縮磁盤,得到一個可安裝Ubuntu的free space分區(黑色)
2. 在free space分區中新建一個200M左右的分區(本后面將此分區起名為 MY_UEFI),用於存放Grub 2啟動文件
3. 准備Ubuntu鏡像安裝文件 (文件類型位iso, 比如 ubuntu-16.04.5-desktop-i386.iso)。本教程假設鏡像文件在C盤根目錄。
4. 下載Grub 2,生成能被EFI識別、加載的Grub 2鏡像文件 (使用Grub 2自帶的工具 grub-mkimage.exe生成鏡像文件)
5. 在盤MY_UEFI的根目錄創一個EFI文件夾,拷貝步驟4創建的相關文件到EFI文件夾。
6. 重啟系統,按快捷鍵進入啟動選項,進入 Grub 2界面,在Grub 2命令行中獲得鏡像文件所在的gpt分區。 (注: C盤不一定就對應gpt1哦,最好在grub命令行得到每個磁盤分區的gpt號。當然也可以瞎猜,一個個試)
7. 獲得iso文件所在磁盤分區的gpt號之后,重啟系統,進入Windows系統。添加Ubuntu鏡像文件作為一個入口點到Grub 2的啟動配置文件中
8. 重啟系統,進入Grub 2,啟動Ubuntu並安裝
10. 安裝完成Ubuntu后,如果Ubuntu最后安裝Grub 2失敗,需要重新進入Windows,修改Grub 2的 配置文件,使它能正常引導新安裝的Ubuntu系統啟動。
如果一切順利,就可以開始享受Ubuntu啦!
重要提醒:
安裝雙系統有風險,操作不當可能導致原來系統、重要數據被擦除,電腦不能啟動成磚頭。所以建議多看,有很大把握再慢慢操作,一定要慢!!
下面就是我冒然操作導致我的KNOTE 8成磚頭的教訓。
能被UEFI啟動的Grub 2鏡像文件是由`grub-mkimage.exe`生成的,`grub-mkimage.exe`的格式是 `grub-mkimage.exe [OPTION...] [OPTION]... [MODULES]`,我隨意改了《【Grub2】UEFI添加grub2引導》[9]中的命令,把
`grub-mkimage.exe -c ./x86_64-efi.cfg -p /EFI/grub -o ./bootx64.efi -O x86_64-efi -d ./x86_64-efi part_gpt part_msdos disk fat exfat ext2 ntfs xfs appleldr hfs iso9660 normal search_fs_file configfile linux linux16 chain loopback echo efi_gop efi_uga video_bochs video_cirrus file gfxmenu gfxterm gfxterm_background gfxterm_menu halt reboot help jpeg ls png true`
中的后半部分[MODULES]
`part_gpt part_msdos disk fat exfat ext2 ntfs xfs appleldr hfs iso9660 normal search_fs_file configfile linux linux16 chain loopback echo efi_gop efi_uga video_bochs video_cirrus file gfxmenu gfxterm gfxterm_background gfxterm_menu halt reboot help jpeg ls png true`
都刪掉了,導致Grub 2識別不了硬盤格式等,直接進入Grub rescue模式后,我只有按電源鍵強制關機重啟,然后電腦就像抽了一樣,在開機時按ESC、F7、DEL鍵都沒反應,直接再次進入Grub rescue模式,此時的電腦就成磚頭了,就像下圖(我把BIOS設置中的QIEUT BOOT關閉了,所以就不顯示酷比魔方圖標,而是顯示Megatrends信息)。
如果你遇到同樣問題,建議你通過Type-C接口外接鍵盤試試,或者拆開機器,取下固態硬盤開機后開機,讓UEFI程序重置一下,接着插入固態硬盤,機器又能正常啟動進入Windows了。
我是通過后一種方式解決的,同時附上固態硬盤的位置:
建議:保持 Windows Boot Manager 為第一個默認啟動選項,至少在KNOTE8上這樣設置。
在通過Grub 2安裝Ubuntu成功前,不要通過EasyUEFI工具、BIOS等將Grub 2設置為第一個默認入口至,少在酷比魔方KNOTE8上不要這樣設置。
具體安裝步驟
1. 關閉電源選項中的 啟用快速啟動(推薦),如下圖
2. 壓縮磁盤
2.1 打開 文件資源管理器,鼠標右擊 此電腦,鼠標點擊 管理。
2.2 在彈出的 計算機管理 界面中,點擊左邊列表中的 存儲->磁盤管理
選擇一個剩余空間比較多的磁盤,鼠標右擊,點擊 壓縮卷,如下圖
2.3 在 可用壓縮空間量(MB)(E) 中輸入你想為 Ubuntu 系統分配的磁盤空間, 然后點擊 壓縮
4.4 得到一個 未利用 分區(黑色)
第一步就算完成了
3. 新建一個分區存放Grub 2的啟動文件
在free space分區中新建一個200M左右的分區(本后面將此分區叫做 MY_UEFI),后面用於存放Grub 2啟動文件。單獨存放啟動文件,避免損壞。損壞可能電腦就不能啟動了。
3.1 鼠標右擊步驟2創建的 未分配空間
3.2 在 簡單卷大小(MB)(S) 中輸入要為Grub 2啟動文件分配的大小,本教程設置為 200 MB
3.3 本教程中把 這個分區取名為 MY_UEFI
4. 准備 Ubuntu 鏡像安裝文件
可以去Ubuntu官網[7]下載。
我下載了一個32位16.0.4LTS版本。
5. 下載Grub 2,生成能引導Grub 2啟動的EFI文件
5.1 可以通過Grub 2官網[8]下載,可以通過ftp或者git下載。
下載到本地后,進入Grub 2文件夾,我的在 C:\grub\grub-2.02-for-windows
下面的操作步驟參考自 《【Grub2】UEFI添加grub2引導》[9],下面以64位電腦為例(不是要安裝的操作系統的位數)。如果下面64位的方法不行,可以參考[9]中方法按32位生成一個啟動文件試試。
5.2 打開 CMD 命令行,通過下面命令切換到 Grub 2所在文件夾
cd /D C:\grub\grub-2.02-for-windows
5.3 生成配置文件
在grub-2.02-for-windows當前目錄下新建一個配置文件,因為是64的,所以配置文件命名為x86_64-eif.cfg(可以先創建一個 txt 文件,然后把后綴從txt改為cfg即可)。文件內容如下:
search --file /EFI/grub/x64.cfg --set root
set prefix=($root)/EFI/grub configfile ($root)/EFI/grub/x64.cfg
第一行: # The line start with # is one comment # 查找含有 /EFI/grub/x64.cfg的分區,並將分區號賦給root
第二行: 設置變量 prefix
第三行: 加載一個配置文件,讀取配置文件中的 entry point(操作系統入口),並在啟動目錄中顯示。x64.cfg就是我們的啟動目錄配置文件,待會兒我們會創建
如果對上面每行的命令想深入了解,可以到Grub 2[10]官網查看官方文檔。
5.4 生成引導Grub 2啟動的EFI文件
grub-mkimage.exe -c ./x86_64-efi.cfg -p /EFI/grub -o ./bootx64.efi -O x86_64-efi -d ./x86_64-efi part_gpt part_msdos disk fat exfat ext2 ntfs xfs appleldr hfs iso9660 normal search_fs_file configfile linux linux16 chain loopback echo efi_gop efi_uga video_bochs video_cirrus file gfxmenu gfxterm gfxterm_background gfxterm_menu halt reboot help jpeg ls png true
`grub-mkimage.exe`的作用是生產一個可啟動的GRUB鏡像文件,這個鏡像文件就是UEFI可以啟動的OS Loader。
`grub-mkimage.exe`的語法是:
grub-mkimage.exe [OPTION...] [OPTION]... [MODULES]
上述命令行中的前半部分 `grub-mkimage.exe -c ./x86_64-efi.cfg -p /EFI/grub -o ./bootx64.efi -O x86_64-efi -d ./x86_64-efi` 是Grub 2的[OPTION],比如 `-o ./bootx64.efi` 中的 `-o`后面接的就是生成的Grub 2的EFI啟動文件。
上述命令的后半部分’(從`part_gpt `到結尾的`true`),都是我們將要用到的Grub 2的模塊。這些模塊存放在文件夾`x86_64-efi`下面,比如第一個`part_gpt`就對應文件夾`x86_64-efi`下面的`part_gpt.mod`。
注意:不要隨意刪除后部分中的模塊!! 比如,如果刪除 `gpt_part`模塊,Grub 2就不能識別GPT分區,然后報錯,Grub 2就會進入 Grub rescue模式。如果啟動模式設置有問題,就算重啟也會卡在Grub rescue模式,換句話說,電腦就成磚頭了!!
如果對上述命令不懂,可以輸入 `grub-mkimage.exe –help` 查看幫助文檔,和Grub 2的官方文檔。
5.5 在C盤根目錄創建一個文件夾 EFI,最終的文件夾結構如下。
/EFI ├───boot │ bootx64.efi | | └───grub │ x64.cfg
│ unicode.pf2 ├───locale ├───themes └───x86_64-efi
將5.4中生成的bootx64.efi文件拷貝指boot目錄下。
同時將`grub-2.02-for-windows`自帶的文件夾 locale, theme和x86_64-efi和文件unicode.pf2拷貝到grub文件夾中。
5.6 創建Grub 2入口配置文件(啟動列表)
現在的入口文件只是一個框架,等我們在Grub 2命令行中查到Windows和Ubuntu ISO文件所在的gpt分區號,在回來添加。
在grub文件夾夾中創建 x64.cfg文件,文件內容如下。
if loadfont /boot/grub/unicode.pf2 ; then set gfxmode=auto insmod efi_gop insmod efi_uga insmod gfxterm terminal_output gfxterm fi #default select menu index set default=0 #timeout set timeout_style=menu set timeout=5 set menu_color_normal=white/black set menu_color_highlight=black/light-gray menuentry "-------------------" --class ubuntu --class os{ set root='(hd0,gpt1)' } menuentry "reboot" --class windows --class os{ insmod reboot reboot } menuentry "halt" --class windows --class os{ insmod halt halt }
5.7 重啟系統,在出現啟動畫面時按F7(不同廠商的快捷鍵可能會有差異)進入啟動選項,如下圖
“Windows Boot Manager”是windows的啟動選項;“UEFI OS”是我們新加的Grub 2的啟動選項。
5.8 選擇“UEFI OS”,進入Grub 2界面, 如下圖
屏幕底部的提示,按`e`可以編輯啟動選項,按`c`進入Grub 2 命令行(Command line).
在配置Grub 2入口配置文件(x64.cfg),配置文件中需要指定操作系統所在的GPT分區號 (格式為 (hd0, gpt1))。同樣是C盤,在Windows,Grub2,Linux下的GPT編號可能都不一樣,所以最好在Grub 2中查看gpt分區號。
所以按`c`,進入命令行格式
5.9 進入命令行后,輸入 `ls –a -h`查看分區信息
在本例子中,我的C盤(名稱是`Windows`)在(hd0,gpt3),我的Grub 2啟動文件(名稱是 `MY_UEFI`)在(hd0,gpt4)。
此時最好拍個照,后面會用到。
5.10 輸入 `reboot`重啟,正常啟動,進入Windows系統
6. 在Grub2入口配置文件x64.cfg中新加一個啟動項:Ubuntu ISO鏡像文件
下面是新加的啟動項:
# install Ubuntu from .iso file menuentry "install ubuntu ISO" --class ubuntu --class os { insmod ntfs insmod loopback # In my computer, Ubuntu ISO file is stored in (hd0, gpt3) set root='(hd0,gpt3)' # In this tutor, iso file is stored under C:/ # The / before ubuntu_i386.iso is mandatory!!! set isofile=/ubuntu_i386.iso loopback loop $isofile linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile initrd (loop)/casper/initrd }
7. 重啟電腦,開始裝Linux
7.1 重啟系統,按F7(酷比魔方是F7,其他電腦可能會有差異)進入啟動選項。選擇 `UEFI OS`,參照步驟5.7
7.2 在Grub 2啟動列表中,選擇 `install ubuntu ISO`
7.3 然后會進入Ubuntu桌面,首先卸載掛載的ISO文件
按鍵盤 `CTRL+ALT+T`打開命令行,輸入`sudo umount –l /isodevice`卸載ISO文件。
如果想確認是否真的卸載成功,可以輸入 `ls /`查看。
7.4 雙擊桌面的 `Instal Ubuntu xxx`(xxx會根據你的版本而不同),開始安裝Ubuntu
7.5 前3個頁面我都保持了默認,這三個頁面別是: Welcome, Wireless, Preparing to install Ubuntu
下面的步驟一定要小心,關系到雙系統安裝的成敗,而且一不小心,還可能把原來的Windows系統弄壞。
7.6 Installation type 選擇 “Something else”
7.7 把Ubuntu安裝到步驟的 free space中,在安裝之前,需要將free space分區並格式化。
在本教程中,只分了兩個分區。
- Swap area : 約7G
- Ubuntu系統分區: 約13G
7.7.1 點擊“+”號新加分區。
7.7.2 新建7G左右的Swap area,
7.7.3 新建13G左右文件分區,掛載在 根目錄 `/`下:
7.7.4 將Ubuntu的Bootloader安裝到新建的13G左右的那個分區。
注意:不要保持默認值。默認值是把bootloader安裝到硬盤,這可能壞損壞硬盤原有的Windows的啟動。
7.8 選擇時區
7.9 選擇鍵盤類型
7.10 設置用戶名密碼
7.11 然后安裝。
如果最后顯示 Grub 安裝失敗,沒關系,此時Ubuntu已經安裝完成,只是bootloader安裝失敗。我們待會可以在Grub 2中添加Ubuntu引導,就能正常啟動Ubuntu了。
8. 正常重啟后進入Windows,在x64.cfg中添加 Windows和Linux啟動項
重啟進入Windows,編輯x64.cfg文件,添加Ubuntu和Windows入口,如下。如果你不確定新安裝的Ubuntu所在分區的gpt號碼,可以進入Grub 2命令行查看(參考5.8-5.9)。
menuentry "Ubuntu-16.04.5" { insmod ext2
# Which gpt is located needs you to check firstly set root='(hd0,gpt9)' linux /vmlinuz ro root=/dev/sda9 initrd /initrd.img echo "Start Ubuntu-16.04.5" } menuentry "WIN10" --class windows --class os { insmod ntfs set root='(hd0,gpt1)' clear echo "Start Windows" chainloader /EFI/Microsoft/Boot/bootmgfw.efi }
9. 重啟進入新安裝的Ubuntu
重啟電腦,按F7,選擇進入Grub 2引導,能看到下面入口。如果你不想在看到 `install linux ISO`入口,可以在x64.cfg中用 # 把相關的行注釋掉(建議注釋掉,下次有需要,直接去掉#又能看到了,不用再到網上查找一邊)
最后秀一下Ubuntu的登陸界面:
后問
這里的問題算是一些題外話,所以卸載最后,如果感興趣,可以看看。
因為涉及到更深的技術,個人能力有限,如果有錯誤,歡迎指出。
UEFI和傳統BIOS啟動有什么差別?
這里不深入,只談這兩者在重裝系統方面的差異。
傳統的BIOS啟動順序是:
開機->BIOS初始化 –> BIOS自檢 –> BIOS 加載磁盤第一個扇區(只有512KB) ,然后BIOS就不管了,將控制權交給第一個扇區中的程序。第一個扇區512KB一般叫做也叫做MBR[5],這個MBR會進一步加載另一個程序(可能是另一個程序,比如EasyBCD,Grub 2,也可能是操作系統)。
UEFI的啟動順序是:
開機 –> UEFI初始化 –> 找到特定分區中的UEFI引導文件 –> 根據UEFI引導文件引導另一個程序
UEFI第一個好處是,擺脫了第一個扇區的限制。
圖 UEFI的啟動順序 (來自UEFI Specification Version 2.5[6]中圖2 頁17)
下面是UEFI規范中的原話(UEFI Specification Version 2.5[6] 頁17):
“UEFI allows the consolidation of boot menus from the OS loader and platform firmware into a single platform firmware menu. These platform firmware menus will allow the selection of any UEFI OS loader from any partition on any boot medium that is supported by UEFI boot services. An UEFI OS loader can support multiple options that can appear on the user interface. It is also possible to include legacy boot options, such as booting from the A: or C: drive in the platform firmware boot menus.
UEFI supports booting from media that contain an UEFI OS loader or an UEFI-defined System Partition. An UEFI-defined System Partition is required by UEFI to boot from a block device. UEFI does not require any change to the first sector of a partition, so it is possible to build media that will boot on both legacy architectures and UEFI platforms.”
里面有幾個概念,
OS loader: OS代表操作系統, OS loader就是操作系統加載應用,比如 Grub 2, EasyBCD(可惜EasyBCD最新版本2.3仍然不支持UEFI)
platform firmware: 結合圖1理解,這里應該指主板的固件。firmware menu應該指在開機時按 ESC、F7看到的啟動目錄(具體按哪一個鍵不同廠商有差別)。
第一段的話是說UEFI可以吧OS loader和主板固件的啟動項目合並在一起,呈現給用戶。舉個例子來說:
- 對於傳統的BIOS啟動,在電腦剛開機時,按F7進入啟動選項(這里假設為F7),我們只能選擇從硬盤啟動、從U盤啟動或者從光盤啟動。
就算此時硬盤內裝了多個操作系統,或者有多個OS loader(比如一個Windows自帶的loader,另一個我們自己安裝的Grub 2),我們也只有一個選項,從硬盤啟動。
如果選擇從此硬盤啟動,BIOS會加載此硬盤第一個扇區(MBR)指內存,然后將控制器轉交給此扇區內的應用。
圖 傳統BIOS啟動的啟動選項
- UEFI啟動: UEFI比BIOS厲害多了,會把硬盤的所有分區都遍歷一遍,找出可能的OS Loader,然后直接列在啟動列表里。就比如下圖:
第二段第一句話“UEFI supports booting from media that contain an UEFI OS loader or an UEFI-defined System Partition. “,給我的感覺時,UEFI也可以不從OS Loader啟動,而從一個UEFI定義的系統分區啟動,允許每個OEM廠商實現上的差異。值得慶幸的是,對於我的平板KNOTE8,UEFI會遍歷硬盤所有分區,找到所有的OS Loader,而不是只從 UEFI定義的系統分區啟動。酷比魔方還是很給力的!
我也很好奇什么是UEFI-Defined System Partition? 所以研究了一下標准。
UEFI-Defined System Partition是一個FAT格式,對於硬盤是FAT32格式,對於移動設備是FAT12、或FAT16格式。同時為了和一般的FAT格式區分開,用於UEFI的FAT格式有一個特殊的GUID類型:”C12A7328-F81F-11D2-BA4B-00A0C93EC93B“[1] [6]P123,一般的FAT格式的GUID類型為”EBD0A0A2-B9E5-4433-87C0-68B6B72699C7“。
下面是UEFI規范中的原話(UEFI Specification Version 2.5[6] 頁536)
”The file system supported by the Extensible Firmware Interface is based on the FAT file system.
EFI encompasses the use of FAT32 for a system partition, and FAT12 or FAT16 for removable media. The FAT32 system partition is identified by an OSType value other than that used to identify previous versions of FAT. This unique partition type distinguishes an EFI defined file system from a normal FAT file system.“
上段話中的“OSType value”應該就是指特殊的GUID類型。
參考
[1] GPT(GUID Partition Table): https://en.wikipedia.org/wiki/GUID_Partition_Table
[3] ESP(EFI System Partition): https://en.wikipedia.org/wiki/EFI_system_partition
[4] UFEI (Unified Extensible Firmware Interface): https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface
[5] MBR主引導扇區解析
[6] "UEFI Specification Version 2.5" (PDF).
[7] Ubuntu桌面操作系統: https://cn.ubuntu.com/desktop/
[8] Grub 2官網下載鏈接: https://www.gnu.org/software/grub/grub-download.html
[9] 【Grub2】UEFI添加grub2引導: https://blog.csdn.net/xinlan3618/article/details/79862667
[10] Grub 2官網文檔: https://www.gnu.org/software/grub/grub-documentation.html]