本文爲做者原創,容許轉載,但必須註明原文地址: http://www.javashuo.com/article/p-olaxbege-e.htmlhtml
最近在自學MIT6.828 Operating System Engineering, 這門課程的代碼是針對Linux系統(Ubuntu)的。linux
我有一臺WIN10平板電腦,基本信息以下:git
學習編程,必需要動手練習。爲了讓MIT6.828的課程的代碼跑起來,我前後:編程
手邊只有一個平板電腦,沒有U盤,光盤,因此計劃是直接從硬盤安裝Ubuntu操做系統。ubuntu
網上有相關資料,但很零散,因此我就寫一篇完整的,但願能夠幫助有一樣需求的人,能夠少走一些彎路。windows
下面介紹的WIN10+Ubuntu雙系統安裝教程適用於下面狀況:app
1. 電腦中已經有一個Windows操做系統 框架
雖然我本身是WIN10操做系統,但對WIN8, WIN7應該也適用。less
2. 你電腦硬盤的分區是 GPT分區,非MBR分區。ide
若是不知道如何查看電腦硬盤是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、F七、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.1 打開 文件資源管理器,鼠標右擊 此電腦,鼠標點擊 管理。
2.2 在彈出的 計算機管理 界面中,點擊左邊列表中的 存儲->磁盤管理
選擇一個剩餘空間比較多的磁盤,鼠標右擊,點擊 壓縮卷,以下圖
2.3 在 可用壓縮空間量(MB)(E) 中輸入你想爲 Ubuntu 系統分配的磁盤空間, 而後點擊 壓縮
4.4 獲得一個 未利用 分區(黑色)
第一步就算完成了
在free space分區中新建一個200M左右的分區(本後面將此分區叫作 MY_UEFI),後面用於存放Grub 2啓動文件。單獨存放啓動文件,避免損壞。損壞可能電腦就不能啓動了。
3.1 鼠標右擊步驟2建立的 未分配空間
3.2 在 簡單卷大小(MB)(S) 中輸入要爲Grub 2啓動文件分配的大小,本教程設置爲 200 MB
3.3 本教程中把 這個分區取名爲 MY_UEFI
能夠去Ubuntu官網[7]下載。
我下載了一個32位16.0.4LTS版本。
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系統
下面是新加的啓動項:
# 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.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分區並格式化。
在本教程中,只分了兩個分區。
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了。
重啓進入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 }
重啓電腦,按F7,選擇進入Grub 2引導,能看到下面入口。若是你不想在看到 `install linux ISO`入口,能夠在x64.cfg中用 # 把相關的行註釋掉(建議註釋掉,下次有須要,直接去掉#又能看到了,不用再到網上查找一邊)
最後秀一下Ubuntu的登錄界面:
這裏的問題算是一些題外話,因此卸載最後,若是感興趣,能夠看看。
由於涉及到更深的技術,我的能力有限,若是有錯誤,歡迎指出。
這裏不深刻,只談這二者在重裝系統方面的差別。
傳統的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和主板固件的啓動項目合併在一塊兒,呈現給用戶。舉個例子來講:
就算此時硬盤內裝了多個操做系統,或者有多個OS loader(好比一個Windows自帶的loader,另外一個咱們本身安裝的Grub 2),咱們也只有一個選項,從硬盤啓動。
若是選擇今後硬盤啓動,BIOS會加載此硬盤第一個扇區(MBR)指內存,而後將控制器轉交給此扇區內的應用。
圖 傳統BIOS啓動的啓動選項
第二段第一句話「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格式,對於移動設備是FAT十二、或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]