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=2timeout=5splashimage=(hd0,0)/grub/splash.xpm.gzhiddenmenutitleCentOS (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