grub原理及使用詳解
實驗環境VMware+CentOS5.4。
本文將會介紹Grub的基礎知識、Grub的完整安裝引導過程、Linux硬盤分區基本知識等。
grub(GrandUnified Boot Loader)是有名的引導內核程序(另外一款比較有名的是LILO,嵌入式環境使用U-boot、bootloader),它支持多種硬盤分區類型加載(FAT,ext2,ext3,minix,FFS等),支持多系統引導等。現在出的grub2是grub的升級版,提供更多的功能,但一個grub能實現內核正確的引導已經足夠了,按這樣發展下去,很多開源軟件雖然支持的功能越來越強大,但對應的代碼量也是非常龐大,這就加大了新人對其學習的難度,也不適於學習。話又說過來,相應軟件的原始版本一般都會保留下載,所以可以找其最初始的版本學習。扯遠了…… www.2cto.com
當計算機加電自檢後,ROM BIOS加載MBR(主引導扇區,即硬盤第一扇區)中的代碼到內存中,這個扇區一共512字節,前446字節內容存放grub(bootloader)的關鍵引導程序,接著64字節放置硬盤分區表DPT(Disk Partition Table),一共四可以有四個主分區,占64個字節,這也是為什麼主分區最多只有四個的原因,最後2個字節是固定的標志0x55AA。當BIOS把引導程序加載到內存後就把控制權交給grub,而後grub的剩余代碼將完成其它代碼的加載和搬移以及文件系統初始化查找等工作,最終加載內核映像文件,從而把控制權交給真正的內核運行。
在開始講grub安裝之前首先要了解下硬盤的基礎知識和Linux硬盤命名規則。
硬盤的基本存儲單位為扇區(Sector),每個扇區一般為512bytes。一個硬盤有多個盤片,每個盤片有兩面,每面按照同心圓劃分為若干磁道,每個磁道劃分為若干扇區。比如一個硬盤有2個盤片,每個盤面分65536磁道,每個磁道分1024個扇區,那麼硬盤容量就是2盤片*2盤面*65536磁道*1024扇區*512字節 = 128GB。硬盤的主設備號為3。其它設備的主設備號為:1:內存、2:磁盤、3:硬盤、4:ttyx、5:tty、6:並行口、7非命名管道
硬盤分IDE和SCSI兩種總線類型,linux下可通過fdisk –l命令查看硬盤屬於哪種。Linux下對IDE的設備是以hd命名的,後面加字母a,b,c表示第幾塊,比如第一個ide設備是hda,第二個是hdb;SCSI以sd命令,同樣第一個設備是sda,第二個是sdb。而hda1代表第一塊硬盤的第一個分區,硬盤最多可以有四個主分區,數字為1~4,從5 開始就是邏輯分區了,一般情況只有一個主分區用來引導系統,這個分區在windows下來說是C盤,而在linux為hda1或sda1,D,E,F 盤在linux分別為hda5,had6,hda7。
在grub中命名硬盤的方式又有不同,可以打開grub的配置文件/boot/grub/grub.conf查看(即menu.lst文件,這只不過是grub.conf的一個快捷方式,Linux下稱符號鏈接,可通過ln –s menu.lst grub.conf命令完成)。
default=2
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
titleCentOS (2.6.27)
root (hdX,Y)
kernel /vmlinuz-2.6.27 roroot=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.27.img
其中root (hdX,Y)表示grub的安裝位置,X表示第幾塊硬盤,Y表示第幾分區,X、Y都是從0開始編號,比如(hd0,0)表示第1塊硬盤第1個分區。即這條命令表示把grub安裝在第1塊硬盤的第1分區,kernel指名了需要加載的內核映像文件,kernel後的root表示該內核文件位置。在grub中不區分IDE和SCSI,均以hd開始。
現在開始新安裝了,可以看看原來的grub版本信息。
從opensource.org或chinaunix下載中心下載grub源碼grub-0.97.tar.gz進行安裝。
377 tar -zxvf grub-0.97.tar.gz
378 cd grub-0.97
379 ./configure
380 make
381 make install
編譯完成後主要生成的主要文件這麼幾個:
文件所在目錄:/boot/grub。
grub:主程序。
stage1:源碼目錄stage1/s,匯編後便成了一個512字節的img,被寫在硬盤的0面0道第1 扇區,即硬盤的主引導扇區。(這512字節還包括分區表DPT以及主引導扇區標志“55AA”)。
*_tage1_5:文件系統的解釋代碼,根據/boot分區(或/boot所在分區)的具體文件系統類型 而異,如:ext3分區的話就是e2fs_stage1_5。在stage1_5沒有被加載以前,系統無法 識別任何文件系統(但是可以通過BIOS中斷方式INT 13h讀取磁盤指定扇區的內容)。
stage2:grub核心部分。它運行後,會把系統切入保護模式,設置好C運行環境然後尋找 menulist,如果沒有的話就執行一個shell,等待我們輸入命令。
grub.conf(menu.lst):grub配置文件
我執行makeinstall後,發現原來的grub文件並沒有替換成剛編譯出來的,所以在當前目錄進行了手動拷貝。
387 cp stage1/stage1 /boot/grub/
388 cp stage2/stage2 /boot/grub
389 cp stage2/*_stage1_5/boot/grub
做完這些後執行./grub/grub,然後在grub的shell命令界面執行如圖所示命令:
執行find /grub/menu.lst不一定成功,可以試下find /boot/grub/menu.lst或find /menu.lst,總有一條是對的。
最後執行reboot重啟系統。
如果上面這步在make install後忘了做,沒關系,在系統啟動時可以再配置。
一切安裝完成後,重啟看下新的grub
來源 http://blog.csdn.net/rosetta