grub 向导

grub 引导

http://hi.baidu.com/dangjun625/blog/item/67195c8bf2cefd19c8fc7a96.html

GRUB配置文件示例 grub.conf是GRUB的配置文件,其结构比较简单,可以分为两部分,第一步分是全局配置,另外一部分就是每个操作系统的启动配置。其中可以有多个操作系统的菜单配置。下面就是一个具体的例子。#=================/boot/grub/grub.conf文件范例==================
timeout 30 # 等待用户选择菜单项的时间(以秒计),超时则引导默认的选项
default 0 # 默认选项,第一项
fallback 1 # 如果第一项出错,则启动下面的后备选项
splashimage=(hd0,0)/grub/splash.xpm.gz #GRUB启动画面

#以下是启动Linux的配置
titleRed Hat Linux Enterprise AS3 for syd168 #启动项的菜单标题
root (hd0,0) #指定根文件系统,第1块硬盘第1个扇区中的/boot。
kernel /vmlinuz-2.4.18 ro root=LABEL=/ #内核在/boot中
initrd /initrd-2.4.18-14.img #启动RAM盘在/boot下

#以下是启动Windows的配置,如果只有Linux就不需要
title Windows2003 Enterprise for syd168 #Windows启动菜单标题
root noverify(hd0,1) #该操作系统在hd0的第二分区,不mount
chainloader +1 #从第一个硬盘的第二个分区引导Windows

#=================/boot/grub/grub.conf文件范例==================
上面的例子,只是简单说明了GRUB中启动Linux和Windows的配置方法。更多的启动配置请参考下面内容。5. 引导多系统配置GRUB支持多操作系统引导。用GRUB引导后可以进入命令行模式或者菜单模式,可以通过灵活的命令行模式选择引导各个分区的操作系统,指定引导参数。GRUB支持三种引导方法,一种是直接引导操作系统内核,另一种是通过chainload进行间接引导,第三种就是通过网络引导操作系统。对于GRUB能够支持的Linux,FreeBSD,OpenBSD,NetBSD,GUN Mach等可以通过直接引导完成,但是对于GRUB不支持的操作系统(如Windows),需要用第二种方法chainload来完成。下面就分别来看看这几种引导方法:(1) 直接引导
配置过程通常如下:
a) 用root命令设置包含操作系统内核的根设备
b) 用kernel命令装载内核映象文件,如果这个内核引导的时有参数的话,可以直接将参数加在内核文件名的后面
c) 用module或modulenounzip装载内核模块
d) boot开始引导
(2) chainload引导
a) 设置GRUB的根设备,用rootnoverify (hdx,y)指定
b) 开始引导,用chainloader +1指定,此处“+1”是指示GRUB读入分区的第一个扇区的引导记录。
c) 执行boot开始引导
以上是一般的chainloader方式,对于DOS和WINDOWS,可以简单地用两条指令进行引导:chainloader (hdx,y)+1,然后boot,其中x,y用来指明所在分区号。
(3) 从网络引导:
为了使GRUB能够支持从网络引导,需要在编译时打开网络支持选项(请参考源文件中的netboot/README.netboot)。另外,要在网络中设置两个服务:动态IP服务(BOOTP、DHCP或RARP)和FTP服务。然后,分别针对不同的服务器BOOTP,DHCP或RARP运行bootp,dhcp或rarp。如果一切设置无误的话GRUB就会给出IP,IP netmask和TFTP服务器的IP和网关的IP地址。最后,从网上得到操作系统的映象文件。下面是一个例子:
grub> bootp
Probing...[NE*000]
NE2000 base ...
Address: 192.168.110.23 Netmask: 255.255.255.0
Server: 192.168.110.14 Gateway: 192.168.110.1
grub> root (nd)
grub> kernel /tftproot/gnumach.gz root=sd0s1
======================================================================
参考来源:
ftp://alpha.gnu.org/gnu/grub/
http://www.linuxeden.com/html/sysadmin/20070530/26936.html
http://soft.zdnet.com.cn/software_zone/2007/1006/537431.shtml


http://blog.chinaunix.net/u3/93926/showart_1873482.html


