格式化linux grub,linux grub 引導啟動過程詳解

機器加電啟動后,BIOS開始檢測系統參數,如內存的大小,日期和時間,磁盤

設備以及這些磁盤設備用來引導的順序,通常情況下,BIOS都是被配置成首先檢查

軟驅或者光驅(或兩者都檢查),然后再嘗試從硬盤引導。如果在這些可移動的設

備中,沒有找到可引導的介質,那么BIOS通常是轉向第一塊硬盤最初的幾個扇區,

尋找用于裝載操作系統的指令。裝載操作系統的這個程序就是boot loader.

linux里面的boot loader通常是lilo或者grub,從Red Hat Linux 7.2起,GRUB(

GRand Unified Bootloader)取代LILO成為了默認的啟動裝載程序。那么啟動的時候

grub是如何被載入的呢

grub有幾個重要的文件,stage1,stage2,有的時候需要stage1.5.這些文件一般都

在/boot/grub文件夾下面.grub被載入通常包括以下幾個步驟:

1. 裝載基本的引導裝載程序(stage1),stage1很小,網上說是512字節,但是在我的系統上

用 du??-b??/boot/grub/stage1 顯示的是1024個字節,不知道是不是grub版本不同的

緣故還是我理解有誤.stage1通常位于主引導扇區里面,對于硬盤就是MBR了,stage1的

主要功能就是裝載第二引導程序(stage2).這主要是歸結于在主引導扇區中沒有足夠的

空間用于其他東西了,我用的是grub 0.93,stage2文件的大小是 107520 bit.

2. 裝載第二引導裝載程序(stage2),這第二引導裝載程序實際上是引出更高級的功能,

以允許用戶裝載入一個特定的操作系統。在GRUB中,這步是讓用戶顯示一個菜單或

是輸入命令。由于stage2很大,所以它一般位于文件系統之中(通常是boot所在的根

分區).

上面還提到了stage1.5這個文件,它的作用是什么呢??你到/boot/grub目錄下看看,

fat_stage_1.5??e2fs_stage_1.5 xfs_stage_1.5等等,很容易猜想stage1.5和文件系統

有關系.有時候基本引導裝載程序(stage1)不能識別stage2所在的文件系統分區,那么這

時候就需要stage1.5來連接stage1和stage2了.因此對于不同的文件系統就會有不同的

stage1.5.但是對于grub 0.93好像stage1.5并不是很重要,因為我試過了,在沒有stage1.5

的情況下, 我把stage1安裝在軟盤的引導扇區內,然后把stage2放在格式化成ext2或者

fat格式的軟盤內,啟動的時候照常引導,并不需要e2fs_stage_1.5或者fat_stage_1.5.

下面是我的試驗:

#mkfs.ext2??/dev/fd0

#mount -t ext2??/dev/fd0??/mnt/floppy

#cd??/mnt/floppy

#mkdir boot

#cd??boot

#mkdir grub??(以上三步可用mkdir -p??boot/grub命令完成)

#cd grub

#cp??/boot/grub/{stage1,stage2,grub.conf}??./

#cd; umount /mnt/floppy

以上幾步把軟盤格式化成ext2格式,然后把stage1,stage2,grub.conf這幾個啟動的

時候必須的文件拷貝到軟盤的指定目錄下.下面安裝grub到軟盤上.

#grub??(進入grub環境)

grub> install (fd0)/boot/grub/stage1 (fd0)??(fd0)/boot/grub/stage2

p (fd0)/boot/grub/grub.conf

以上這條命令也可以用下面的兩句代替

grub>root (fd0)? ? #grub的根目錄所在的分區

grub>setup (fd0)? ?#這一步就相當于上面的install命令

我在這里解釋一下

install (fd0)/boot/grub/stage1 (fd0)??(fd0)/boot/grub/stage2 p

(fd0)/boot/grub/grub.conf 這條命令.

install

告訴GRUB將(fd0)/boot/grub/grub/stage1

