我在一臺主機上前後安裝了3各操做系統,Windows 7,以及32位和64位的ubuntu 14.04。安裝完64位ubuntu以後發現啓動菜單變得很亂,因而進入Windows用一個叫EasyBCD的工具修改啓動菜單。結果致使整個MBR裏面沒有啓動項,重啓以後任何系統都進不了了。html
個人解決方法是用以前製做的ubuntu系統的USB啓動盤進入ubuntu試用系統,以便安裝grub2 boot loader。grub boot loader的文檔請參考官方資料linux
首先查看各物理硬盤及其分區:git
Shellubuntu
ubuntu@ubuntu:~$ sudo fdisk -l
Shell掛載要安裝grub2的分區:windows
ubuntu@ubuntu:~$ sudo mount /dev/sda6 /mnt # /dev/sda6是我安裝32位ubuntu的分區,前面fdisk命令的輸出結果中能夠看到這個分區的信息
Shell安裝grub菜單bash
ubuntu@ubuntu:~$ sudo grub-install --boot-dir=/mnt /dev/sda # --boot-dir設置爲/mnt/boot,是說將將grub相關的信息如鏡像文件存放在這個路徑的grub子目錄下。效果至關於登陸32位ubuntu系統,而後執行`sudo grub-install /dev/sda` # /dev/sda 指定將grub安裝在這個物理硬盤上
接下來我直接重啓進入grub boot loader。不過我看到的grub是命令行方式的。接下類能夠經過命令來進入安裝在硬盤上的各系統:工具
grub> ls -l # 這裏會列出各硬盤和分區 grub> set root=(hd0,msdos6) # 輸入到hd的時候按tab鍵,會列出鏈接的全部硬盤,我列出了hd0和hd1分別是一塊硬盤和一個u盤 # 輸入到逗號(,)的時候按tab鍵,會列出硬盤上的全部分區,輸出結果和前面的`ls -l`命令一致。網上不少資料這裏都是直接用數字表示各分區,但我這邊列出的是msdos加數字的形式。msdos6是我安裝32位ubuntu系統的分區。 grub> linux /boot/vmlinuz-3.13.0-40-generic root=/dev/sda6 # 輸入/boot/vmlinuz以後按tab鍵,會列出幾個版本的文件好比vmlinuz-3.13.0-32-generic,vmlinuz-3.13.0-40-generic。我也不知道有什麼區別,選了一個版本號最大的。 # root=/dev/sda6沒有tab鍵自動補全,我是根據32位ubuntu系統在第6分區來填寫的 grub> initrd /boot/initrd.img-3.13.0-40-generic # 跟前面linux命令相似這裏的initrd.img也會有幾個版本,我選擇了與前面一致的版本 grub> boot # 執行這條命令開始啓動操做系統
64 ubuntuspa
grub> ls -l # 這裏會列出各硬盤和分區 grub> set root=(hd0,msdos6) # 輸入到hd的時候按tab鍵,會列出鏈接的全部硬盤,我列出了hd0和hd1分別是一塊硬盤和一個u盤 # 輸入到逗號(,)的時候按tab鍵,會列出硬盤上的全部分區,輸出結果和前面的`ls -l`命令一致。網上不少資料這裏都是直接用數字表示各分區,但我這邊列出的是msdos加數字的形式。msdos6是我安裝32位ubuntu系統的分區。 grub> linux /boot/vmlinuz-3.13.0-40-generic root=/dev/sda7 # 輸入/boot/vmlinuz以後按tab鍵,會列出幾個版本的文件好比vmlinuz-3.13.0-32-generic,vmlinuz-3.13.0-40-generic。我也不知道有什麼區別,選了一個版本號最大的。 # root=/dev/sda6沒有tab鍵自動補全,我是根據32位ubuntu系統在第6分區來填寫的 grub> initrd /boot/initrd.img-3.13.0-40-generic # 跟前面linux命令相似這裏的initrd.img也會有幾個版本,我選擇了與前面一致的版本 grub> boot # 執行這條命令開始啓動操做系統安裝在sda7分區上的64位ubuntu系統也能夠經過相似的方式啓動
grub> set root=(hd0,msdos1) # 個人硬盤的第一分區在windows系統裏面顯示的是「系統保留」,大小爲100M,安裝windows系統的分區是msdos2。注意這裏指定的是「系統保留」分區,而不是安裝windows的分區 grub> chainloader +1 grub> boot
==============關於BIOS、 boot loader、MBR的知識碎片,待整理=================操作系統
PC開啓的時候,先會運行BIOS。BIOS能夠根據優先級啓動各類設備(U盤,硬盤,光驅)中的一個,優先級能夠在BIOS(開機的時候按DEL或者F12鍵進入)中進行設置。BIOS啓動某一個設備的時候,執行該設備MBR(Master Boot Record)裏面的boot loader。命令行
MBR是一個512字節的block,位於存儲設備的第一個sector,MBR中存儲了分區表和boot code(boot loader)。MBR以後,纔是該設備的各分區。在MBR的512字節中,boot code佔了446字節,4個主分區記錄各佔16字節,還有兩個字節是MBR signature。
boot loader的做用是選擇並加載操做系統內核,而後將控制權交給操做系統。每一個操做系統都會帶一個能夠加載該系統的boot loader,有些boot loader能夠啓動多種操做系統。
Window系統中,XP及更早的版本使用NTLDR boot loader,Windows Vista及以後的系統使用BOOTMGR。linux系統有更多支持的boot loader,包括ISOLINUX,LILO,GRUB。
前面說過,MBR中只有4個主分區記錄,這就是爲何存儲設備(好比硬盤)分區的時候只能有4個主分區的緣由。若是分區的時候,建立3個主分區和一個擴展分區(extended partition, logitical partition),那麼MBR中的最後一個主分區記錄其實是一個分區表(擴展分區表)。擴展分區表存儲各邏輯分區(logical volumes)的信息。
一個存儲設備除了有MBR以外,每一個分區(主分區或者邏輯分區)都有本身的boot sector,叫作volumne boot record(VBR)。因爲MBR中的boot loader可能不知道如何加載一個操做系統的內核,所以它須要經過VRB中的boot loader來加載這個操做系統,好比GRUB不懂如何(直接)加載Windows系統,就得先加載Windows自身的boot loader(好比BOOTMGR),而後由BOOTMGR負責加載Windows系統。這個過程就是所謂的chain-loader。
GRUB Boot loader –> Windows Boot loader –> Load Windows Kernel
Windows的boot loader只能加載主分區的Windows操做系統,所以Windows必須得安裝在主分區,不然windows boot loader沒法啓動Windows;GRUB能夠加載主分區和邏輯分區的多種操做系統,包括直接加載linux系統,經過chain-loader加載Windows系統。接下來咱們重點說一下GRUB2。
不少linux系統自己集成(安裝)了GRUB2,這裏說安裝是指在操做系統中安裝了相關的軟件包,但操做系統安裝過程當中通常容許你選擇是否須要將GRUB寫入到MBR中。系統中安裝的軟件包提供了一系列命令行工具,用於檢測硬盤中的各操做系統,生成啓動菜單,更新MBR中的boot loader,更新VBR中的boot loader。這些命令會用到的一些相關文件包括:
如下是一些GRUB命令的說明:
mk-config -o /boot/grub/grub.cfg
,也就是說將生成的文件直接存放在/boot/grub文件夾中,下次啓動的時候就能看到效果。以上說的是GRUB2,前面說過,GRUB2可以可以加載包括邏輯分區在內的任意分區裏的操做系統。不過它chain-loader加載Windows系統的時候可能會出現橙色屏幕的狀況。
另外一種選擇是在MBR中經過EasyBCD寫入Windows boot loader。EasyBCD操做界面以下:
在個人Windows 7系統中,EasyBCD的boot loader會安裝在硬盤第一個分區(100M的系統保留分區,應該是安裝Windows 7的時候建立的),」Add New Entry」及」Edit Boot Menu」裏面所作的改動直接生效(固然,」Edit Boot Menu」裏面還得點擊」Save Settings」按鈕)。若是MBR中是Windows boot loader,那麼直接在第一個啓動菜單就能看到;若是MBR中是其餘boot loader(好比GRUB2),那麼選擇啓動Windows以後,chain-loader會加載EasyBCD在100M系統保留分區的啓動boot loader。
若是也須要將boot loader寫入到MBR中,只需在」BCD Deployment」中,選擇」Install the Windows Vista/7 bootloader to the MBR」並點擊」Write MBR」。這一步驟只須要作一次,之後Add New Entry,Edit Boot Menu的修改直接生效。若是使用EasyBCD以前MBR中原本就是Windows bootloader,連這一步驟都不須要作了。
針對EasyBCD,個人理解是,不管是MBR仍是VBR(100M系統保留分區)中的boot loader,都只是boot loader的一小部分,剩下的boot loader代碼以及配置就是EasyBCD中」Add New Entry」及」Edit Boot Menu」修改的部分。