全世界linuxer都知道grub是什么东西,但对于MBR引导到grub再引导到具体操作系统的这个流程可能有不少朋友就比较迷糊了。这不,cu上一位朋友就发出了这样一个求助贴:假如现在一台电脑上装了WIN2000系统,那么我现在在装上LINUX系统和GRUB,那么假如把GRUB装在主分区的话,GRUB直接 引导 LINUX和WIN2000,我是可以理解的,因为MBR中是GRUB的STAGE1(对不对呢?),MBR通过检查DPT分区信息引导系统跳转至DBR (活动分区),我这里想问的活动分区是什么时候设的呢?那么装GRUB到MBR里,那原来MBR中的WIN的引导信息是怎么处理的呢?是不是我们假如说装 GRUB到MBR的时候,GRUB就把GRUB所在那个区设置为了活动分区了呢?然后GRUB引导时候,MBR就找到那个活动分区找到所需要的文件,然后 继续呢?假如说把GRUB装到其他分区(非主引导区)的话,那是怎么样实现GRUB先启动的呢?不是先MBR吗?因为装到了其他分区,没有改主引导区,因 此主引导区还是WIN2000的引导数据啊,怎么会GRUB先启动了呢?这是为什么呢?跟活动分区有关系没有呢?我看资料上写的是哪个系统启动哪个系统就 是活动分区,可是那样的话,似乎就解释不通了啊,就是最最开始这个地方一直不懂,理不清楚。下面就是cu各个玩家对这个问题分析讨论的总结。首先让我们看看传统的启动流程:加载并运行Master Boot Record(MBR)主引导区内容(如lilo等)。然后扫描分区表,定位活动分区,并将活动分区上的引导扇区内容加载到内存中执行。系统引导过程主要由以下几个步骤组成(以硬盘启动为例)1、 开机;2、 BIOS加电自检(POST——Power On Self Test),内存地址为0fff:0000;3、 将硬盘第一个扇区(0头0道1扇区,也就是Boot Sector)读入内存地址0000:7c00处;4、 检查(WORD)0000:7dfe是否等于0xaa55.若不等于则转去尝试其他介质;如果没有其他启动介质,则显示 “No ROM BASIC” ,然后死机;5、 跳转到0000:7c00处执行MBR中的程序;6、 MBR先将自己复制到0000:0600处,然后继续执行;7、 在主分区表中搜索标志为活动的分区。如果发现没有活动分区或者不止一个活动分区,则停止;8、 将活动分区的第一个扇区读入内存地址0000:7c00处;9、 检查(WORD)0000:7dfe是否等于0xaa55,若不等于则显示 “Missing Operating System”,然后停止,或尝试软盘启动;10、 跳转到0000:7c00处继续执行特定系统的启动程序;11、 启动系统。装grub到逻辑分区,那么就一定把grub装入的逻辑分区设为活动的。不过,这时候,grub接管了11步以后的动作:从stage 1.5读出grub.conf。再由配置和用户选择决定下一步的引导行为。一般安装grub都有两种情况,对于安装到MBR这种情况而言,GRUB直接覆盖了原来的MBR引导程序。这也是为什么要换回“原来的 windows的引导方式”,只要用dos引导fdisk /mbr一下就可以的原因。为什么可以这样做,请注意,1-11步中有两个地方出现了0000:7c00。不管是dos boot sector还是nt loader它本身也是从0000:7c00运行的。其实ms当年开发分区管理的这个小程序相当于是在bios引导boot sector中插进去的。grub因为也是写的从0000:7c00这个内存开始的子程序,那么既可以被BIOS加载又可以被dos的MBR加载应该好理 解了吧。开机自检后,引导权交给了硬盘的MBR,此时grub就启动了。由grub来引导windows /linux都可以。注意:linux不一定要安装在活动分区,因为引导程序在MBR!但是windows一定要安装在活动分区(可引导的 windows),第二个windows可以不安装在活动分区,但它的引导文件一定在活动分区。大体顺序是:grub—->windows–>查找引导文件—引导加载—启动windowsgrub—->linux—>查找引导文件(/boot)–>引导加载—启动linux那么,如果把grub安装到了其它的分区上,不是MBR呢?这是grub所装在的那个主分区必须被设为活动分区。因为MBR(物理主引导分 区)中其实并没有 OS相关的引导程序的,通常MBR只是扫描并读取随后的分区表,找到相应的活动分区,读取相应活动分区的第一个扇区的512字节程序并运行,该程序负责进 一步引导相应分区的相应系统。因此,大概的运行次序是BIOS—>MBR—->GRUB—->菜单。这样,大体的真实流程就可以总结如下了:1、 开机;2、 BIOS加电自检(POST——Power On Self Test),内存地址为0fff:0000;3、 将硬盘第一个扇区(0头0道1扇区,也就是Boot Sector)读入内存地址0000:7c00处;4、 检查(WORD)0000:7dfe是否等于0xaa55.若不等于则转去尝试其他介质;如果没有其他启动介质,则显示 “No ROM BASIC” ,然后死机;5、 跳转到0000:7c00处执行MBR中的程序;6、 MBR先将自己复制到0000:0600处,然后继续执行;假如先装XP后装LINUX,并且LINUX没有装在MBR,那这个MBR中的数据还是WIN 写的数据,它的作用都是下步中所说的作用,就是搜索主分区表中标志为活动的分区,那么这个时候就必须把GRUB所在的主分区设置为活动的分区,这个时候才 能正常的启动GRUB,然后GRUB的STAGE1在调STAGE1.5和其他的,从而来引导整个系统。假如说先装XP后装LINUX,但是GRUB装在 了MBR,那样STAGE1直接调入内存,STAGE1在调STAGE1.5和STAGE2等,从而来引导系统。那这个时候是不需要将GRUB其他文件所 在的主分区设为活动分区的,它直接调STAGE1.5等,然后再调STAGE2等,来识别文件系统,从而实现可多启动。7、 在主分区表中搜索标志为活动的分区。如果发现没有活动分区或者不止一个活动分区,则停止;8、 将活动分区的第一个扇区读入内存地址0000:7c00处;9、 检查(WORD)0000:7dfe是否等于0xaa55,若不等于则显示 “Missing Operating System”,然后停止,或尝试软盘启动;10、 跳转到0000:7c00处继续执行特定系统的启动程序;11、 启动系统。一点资料:能正常工作的grub应该包括一下文件:stage1、stage2、*stage1_5、menu.lst。其中stage1的大小一定是512字节,它要被安装(也就是写入)某个硬盘的主引导记录,或者某个活动分区(这个分区要用fdisk标记 成可启动的)的启动扇区。stage1的主要的也是唯一的作用就是找到你存放在硬盘上某个地方的stage2文件,来完成后续的工作。stage2 文件可以存在在某个特定的文件系统中,比如你分了一个linux分区,在上面创建一个ext2文件系统,然后把这个文件拷贝到这个分区的某个目录下。也可 以把stage2直接存放在硬盘的某个位置,也就是未分区的某个地方。不过,好像没有多少人会这么做吧。因为stage1的容量有限(主引导记录MBR和启动扇区的大小只能够是512字节),所以它对文件系统是无法识别的,那如果你把 stage2存放 在 ext2或者fat格式的文件系统上,它如何来找到这个文件呢?这就要用到上面提到的那些stage1_5的文件了,它们负责解释文件系统。你的 stage2放在什么格式的文件系统上,就要调用对应的那个stage1_5文件。比如,你把stage2存放在ext2格式的文件系统上,就需要 e2fs_stage1_5;stage2存放在fat格式的文件系统上,就需要fat_stage1_5了。

