GRUB學習筆記(轉)

post0發表於2007-08-14
GRUB學習筆記(轉)[@more@]

  宣告:本筆記並非原創,只是我個人的學習筆記!

  很多的內容來自

  非常感謝以上網站對我的學習提供的莫大的幫助,本著學習和分享的原則我貼出我的學習筆記,更希望兄弟們能給我指出其中錯誤的地方.謝謝!!!

  學習這部分知識,首先要學到問題的思路,其次你還要記住一些東西,是死記硬背下來!你會發現這點東東的確是很有用的!

  儘管如此,本文件歸屬linuxsir-probing!轉載請註明出處!更不能被用到商業用途上!

  1 首先要了解的幾個概念

  1.1 啟動管理器

  啟動管理器是儲存在磁碟開始扇區中的一段程式,例如,硬碟的MBR(Master Boot Record),在系統完成啟動測試後,如果系統是從MBR啟動,則BIOS(Basic Input/Output System)將控制傳送給MBR。然後儲存在MBR中的這段程式將執行。這段程式被稱為啟動管理器。它的任務就是將控制傳送給作業系統,完成啟動過程》有許多可用的啟動管理器,包括GNU GRUB (Grand Unified Boot Loader),Bootmanager, LILO (LInux LOader), NTLDR (boot loader for Windows NT systems),等等等.

  1.2 什麼是GRUB?

  grub 是一個多重啟動管理器。grub是GRand Unified Bootloader的縮寫,它可以在多個作業系統共存時選擇引導哪個系統。它可以引導的作業系統包括:

  Linux,FreeBSD,Solaris,NetBSD,BeOSi,OS/2,Windows95/98,Windows NT,Windows2000,WinXP。它可以載入作業系統的核心和初始化作業系統(如Linux,FreeBSD),或者把引導權交給作業系統(如Windows 98)來完成引導。

  1.3 GRUB的特點

  特別適用於linux與其它作業系統共存情況。

  支援大硬碟 現在大多數Linux發行版本的lilo都有同樣的一個問題:根分割槽(/boot分割槽)不能分在超過1024柱面的地方,一般是在8.4G左右的地方,否則lilo不能安裝,或者安裝後不能正確引導系統。而grub就不會出現這種情況,只要安裝時你的大硬碟是在LBA模式下,grub就可以引導根分割槽在8G以外的作業系統。

  支援開機畫面   grub支援在引導開機的同時顯示一個開機畫面。對於玩家來說,這樣可以製作自己的個性化開機畫面;對於PC廠商,這樣可以在開機時顯示電腦的一些資訊和廠商的標誌等。grub支援640x480,800x600,1024x768各種模式的開機畫面,而且可以自動偵測選擇最佳模式,與Windows那320x400的開機畫面不可同日而語。

  兩種執行模式 grub不但可以透過配置檔案進行例行的引導,還可以在選擇引導前動態改變引導時的引數,還可以動態載入各種裝置。例如你在Linux下編譯了一個新的核心,但不能確定它能不能工作,你就可以在引導時動態改變grub的引數,嘗試裝載這個新的核心進行使用。Grub的命令列有非常強大的功能,而且支援如bash或doskey一樣的歷史功能,你可以用上下鍵來尋找以前的命令。

  選單式選擇   grub使用一個選單來選擇不同的系統進行引導。你還可以自己配置各種引數,如延遲時間,預設作業系統等。

  分割槽大小改變後不必重新配置   grub是透過檔案系統直接把核心讀取到記憶體,因此只要作業系統核心的路徑沒有改變,grub就可以引導系統。

  除此之外,Grub還有許多非常強大的功能。例如支援多種外部裝置,動態裝載作業系統核心,甚至可以透過網路裝載作業系統核心。Grub支援多種檔案系統,支援多種可執行檔案格式,支援自動解壓,可以引導不支援多重引導的作業系統,支援網路啟動等。

  1.4 MBR和第一扇區

  你可以簡單的理解為MBR是整個硬碟的物理第一位置,而第一扇區是硬碟的物理第二位置.

  1.5 一個GRUB配置檔案

  基於本例的分割槽如下:

  hda 15G

  hda1 8G / RED HAT LINUX8.0

  hda5 7G /home

  hdc 20G

  hdc1 6.4G WinXP

  hdc5 6.4G

  hdc6 6.4G

  hdc7 6.4G

  #fdisk -l

  # Disk /dev/hdc: 255 heads, 63 sectors, 2434 cylinders

  Units = cylinders of 16065 * 512 bytes

  Device Boot Start End Blocks Id System

  /dev/hdc1 * 1 894 7181023+ b Win95 FAT32

  /dev/hdc2 895 2434 12370050 f Win95 Ext'd (LBA)

  /dev/hdc5 895 1787 7172991 b Win95 FAT32

  /dev/hdc6 1788 2434 5196996 b Win95 FAT32

  Disk /dev/hda: 255 heads, 63 sectors, 1867 cylinders

  Units = cylinders of 16065 * 512 bytes

  Device Boot Start End Blocks Id System

  /dev/hda1 * 1 1020 8193118+ 83 Linux

  /dev/hda2 1021 1802 6281415 83 Linux

  /dev/hda3 1803 1867 522112+ 82 Linux swap

  grub.conf,這個檔案位於;/boot/grub/grub.conf

  # grub.conf generated by anaconda

  #

  # Note that you do not have to rerun grub after making changes to this file

  # NOTICE: You do not have a /boot partition. This means that

  # all kernel and initrd paths are relative to /, eg.

  # root (hd0,0)

  # kernel /boot/vmlinuz-version ro root=/dev/hda1

  # initrd /boot/initrd-version.img

  #boot=/dev/hda

  default=0

  timeout=3

  splashimage=(hd0,0)/boot/grub/splash.xpm.gz

  title Red Hat Linux (2.4.18-14)

  root (hd0,0)

  kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/

  initrd /boot/initrd-2.4.18-14.img

  title Microsoft Windows XP

  map (hd0) (hd1)

  map (hd1) (hd0)

  root (hd1,0)

  chainloader (hd1,0)+1

  makeactive

  boot

  2 解讀grub.conf檔案

  我們將來看看grub.conf檔案內語句,(注:...)內的東西是我們的解讀內容.

  # grub.conf generated by anaconda

  #

  # Note that you do not have to rerun grub after making changes to this file

  # NOTICE: You do not have a /boot partition. This means that

  # all kernel and initrd paths are relative to /, eg.

  # root (hd0,0)

  # kernel /boot/vmlinuz-version ro root=/dev/hda1

  # initrd /boot/initrd-version.img

  #boot=/dev/hda (注:以上以符號井"#"開頭的行表示被註釋掉,沒有任何意義)

  default=0 (注:預設的作業系統就是由default控制的。default後加一個數字n,表明是第 n+1個。需要注意的是,GRUB中,計數是從0開始的,第一個硬碟是hd0,第一 個軟碟機是fd0,等等。所以,default 0 表示預設的作業系統在這兒是 Red Hat Linux (2.4.18-14)如果你修改成1就是WinXP了)

  timeout=3 (注:timeout表示預設等待的時間,這兒是3秒鐘。超過3秒,使用者還沒有作出選 擇的話,系統將自動選擇預設的作業系統;當然你可以改成任何你樂意的時間)

  splashimage=(hd0,0)/boot/grub/splash.xpm.gz (注:指定開機畫面檔案splash.xpm.gz的位置)

  title Red Hat Linux (2.4.18-14) (注:表示Red Hat Linux的選單項)

  root (hd0,0) (注:表示第一個硬碟第一個分割槽,這裡的root和系 統內的root不是一碼事!詳細如下說明)

  kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/ (注:指定核心的位置,詳細說明如下 文)

  initrd /boot/initrd-2.4.18-14.img (注:初始化)

  title Microsoft Windows XP (注:表示Microsoft Windows XP的選單項)

  map (hd0) (hd1) (注:map是命令,詳細如下)

  map (hd1) (hd0)

  root (hd1,0) (注:這是指第二個硬碟(從硬碟)上第一個分割槽)

  chainloader (hd1,0)+1 (注:鏈式裝入器,裝入一個扇區的資料然後把引導 權交給它。詳細說明如下)

  makeactive

  boot

  (注:在 Linux 中,當談到 "root" 檔案系統時,通常是指主 Linux 分割槽。但是,GRUB 有它自己的 root 分割槽定義。GRUB 的 root 分割槽是儲存 Linux 核心的分割槽。這可能是您的正式 root 檔案系統,也可能不是。我們討論的是 GRUB,需要指定 GRUB 的 root 分割槽。進入 root 分割槽時,GRUB 將把這個分割槽安裝成只讀型,這樣就可以從該分割槽中裝入 Linux 核心。GRUB 的一個很“酷”的功能是它可以讀取本機的 FAT、FFS、minix、ext2 和 ReiserFS 分割槽.到目前為止,您可能會感到一點疑惑,因為 GRUB 所使用的硬碟/分割槽命名約定與 Linux 使用的命名約定不同。在Linux 中,第一個硬碟的第五個分割槽稱作 "hda5"。而 GRUB 把這個分割槽稱作 "(hd0,4)"。GRUB 對硬碟和分割槽的編號都是從 0 開始計算。另外,硬碟和分割槽都用逗號分隔,整個表示式用括號括起。現在,可以發現如果要引導 Linux 硬碟 hda5,應輸入 "root (hd0,4)"。

  知道了核心在哪兒,還要具體指出哪個檔案是核心檔案,這就是kernel的工作。

  kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/說明/boot/vmlinuz-2.4.18-14就是要載入的核心。後面的都是傳遞給核心的引數。root=LABEL=/就是linux的硬碟分割槽表示法,ro是readonly的意思。initrd用來初始的linux image,並設定相應的引數。

  命令map:當你有兩塊硬碟,一個無法從第二塊硬碟啟動的作業系統,例如Windowsxp,就可以使用map命令.你能夠將hd0對映為hd1,將hd1對映為hd0。換句話說,你可以虛擬的交換兩個硬碟而啟動所需要的作業系統 。命令形式如下:

  grub> map (hd0) (hd1)

  grub> map (hd1) (hd0)

  GRUB 使用了“鏈式裝入器”(chainloader)。鏈式裝入器從分割槽 (hd1,0) 的引導記錄中裝入winxp自己的引導裝入器,然後引導它。這就是這種技術叫做鏈式裝入的原因 -- 它建立了一個從引導裝入器到另一個的鏈。這種鏈式裝


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-957091/,如需轉載,請註明出處,否則將追究法律責任。

相關文章