grub2

我在一臺主機上前後安裝了3各操做系統,Windows 7,以及32位和64位的ubuntu 14.04。安裝完64位ubuntu以後發現啓動菜單變得很亂,因而進入Windows用一個叫EasyBCD的工具修改啓動菜單。結果致使整個MBR裏面沒有啓動項,重啓以後任何系統都進不了了。html

個人解決方法是用以前製做的ubuntu系統的USB啓動盤進入ubuntu試用系統,以便安裝grub2 boot loader。grub boot loader的文檔請參考官方資料linux

安裝grub2

首先查看各物理硬盤及其分區: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是命令行方式的。接下類能夠經過命令來進入安裝在硬盤上的各系統:工具

啓動系統

  1. 進入32位ubuntu系統
    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

  2. 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系統也能夠經過相似的方式啓動
  3. 進入windows 7系統
    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,包括ISOLINUXLILOGRUB

前面說過,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。這些命令會用到的一些相關文件包括:

  1. /etc/default/grub,這個文件設置一些變量的值。
    GRUB_TIMEOUT:等待這麼多秒以後自動加載默認系統,我在Ubuntu 14.04 LTS系統的GRUB中配置這個值爲0(直接加載默認操做系統),發現生成的grub.cfg中有那麼一項檢查,若是TIMEOUT爲0就改爲10。因此可能要使GRUB直接加載默認操做系統出了改這個值以外還須要作其餘設置。
  2. /etc/grub.d,這個文件夾包含一些腳本和模塊

如下是一些GRUB命令的說明:

  1. sudo update-grub,或 sudo mk-config
    根據前述的/etc/default/grub文件中的變量設置,生成grub.cfg文件。update-grub命令等同於mk-config -o /boot/grub/grub.cfg,也就是說將生成的文件直接存放在/boot/grub文件夾中,下次啓動的時候就能看到效果。
  2. sudo grub-install /dev/sda
    這條命令將grub boot loader安裝到MBR中,當前MBR中的boot loader會被替換。安裝過程當中會建立/boot/grub文件夾(若是以前沒有安裝過的話)。若是/boot/grub文件夾下沒有grub.cfg文件,重啓進入的GRUB2是命令模式的,須要經過輸入命令來啓動各系統。所以,正常流程是先運行grub-install安裝GRUB到MBR中,而後運行udpate-grub生成grub.cfg文件,這個grub.cfg包含當前磁盤中存在的各操做系統,而且會生成一個菜單供選擇。

以上說的是GRUB2,前面說過,GRUB2可以可以加載包括邏輯分區在內的任意分區裏的操做系統。不過它chain-loader加載Windows系統的時候可能會出現橙色屏幕的狀況。

另外一種選擇是在MBR中經過EasyBCD寫入Windows boot loader。EasyBCD操做界面以下:

EasyBCD

  1. 「View Settings」或者」Edit Boot Menu」裏面可以看到當前的啓動菜單設置。
  2. 「Add New Entry」能夠將某個系統添加到啓動菜單中,在Linux/BSD tab中,Drive選項能夠選擇該系統在哪一個分區,注意這裏能夠選擇邏輯分區。前面說過Windows boot loader只能加載主分區裏面的操做系統,不懂EasyBCD是怎麼實現加載邏輯分區的,不過有一點能夠確定,就是經過EasyBCD加載linux操做系統的時候,也是使用chain-loader。
  3. 「Edit Boot Menu」能調整各系統在菜單中的順序,設置默認操做系統,等待時間等等。

在個人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」修改的部分。

相關文章
相關標籤/搜索