http://wenwen.soso.com/z/q126726148.htm

例子:title Install Ubuntu 8.10root (hd0,0)kernel (hd0,6)/vmlinuz boot=casper iso-scan/filename=/ubuntu-8.10-desktop-i386.iso ro quiet splash locale=zh_CN.UTF-8initrd (hd0,6)/initrd.gz第一行root(hd0,0) 意思是指定第一快硬盘,第一个分区为当前引导目录!第二行:kernel 后面跟的是系统内核引导文件!加传递给内核的参数!第三行initrd 是虚拟磁盘文件!为了得到广泛硬件的支持!这里需要虚拟磁盘!因为在系统引导之前也许硬盘是不可用的 所以先虚拟一快磁盘出来 放引导文件!然后等引导到一定的步骤再加载硬盘!

http://blog.chinaunix.net/u2/68904/showart_1808332.html

 initrd 的重要性

  我们在本章稍早之前‘ boot loader 与 kernel 载入’的地方有稍微讲过这个 initrd 的咚咚, 这玩意儿可以被称为 Initial RAM Disk (初始化虚拟磁碟)。前面也提到过 initrd 可以帮助提供核心模组, 让 Linux 核心在‘开机的过程’当中不需要挂载根目录就能够载入所需要的模组,最后得以顺利进入 Linux 系统。 那你会问啊,啥时后需要 initrd 呢?这就得要从开机的流程谈起了。

  我们知道核心解压缩之后会开始侦测并且驱动所有硬体,但是核心档案并没有包含所有的硬体驱动程式, 而是一堆驱动程式以模组的方式存放在 /lib/modules/`uname -r`/kernel/.... 当中。 也就是说,在开机的过程当中我们还需要挂载根目录以方便让核心读取 /lib/modules/.... 内的核心模组, 这样才能够开机完成。简单的流程如下所示:

  1. 读取 BIOS 设定,取得开机装置与主机板晶片等资讯;
  2. 读取 MBR 内的开机载入器 (loader),并透过主机的 INT 13 硬体功能读取核心档案
  3. 核心解压缩并且侦测硬体
  4. 挂载根目录,视需要载入 /lib/modules/`uname -r`/... 内的核心模组
  5. 开始执行 init 这支程式的后续流程等......

  在上面的流程当中不知道你有没有发现一个问题,那就是第 3, 4 步骤之间,如果核心本身不认识档案系统格式时, 那如何挂载根目录啊?当然无法挂载对吧!此时就会造成无法开机的问题了!因为连根目录都无法挂载, 如何进入 Linux 系统啊?您说是吧!那么可能会出现这个问题吗?当然可能的! 如果你的 filesystem 是 LVM, RAID时,或者硬碟是 SCSI 介面时 (包括 SATA 或 USB 介面的磁碟), 那么预设的 Linux 核心档案将无法认识而无法挂载的啦! 果真如上所示,那么你除了重新编译核心将这些模组直接包在核心档案内之外,还有什么选择?有的,那就是 initrd 啦!

  initrd 可以将 /lib/modules/.... 内的‘开机过程当中一定需要的模组’包成一个档案 (档名就是 initrd), 然后在开机时透过主机的 INT 13 硬体功能将该档案读出来解压缩,此时核心就不需要挂载根目录, 因为核心所需要的模组都在 initrd 内了!其实所有的核心模组都在 /lib/modules/ 内, 因此只要能够挂载根目录,其他的模组读取都没有问题的,所以说:‘initrd 内所包含的模组大多是与开机过程有关,而主要以档案系统及硬碟模组 (如 usb, SCSI 等) 为主’的啦!

  一般来说,需要 initrd 的时刻为:

  * 根目录所在磁碟为 SATA、USB 或 SCSI 等连接介面;
  * 根目录所在档案系统为 LVM, RAID 等特殊格式;
  * 根目录所在档案系统为非传统 Linux 认识的档案系统时。

  之前鸟哥非常容易忽略 initrd 这个档案的重要性,是因为鸟哥很穷... ^_^,因为鸟哥的 Linux 主机都是较早期的硬体, 使用的是 IDE 介面的硬碟,而且并没有使用 LVM 等特殊格式的档案系统,而 Linux 预设核心本身就认识 IDE 介面的磁碟, 因此不需要 initrd 也可以顺利开机完成的。自从 SATA 硬碟流行起来后,没有 initrd 就没办法开机了! 因为 SATA 硬碟使用的是 SCSI 模组来驱动的,而 Linux 预设核心并没有包含 SCSI 模组....

  一般来说,各 distribution 提供的核心都会附上 initrd 档案,但如果你有特殊需要所以想重制 initrd 档案的话, 可以使用 mkinitrd 来处理的。这个档案的处理方式很简单, man mkinitrd 就知道了! ^_^。 我们还是简单的介绍一下去!

  [root@linux ~]# mkinitrd [--with=模组名称] initrd档名 核心版本
  参数:
  --with=模组名称:模组名称指的是模组的名字而已,不需要填写档名。举例来说,
  目前核心版本的 ext3 档案系统模组为底下的档名:
  /lib/modules/`uname -r`/kernel/fs/ext3/ext3.ko
  那你应该要写成: --with=ext3 就好了 (省略 .ko)
  initrd档名:你所要建立的 initrd 档名,尽量取有意义又好记的名字。
  核心版本  :某一个核心的版本,如果是目前的核心则是‘ `uname -r` ’


  范例一:以 mkinitrd 的预设功能建立一个 initrd 虚拟磁碟档案
  [root@linux ~]# mkinitrd initrd_`uname -r` `uname -r`
  [root@linux ~]# ll
  -rw-r--r--  1 root root 589106 Jun 27 11:39 initrd_2.6.9-55.EL
  # 由于目前的核心版本可使用 uname -r 取得,因此鸟哥使用较简单的指令来处理啰~
  # 此时 initrd_2.6.9-55.EL 会被建立起来,你可以将他移动到 /boot 等待使用。

  范例二:使用旧版核心建立含有 8139too 这个模组的 initrd 档案
  [root@linux ~]# ll /lib/modules
  drwxr-xr-x  3 root root 4096 Feb 28 23:59 2.6.9-42.0.10.EL
  drwxr-xr-x  3 root root 4096 Feb  1 05:17 2.6.9-42.0.8.EL
  drwxr-xr-x  3 root root 4096 Oct 15  2006 2.6.9-42.EL
  drwxr-xr-x  3 root root 4096 May 20 16:53 2.6.9-55.EL
  # 这个指令可以看出有多少核心版本,鸟哥想要用 2.6.9-42.EL 来玩的!

  [root@linux ~]# mkinitrd --with=8139too initrd_2.6.9-44.EL 2.6.9-42.EL
  [root@linux ~]# ll
  -rw-r--r--  1 root root 603934 Jun 27 11:45 initrd_2.6.9-44.EL
  # 如果与范例一比较,有没有发现这个档案比较大一点,因为多含了一个模组之故。

  initrd 建立完成之后,同时核心也处理完毕后,我们就可以使用 grub 来建立选单了! 底下继续瞧一瞧吧!