安裝到軟驅的引導扇區(fd0).

(fd0)/boot/grub/stage2

告訴grub stage2這個文件所在的位置.

p 參數后面跟著(fd0)/boot/grub/grub.conf 告訴grub的配置文件所在的位置.

好了,讓BIOS從軟驅啟動,試一下,沒有e2fs_stage_1.5文件照樣能夠進入系統.

其實這就是一個小小的啟動盤啊.(了解了grub的運行原理,就簡單多了^_^)

3. 現在我們已經到grub的開機選單這一步了,接下來grub所需要做的就是裝載在一個特

定分區上的操作系統,如linux內核。一旦GRUB從它的命令行或者配置文件中,接到開始

操作系統的正確指令,它就尋找必要的引導文件,然后把機器的控制權移交給操作系統.

由于篇幅有限,避免冗長,grub的命令我就不多說了,網上很有多的資料,一個典型

完整的引導linux的命令如下:

title 51base

root(hd0,0)

kernel /bzImage??ro??root=/dev/ram0

initrd /initrd.img

這里有必要注意一下幾個問題:

(1)grub的磁盤以及分區的命名方式和linux有所區別,第一個磁盤是從0開始,第一

個分區也是從0開始.譬如第一個硬盤的第5分區在linux下面是/dev/hda5 ,而在grub里面

是(hd0,4).再如/dev/fd0在grub里面是(fd0,0).(最后一句如有錯誤望提醒)

(2)不管是IDE硬盤hda,hdb還是SCSI硬盤sda,sdb在grub里面都是以hd方式命名.

譬如虛擬機里面的/dev/sda2在grub里面是(hd0,1),再如/dev/hdb7在grub里面以(hd1,6)

命名.

(3)要搞清楚上面兩個root的關系,root (hd0,0)中的root是grub命令,它用來指定

boot所在的分區作為grub的根目錄.而root=/dev/ram0是kernel的參數,它告訴操作系統

內核加載完畢之后,真實的文件系統所在的設備.要注意grub的根目錄和文件系統的根

目錄的區別.

再回到上面的幾行命令.

kernel命令用來指定內核所在的位置,"/"代表(hd0,0),也就是grub的根目錄

initrd命令用來指定初始化ram的img文件所在位置.

grub載入內核bzImage并展開到指定位置(應該是0x100000這個地方),同時載入

initrd.img到內存(不知道是什么地方).

ps:

grub的任務至此就結束了,下面grub將機器的控制權轉交給操作系統(linux).

操作系統接到控制權之后,開始start_kernel,接著內核將initrd.img展開到/dev/ram0

為臨時根文件系統,執行里面的linuxrc文件.

P.這里有必要說一下initrd的作用特別是它里面的核心文件linuxrc的作用.

initrd是inital ram disk的宿寫.

當存在initrd的時候,機器啟動的過程大概是以下幾個步驟(當initrd這一行用

noinitrd 命令代替后,就不存在initrd了)

1)boot loader(grub)加載內核和initrd.img

2)內核將壓縮的initrd.img解壓成正常的ram disk并且釋放initrd所占的內存空間

3)initrd作為根目錄以讀寫方式被掛載

4)initrd里面的文件linuxrc被執行

5)linuxrc掛載新的文件系統

6)linuxrc使用pivot_root系統調用指定新的根目錄并將現有的根目錄place到指定

位置.

7)在新的文件系統下正式init

8)initrd被卸載.

為了便于理解,我將red hat linnux9 里面的initrd-2.4.20-8.img拿出來分析一下.

這其實是一個壓縮了的文件,是以gz結尾的.

[root@localhost root]#cp??/boot/initrd-2.4.20-8.img??/mnt/initrd-2.4.20-8.gz

[root@localhost root]#gunzip /mnt/initrd-2.4.20-8.gz

[root@localhost root]#mount -o loop /mnt/initrd-2.4.20-8??/mnt/ram

[root@localhost root]#cd??/mnt/ram

[root@localhost ram]#ls

bin dev etc lib linuxrc loopfs??proc sbin sysroot

[root@localhost ram]#ls bin

insmod modprobe nash

[root@localhost ram]#ls lib

Buslogic.o??ext3.o??jbd.o??scsi_mod.o? ?sd_mod.o

[root@localhost ram]ls??dev

console??null??ram??systty??tty1??tty2??tty3??tty4

sbin目錄是指向bin目錄的一個連接,其他目錄是空的.

[root@localhost ram]cat??linuxrc

#!/bin/nash

1.echo "Loading scsi_mod.o module"

2.insmod /lib/scsi_mod.o

3.echo "Loading sd_mod.o module"

4.insmod /lib/sd_mod.o

5.echo "Loading BusLogic.o module"

6.insmod /lib/BusLogic.o

7.echo "Loading jbd.o module"

8.insmod /lib/jbd.o

9.echo "Loading ext3.o module"

10.insmod /lib/ext3.o

11.echo Mounting /proc filesystem

12.mount -t proc /proc /proc

13.echo Creating block devices

14.mkdevices /dev

15.echo Creating root device

16.mkrootdev /dev/root

17.echo 0x0100 > /proc/sys/kernel/real-root-dev

18.echo Mounting root filesystem

19.mount -o defaults --ro -t ext3 /dev/root /sysroot

20.pivot_root /sysroot /sysroot/initrd

21.umount /initrd/proc

上面的編號是我為了下面好說明加上去的.

首先我們必須注意的是這里使用的shell是nash而不是bash,nash是專門為linuxrc可執行

腳本設計的,因此你有必要看一看nash的man文檔.

1-10行是加載一些必要的模快.11-12行加載proc內核文件系統,13-14行利用nash內建的

命令mkdevices創建塊設備,mkdevices是根據/proc/partitions文件創建里面列出的所有

塊設備.15-16行利用nash內建的命令mkrootdev,mkrootdev使它后面的參數/dev/root成

為一個塊節點從而使得根分區設備被掛載,其中根分區設備由grub.conf里面的kernel命

令后面所帶的參數root=決定,如果root=參數沒有被指定,/proc/sys/kernel/real-root-

dev文件將提供根分區設備號.17行將數字256寫入到后面的文件里面去.18-19行掛載根文

件系統到/sysroot目錄下,/dev/root里面的內容就是root=參數所指定的設備里面的內容

20行調用pivot_root改變根目錄所在地并place舊的根目錄到指定的位置.21行卸載舊的

根目錄里面的proc內核文件系統.

從這里面我們總結一下linuxrc的作用:??(參考/usr/src/linux-2.4/Documenta

tion/initrd.txt文檔)

2)/linuxrc文件決定在掛載真正的文件系統之前所需完成的事情(譬如加載必要的網

絡驅動或者加載ext3文件系統).

3)/linuxrc加載必要的模塊.

4)/linuxrc掛載根文件系統

5)/linuxrc調用pivot_root來改變根目錄

關于initrd的用途可以查考上面提到的文檔,想知道linux系統是如何安裝的嗎 那里

面由答案.

既然linuxrc的主要目的是加載模快用的,那如果我們的內核沒有動態的模塊而所需

的功能都是靜態編譯進內核的,那么是不是可以不用linuxrc文件呢

答案是可以不用,在普通的linux操作系統里面可以加入noinitrd選項以告知boot

loader 不使用initrd.如果我們做網關,因為ram是我們的文件系統的載體,所以initrd

一行當然不能去掉,但是我們可以不用linuxrc文件,sysroot文件夾和initrd文件夾.

不信的話,試試看吧.

好了,initrd(linuxrc)已經介紹完了.

linuxrc執行完畢之后,系統就會以真正的根目錄正式init.

系統在/bin/或者/sbin目錄下找到init程式,然后根據它的配置文件/etc/fstab進行

初始化,最后調用mingetty程式啟動login完成引導.

