grub安裝的 三種安裝方式


1. 引言 grub是什么?最常態的理解,grub是一個bootloader或者是一個bootmanager,通過grub可以引導種類豐富的系統,如linux、freebsd、windows等。但一旦進入linux操作系統(如無特殊聲明,以下提及操作系統或系統皆為linux操作系統),可以敲一個grub命令,就進入”grub>”提示狀態,然后可以進入操作若干命令。這時候的grub是什么?是shell,是一個和bash類似的一個shell。並且提供了兩種工作模式,交互(interactive)模式和非交互(batch)兩種模式,grub-install命令正是利用了grub的非交互模式,在系統下直接完成了grub的安裝。
                         
2. 三種安裝方式 安裝grub其實有3種方式,最常用的是grub-install,其實還有兩種grub>install和grub>setup,其中grub>install是最底層的方式,grub>setup是更高一層的方式,而grub-install是最高級最簡單的方式。接下來我們從grub>install開始講,來對3個不同的方式作一下區分:

2.1. grub>install 進入grub>提示符之后,輸入help install命令,會有如下提示:
install: install [--stage2=STAGE2_FILE] [--force-lba] STAGE1 [d] DEVICE STAGE2 [ADDR] [p] [CONFIG_FILE] [REAL_CONFIG_FILE]其中,STAGE1 DEVICE STAGE2是必不可少的,以下為示例:
install (hd0,0)/grub/stage1 (hd0) (hd0,0)/grub/stage2
或者可以如下:
root (hd0,0)
install /grub/stage1 (hd0) /grub/stage2
通過這樣一種方式可以成功安裝grub,但系統reboot之后,不能進入系統,卻直接進入grub>.why?
因為這種安裝方式沒有告知grub去哪里找grub.conf,stage2找不到grub.conf就會進入grub>.
用以下形式安裝就ok了。
root (hd0,0)
install /grub/stage1 (hd0) /grub/stage2 p /grub/grub.conf                                

2.2. grub>setup 進入grub>提示符之后,輸入help setup命令,會有如下提示:
 setup: setup [--prefix=DIR] [--stage2=STAGE2_FILE] [--force-lba] INSTALL_DEVICE [IMAGE_DEVICE]
      Set up the installation of GRUB automatically. This command uses
      the more flexible command "install" in the backend and installs
      GRUB into the device INSTALL_DEVICE.    從以上內容我們可以看出,setup是一個自動化(automatically)的grub安裝,它在后台(backend)運行了更靈活多變的install命令。看示例:
 grub> root (hd0,0)
   Filesystem type is ext2fs, partition type 0x83

  grub> setup (hd0)
   Checking if "/boot/grub/stage1" exists... no
   Checking if "/grub/stage1" exists... yes
   Checking if "/grub/stage2" exists... yes
   Checking if "/grub/e2fs_stage1_5" exists... yes
   Running "embed /grub/e2fs_stage1_5 (hd0)"...  16 sectors are embedded.
  succeeded
   Running "install /grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded Done.
從以上可以看出,setup命令將install命令封裝了,使用setup命令比使用install命令簡單很多。但實際的過程比install卻要復雜一些,其中尤其重要的一點是:使用setup會植入e2fs_stage1_5到硬盤的第一柱面第16扇區之后(這個沒有准確驗證過),這會帶來和通過install安裝一個很大的區別。

2.3. grub-install 安裝grub最常用的方式是在進入系統之后,通過grub-install腳本進行安裝,通過這個腳本安裝和前兩種方式有何不同呢?
腳本其實是通過grub的非交互模式,調用了setup命令安裝grub的。[*]腳本的安裝源是/usr/share/grub/i386-redhat/下的stage1、2和各種stage1.5,而前兩種方式使用的源是/boot/grub/下的相同內容。所以通過grub-instal安裝grub,原先在/boot/grub下的stage文件都刪除也沒關系,該腳本每次執行都會刪除這些文件的。反之,通過前兩種方式安裝的話,相應的stage文件是不可或缺的,否則會報錯,安裝失敗。[*]通過grub-install安裝grub之后,如果我們刪除了/boot/grub/下的stage2文件,系統會無法啟動,報如下錯:                                  GRUB loading stage 1.5
  GRUB loading, please wait...
  Error 15                                
但是,如果是通過grub>install方式安裝的grub,刪除/boot/grub/stage2就沒有問題,why?因為通過grub>install安裝grub,stage1是直接通過stage2所在的blocklist找stage2,我們刪除或者改名stage2文件,文件的存放位置是不變的,因此能找到。而通過grub-install腳本,或者grub>setup,會智能的找到相應的stage1.5,例如:/grub/e2fs_stage1_5,然后通過stage1.5認識文件系統,是通過文件名去找stage2的,所以通過這兩種方式安裝的grub,不可刪除或者改名/boot/grub/stage2。  


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
了很多關於grub的資料,但還是有一些地方不是很明白,希望在這里和大家討論一下
說法一
stage1是放在bootloader里的系統,他是為了找stage1.5和stage2存在的。在安裝grub時已經在stage1
里嵌入了stage1.5和stage2的磁盤物理地址,當stage1找到stage1.5時由stage1.5找stage2,要是找不到
stage1.5就以寫在stage1里stage2的磁盤物理地址直接去找stage2。
但是現在有疑問的地方是:
stage1找到stage1.5后沒有將控制權交給stage1.5,如果是將控制交給了stage1.5,那么當stage1.5
以文件系統的方式找不到時stage2時直接以磁盤物理地址去找stage2,那這就是說stage1.5里也嵌有
stage2的物理地址。還是:
stage1找到stage1.5后並沒有將控制權交給stage1.5,讓stage1.5以文件系統的方式去找stage2,要是找不到
再由stage1直接去找stage2。也就是說stage2的磁盤物理地址只寫在了stage1里。
說法二
stage1並不是去找的stage1.5和stage2的。而是在引導時,會去找第二扇區的start,然后由start去找stage1.5和stage2。
stage1里並沒有嵌入stage1.5和stage2的磁盤物理地址。
疑問和上面是相同的。他們的控制區是怎么交割的!及stage1.5和stage2的磁盤物理地址是否嵌入在start中。及stage1.5里是否
嵌入了stage2的磁盤物理地址。
可以肯定是:
stage1.5是放在0磁道第3扇區和第64扇區的扇區集里,且當你安裝grub時會根據你/boot分區所屬的文件系統,來選者stage1.5。
(如果你的/boot分區是ext3的。那么安裝時就只將ext3的stage1.5安裝,其他的是以文件的形式放在/boot/grub里)
stage2是放在/boot/grub里



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM