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里
轉載于:https://www.cnblogs.com/zhengah/p/4238396.html
總結
以上是生活随笔為你收集整理的grub安装的 三种安装方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓开发日记(1) - 安装 Andro
- 下一篇: PHP获取当前页面的网址