本文來自ChinaUnix博客,如果查看原文請點:[url]http://blog.chinaunix.net/u/32475/showart_519239.html[/url]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375958.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375958.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375958.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DevExpress GridControl 后臺設置列

/// <summary>/// 初始化GridView /// </summary>/// <param name"gv">GridView 名稱</param>/// <param name"captions">列標題</param>/// <param name"fieldName">列字段</param>/// <pa…

linux c實現myecho、mycat、mycp

myecho、mycat、mycp分別用于模擬系統命令echo、cat、cp 代碼如下&#xff1a; myecho #include<stdlib.h> #include<stdio.h> int main(int argc,char *argv[]){if(argc1){printf("Error:need parameter!\n");exit(0);}for(int i1;i<argc;i)print…

Emmet快速開發

標簽元素關系展開 div.wrap>div.content>(div.inner_ldiv.inner_r)^div.sider------縮寫展開如下----------------------------------------------<div class"wrap"><div class"content"><div class"inner_l"></div&…

IOS 基于APNS消息推送原理與實現(JAVA后臺)

Push的原理&#xff1a;Push 的工作機制可以簡單的概括為下圖圖中&#xff0c;Provider是指某個iPhone軟件的Push服務器&#xff0c;這篇文章我將使用.net作為Provider。APNS 是Apple Push Notification Service&#xff08;Apple Push服務器&#xff09;的縮寫&#xff0c;是蘋…

suse linux 查看cpu,Suse Linux zmd 耗用100% CPU

最近的SUSE Linux 10(SP3)的top命令總是顯示zmd進程耗用了100%的CPU資源&#xff0c;而整個系統中system級別占用CPU則占用了40%以上且根本不曾釋放。嘗試重啟服務器之后&#xff0c;故障依舊。下面是這個問題的描述與處理。1、top命令顯示zmd cpu占用100%&#xff0c;system u…

linux系統調用open、write、close、read以及stat函數詳解

學習筆記 參考鏈接1 、參考鏈接2以及百度百科 在進行C語言學習的時候我們了解到了C語言相關的一些IO操作&#xff0c;如fopen&#xff0c;fwrite&#xff0c;fread&#xff0c;fprintf&#xff0c;fclose等相關函數&#xff0c;他們都是由C庫函數提供的一些函數&#xff0c;是…

關于objective-c的一點隨筆

多日混跡cocoachina&#xff0c;這篇隨筆算是積累點前人經驗吧。 首先&#xff0c;要多逛兩個很好的網站&#xff0c;Stack Overflow和github. 對于新人&#xff0c;一定要注意良好的格式和命名&#xff0c;不然對于日后回頭看代碼會非常難&#xff0c;oc不限制變量名稱和函數名…

【轉載】Ubuntu環境下配置Android Studio

之前學習Android開發的時候&#xff0c;一直跟各種教程一樣&#xff0c;使用的是EclipseADT&#xff0c;主要是比較方便&#xff0c;容易上手&#xff0c;特別是對于習慣用Eclipse開發java的朋友來說&#xff0c;上手更是好無壓力。但畢竟EclipseADT最多只能算Google的干兒子&a…

linux怎么進去vi編輯器,red hat enterprise linux開機怎么進入vi編輯器界面?

2015-05-21 回答后面輸入直接打回車就會顯示出來如下xx文件#■sa■jsadjk#■sa■jsklfjdl kl■sa&#xff1a;----現在是低行模式 現在按esc 進入第一個模式(命令模式)就變成下面xx文件#dsadjsadjk#dsadjsklfjdl kldsa現在我們按個v 就進入可是模式 現在我們一個移動光標選擇要…

數據結構--鏈式線性表

環境&#xff1a;dev c #include<stdio.h> #include<stdlib.h>typedef struct LNode *List; typedef int ElementType;struct LNode{ElementType Data;List next; };int Length(List Ptrl); List FindKth(int k,List Ptrl); List Find(ElementType x,List Ptrl); …

linux査 到漠河 裝apache,如何在Ubuntu上搭建一臺安全的Apache?Web服務器

