1. 引言
grub是什嗎?最常態的理 解,grub是一個 bootloader或者是一個bootmanager,通過grub可以引導種類豐富的系統,如linux、freebsd、windows等。但一旦 進入linux作業系統(如無特殊聲明,以下提及作業系統或系統皆為linux作業系統),可以敲一個grub命令,就進入”grub>”提示狀 態,然後可以進入操作若干命令。這時候的grub是什嗎?是shell,是一個和bash類似的一個shell。並且提供了兩種工作模式,互動 (interactive)模式和非互動(batch)兩種模式,grub-install命令正是利用了grub的非互動模式,在系統下直接完成了 grub的安裝。IXPUB技術部落格8`8r$~ b t'k u
#^ S n!/ E:X"M P$h q /02. 三種安裝方式
安 裝grub其實有3種方式,最常用的是grub-install,其實還有兩種grub>install和grub>setup,其中 grub>install是最底層的方式,grub>setup是更高一層的方式,而grub-install是最進階最簡單的方式。接下來 我們從grub>install開始講,來對3個不同的方式作一下區分:IXPUB技 術部落格 i e ?$i h r
IXPUB 技術部落格%}&g {7B H.t K$|
2.1. grub>install
進入grub>提示符之後,輸入help install命令,會有如下提示:IXPUB技術部落格;J c*|
install: install [--stage2=STAGE2_FILE] [--force-lba] STAGE1 [d] DEVICE STAGE2 [ADDR] [p] [CONFIG_FILE] [REAL_CONFIG_FILE]其中,STAGE1 DEVICE STAGE2是必不可少的,
以下為樣本:
%n&N { P"X x0 install (hd0,0)/grub/stage1 (hd0) (hd0,0)/grub/stage2
或者可以如下:
&H#G%Q5|0 root (hd0,0)
7J b7B$D+J c0 install /grub/stage1 (hd0) /grub/stage2
通過這樣一種方式可以成功安裝grub,但系統reboot之後,不能進入系統,卻直接進入grub>.why?因為這種安裝方式沒有告知grub 去哪裡找grub.conf,stage2找不到grub.conf就會進入grub>.,用以下形式安裝就ok了。
6a%A { b?K M v0 root (hd0,0)IXPUB技術部落格 j)W @ k ] h%P A
install /grub/stage1 (hd0) /grub/stage2 p /grub/grub.conf
b0h f){ X x y0 2.2. grub>setup
進入 grub>提示符之後,輸入help setup命令,會有如下提示:IXPUB技術 部落格.r9v M K F
IXPUB技術部落格)~1B z J)h+b j | 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 installsIXPUB技術部落格 C(c;[ u0^;f I w n3F
GRUB into the device INSTALL_DEVICE.
以上內容我們可以看出,setup是一個自動化(automatically)的grub安裝,它在後台(backend)運行了更靈活多變的 install命令。看樣本:IXPUB技術部落格 E W+E R4_
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
+Q&M U H l U8r ^ p a0 Running "install /grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
o3S J u U9]8L0 Done.
以上可以看出,setup命令將install命令封裝了,使用setup命令比使用install命令簡單很多。但實際的過程比install卻要複 雜一些,其中尤其重要的一點是:使用setup會植入e2fs_stage1_5到硬碟的第一柱面第16扇區之後(這個沒有準確驗證過),這會帶來和通過 install安裝一個很大的區別。
2.3. grub-install
安裝grub最 常用的方式是在進入系統之後,通過grub-install指令碼進行安裝,通過這個指令碼安裝和前兩種方式有何不同呢?IXPUB技術部落格:K h6y O U8q R y l ^
- 指令碼其實是通過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
4K ]8r$o)q h0 GRUB loading, please wait...
'Y2o4e4| n0 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。