滿意答案1.安裝Apache2使用下面這個命令&#xff0c;安裝Apache2及其他庫。1$ sudo apt-get -y install apt-get install apache2 apache2.2-common apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert libapache2-mod-php5 php5 php5-common php5-gd php5-cli…

vs2010 中添加 ActiveX Control Test Container工具

vs2010中的TSTCON( ActiveX Control Test Container )工具非自動安裝&#xff0c;而是作為一個例程提供。所以應找到該例程&#xff0c;并編譯&#xff1a; 如vs2010安裝在默認路徑則 1, 進入&#xff1a;C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033&#xff…

linux c實現mypwd

這個其實很簡單&#xff0c;只需要調用getcwd()這個函數就行了。 char *getcwd(char *buffer,int maxlen); 功能&#xff1a;獲取當前工作目錄 參數&#xff1a;buffer指向用來存儲絕對路徑的數組&#xff0c;maxlen絕對路徑的字符大小 返回&#xff1a;成功則返回當前的工作目…

安裝Discuz

1.下載Discuz 版本文件http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GBK.zip2.下載PHPhttp://windows.php.net/downloads/releases/php-5.6.9-Win32-VC11-x64.zip把里面文件的php.ini-development 更名為php.ini Uncomment下列語句 extension_dir "ext"…

linux跑caffe模型的步驟,Caffe初步實踐——使用訓練好的模型完成語義分割任務

Caffe剛剛安裝配置結束&#xff0c;乘熱打鐵&#xff01;(一)環境準備前面我有兩篇文章寫到caffe的搭建&#xff0c;第一篇cpu only &#xff0c;第二篇是在服務器上搭建的&#xff0c;其中第二篇因為硬件環境更佳我們的步驟稍顯復雜。其實&#xff0c;第二篇也僅僅是caffe的初…

關于 Code First

第一感覺還是很新鮮的&#xff0c;你可以自由的控制數據結構。 比如&#xff0c;你想象oracle那樣&#xff0c;給每個表增加4個字段&#xff0c;創建人&#xff0c;創建時間&#xff0c;更新人&#xff0c;更新時間。完全可以創建一個父類包含著四個屬性&#xff08;甚至可以把…

靈悟禮品網上專賣店——新建數據庫

一、小組成員&#xff1a; 洪雪意&#xff08;產品負責人&#xff09; 陳淑筠&#xff08;Master&#xff09; 二、組內人員任務情況 計劃完成的任務的第三個模塊&#xff1a;分析并建立數據庫 已完成的任務&#xff1a; 任務的第三個模塊&#xff1a; 陳淑筠&#xff08;負責…

操作系統上機題目(多進程1)

1、創建1個子進程2、程通過管道與子進程連接 子進程的標準輸出連接到管道的寫端主進程的標準輸入連接到管道的讀端3、進程中調用exec(“echo”, “echo”, “hello world”, NULL)4、進程中調用read(0, buf, sizeof(buf))&#xff0c;從標準輸入中獲取子進程發送的字符串&…

Oracle數據庫dmp文件Dos命令下導入導出

Oracle數據庫dmp文件Dos命令下導入導出 2013-03-09 18:22:52| 分類&#xff1a; Oracle |舉報|字號 訂閱 數據導出: 一. 導出工具exp 他是操作系統下一個可執行的文件,存放目錄/Oracle_Home/bin. exp導出工具將數據庫中數據備份壓縮成一個二進制系統文件,可以在不同的OS間遷…

c語言報錯找不到標識符,error C3861: “_T”: 找不到標識符

頭天好好的程序&#xff0c;第二天一早就報錯&#xff0c;還是莫名其妙的錯誤&#xff1a;atlconv.h等頭文件中的“_T” 報錯&#xff0c;百思不得其解&#xff0c;各種搜索而不得&#xff0c;整個人都崩潰了。出問題一定是有原因的&#xff0c;后來冷靜下來&#xff0c;縷縷思…