摘自:http://www.elecfans.com/emb/xitong/2009011822663.html
模糊的认识不重要,重要的是走过来的路留下痕迹,知道BIOS系统之间之后,将会把控制权交给MBR扇区的引导程序,MBR扇区是硬盘上的第一个扇区,当时非常诧异为什么没有驱动居然能够识别到硬盘,如何知道这是物理上的寻址,我也就不会不拒之门外。
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?
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是整个硬盘的物理第一位置,而第一扇区是硬盘的物理第二位置.
(二)grub的配置
一旦选择了grub为引导程序,下面我们来了解一下它的配置.
/boot/grub/grub.conf是grub产生一个引导选择菜单以及设置一些选项.下面是我的grub.conf (menu.lst)
#==========例子开始==========
default=0
color light-gray/blue
timeout=10
splashimage=(hd0,6)/boot/grub/sw-splash.xpm.gz
title Rays LX kernel 2.6.6-1-686-smp
root (hd0,6)
kernel /boot/vmlinuz-2.6.6-1-686-smp root=LABEL=/ ro vga=785 splash=silent
initrd /boot/initrd.img-2.6.6-1-686-smp
savedefault
boot
title Rays LX kernel 2.6.6-1-686-smp (recovery mode)
root (hd0,6)
kernel /boot/vmlinuz-2.6.6-1-686-smp root=LABEL=/ ro vga=785 splash=silent single
initrd /boot/initrd.img-2.6.6-1-686-smp
savedefault
boot
title Red Hat Linux 9
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是整个硬盘的物理第一位置,而第一扇区是硬盘的物理第二位置.
(二)grub的配置
一旦选择了grub为引导程序,下面我们来了解一下它的配置.
/boot/grub/grub.conf是grub产生一个引导选择菜单以及设置一些选项.下面是我的grub.conf (menu.lst)
:
#==========例子开始==========
default=0
color light-gray/blue
timeout=10
splashimage=(hd0,6)/boot/grub/sw-splash.xpm.gz
title Rays LX kernel 2.6.6-1-686-smp
root (hd0,6)
kernel /boot/vmlinuz-2.6.6-1-686-smp root=LABEL=/ ro vga=785 splash=silent
initrd /boot/initrd.img-2.6.6-1-686-smp
savedefault
boot
title Rays LX kernel 2.6.6-1-686-smp (recovery mode)
root (hd0,6)
kernel /boot/vmlinuz-2.6.6-1-686-smp root=LABEL=/ ro vga=785 splash=silent single
initrd /boot/initrd.img-2.6.6-1-686-smp
savedefault
boot
title Red Hat Linux 9
root (hd0,7)
kernel /vmlinuz-2.4.20-8 root=/dev/hda9 ro vga=785 splash=(hd0,7)/grub/splash.xpm.gz
initrd /initrd-2.4.20-8.img
savedefault
boot
### END DEBIAN AUTOMAGIC KERNELS LIST
title Windows 9x/2000/XP (on /dev/hda1)
root (hd0,0)
makeactive
chainloader +1
######## Adding Windows bootable partitions End #########
#===========例子结束==========
配置选项解释:
以"#"开头的是注释行.
我这里有四个操作系统,分别是Rays LX、Red Hat Linux和Microsoft Windows XP.
Default:默认的操作系统就是由default控制的。default后加一个数字n,表明是第
n+1个。如果你修改成3就是WinXP了
timeout:timeout标识默认等待时间,我这设置为10秒,超过10秒用户还没作出选择的话,将自动选择默认的操作系统。
Color:这个命令将生成彩色菜单。
splashimage一项指定grub界面的背景图片. 是开机画面文件sw-splash.xpm.gz的位置
title:显示选择菜单的名字。
root (hd0,6)标识从第一个硬盘,第7个分区来启动搜索引导内核.注意这儿的root与lin
ux的root分区不同,此root非彼root。grub的硬盘标识方法与linux的有点不同.在linux中第一个主分区为hda1,第二个主分区为hda2,第一个逻辑分区为hda5,而在grub中是以(hdx,y)来标识的,如第一个主分区为(hd0,0)第一个逻辑分区为(hd0,1)依此类推.所以这儿root后面的是你的/boot所在分区标识.
知道了内核在哪儿,还要具体指出哪个文件是内核文件,这就是kernel的工作。
kernel /boot/vmlinuz-2.6.6-1-686-smp root=/dev/hda7 ro vga=785 splash=silent 和 kernel /vmlinuz-2.4.20-8 root=/dev/hda9 ro vga=785 就是要载入的内核(第一个是Rays linux的内核,后面的是Red hat 9的)。后面的都是传递给内核的参数。ro是以readonly的意思,root=LABEL=/就是linux的硬盘分区表示法,vga=785是分辨率。注意我这里两个内核前面的路径。(Rays linux)是“/boot”,是因为我只为“Rays linux”挂载了根分区“/”而boot分区是在根分区之下的。而我为Red hat挂载了boot分区(hda8),所以这里直接就是“/”。
initrd用来初始的linux image,并设置相应的参数
再来看一看windows的定义段吧。
这里,我添加了一项来引导 WindowsXP。要完成此操作,GRUB 使用了"链式装入器"(ch
ainloader),链式装入器从分区 (hd0,0)的引导记录中装入winXP自己的引导装入器NTLoader
,然后引导它。这就是这种技术叫做链式装入的原因 -- 它创建了一个从引导装入器到
另一个的链。这种链式装入技术可以用于引导任何版本的 DOS 或 Windows。如果你在计
算机中装有win98,winme,win2k,winxp的话,chainloader会把引导权交与win的NTLoader
来引导.
三)Grub启动盘的制作
要制作引导盘,需执行一些简单的步骤。首先,在新的软盘上创建 ext2 文件系统。然
后,将其安装,并将一些 GRUB 文件复制到该文件系统,最后运行 "grub" 程序,它将
负责设置软盘的引导扇区。
将一张空盘插入 1.44MB 软驱,输入:
# mke2fs /dev/fd0
创建了 ext2 文件系统后,需要安装该文件系统:
# mount /dev/fd0 /mnt/floppy
现在,需要创建一些目录,并将一些关键文件(原先安装 GRUB 时已安装了这些文件)
复制到软盘:
# mkdir /mnt/floppy/boot
# mkdir /mnt/floppy/boot/grub
# cp /boot/grub/stage1 /mnt/floppy/boot/grub
# cp /boot/grub/stage2 /mnt/floppy/boot/grub
再有一个步骤,就能得到可用的引导盘。
在linux bash中,从 root 用户运行"grub",该程序非常有趣并值得注意,因为它实际
上是 GRUB 引导装入器的半功能性版本。尽管 Linux 已经启动并正在运行,您仍可以运
行 GRUB 并执行某些任务,而且其界面与使用 GRUB 引导盘或将 GRUB 安装到硬盘 MBR
时看到的界面(即GRUB控制台)完全相同。
在 grub> 提示符处,输入:
grub> root (fd0) (root 与(fd0)之间有空格,下同)
grub> setup (fd0)
grub> quit
现在,引导盘完成了。
(四).恢复被windows破坏的grub. (以Red hat 9为例)
如果你用grub来引导linux和windows,当windows出毛病重新安装后,会破坏MBR中的grub
,这时需要恢复grub. (相当于用98启动软盘或光盘启动到实DOS下,用命令fdisk/mbr
清除/mbr里grub的信息)
1.把linux安装光盘的第一张放到光驱,然后重新启动机器,在BOIS中把系统用光驱来引
导。
2.等安装界面出来后键入linux rescue并按回车,进入linux rescue模式。
3.一系列键盘以及几项简单的配制,过后就[继续]了。。。这个过程,我不说了,比
较简单。
4.然后会出现这样的提示符:sh# 。你可以到/mnt/下面看到一个sysimage这么目录,进去以后,就是你安装linux的/分区. 使用命令chroot将根分区变为当前目录的根分区:
chroot /mnt/sysimage
5.我们就可以操作GRUB了.输入grub:
sh#grub
会出现这样的提示符:
grub>
我们就可以在这样的字符后面,输入:
grub>root (hdX,Y)
grub>setup (hd0)
如果成功会有一个successful......
这里的X,如果是一个盘,就是0,如果你所安装的linux的根分区在第二个硬盘上,那X
就是1了;Y,就是装有linux系统所在的根分区。 setup (hd0)就是把GRUB写到硬盘的M
BR上。
(五).用NTLoader来引导linux.
如果你在安装linux时没有选择安装grub,不必着急,现在我们来看看如何在安装linux后
安装grub.并用windows的NTLoader来引导linux.
1. 安装grub
我用的grub是Redhat带的grub安装包: grub-0.92-7.rpm
安装: rpm -ivh grub-0.92-7.rpm
其他安装方式也一样,只要你安装上grub就行了.(RH9缺省用的grub, 1,2步骤可以省了.)
2. 建立grub的环境
cp /usr/share/grub/i386-pc/* /boot/grub
3. 生成grub的配置文件/boot/grub/menu.conf
按照上面所讲的grub.conf来生成一个配置文件.
注意了, 这里我的linux在/dev/hda8,所以menu.conf那些分区位置为(hd0,7),
你的可能不一样了。下面第3步install的中的分区位置也应该和你的系统一致.
3. 安装grub至Linux分区boot
将grub的stage1安装到/dev/hda8的boot扇区(hd0,7). 过程如下:
/sbin/grub (运行grub)
grub> install (hd0,7)/grub/stage1 d (hd0,7) (hd0,7)/boot/grub/stage2 p (hd0,7) /grub/menu.conf
(注意,上面"grub>"为grub的提示符.)
4. 取得grub的boot信息
过程如下:
dd if=/dev/hda8 of=/grub.lnx bs=512 count=1
if 是input_file of 是output_file bs是 字节数 count 是 执行的次数
这样在根目录下得到grub的引导信息,只要用NT Loader来加载它就行了.
5. 将上面得到的grub.lnx弄到Windows的C盘根目录下
可以先把grub.lnx弄得软盘上,然后启动windows,拷贝到C:\; 情况允许也可以直接在Li
nux下拷贝到C:了. 我的C盘(即设备/dev/hda1)为FAT32, 可以直接从Linux下弄过去了.
如下:
mount -t vfat /dev/hda1 /mnt/c
cp /grub.lnx /mnt/c
umount /mnt/c
6. 修改NT Loader的boot.ini
在其中加入一行: C:\grub.lnx="Redhat Linux - GRUB"
加入后boot.ini的内容如下:
[boot loader]
timeout=15
default=C:\boot.lnx
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Profession
al" /fastdetect
[VGA mode]" /basevideo /sos
C:\grub.lnx="Redhat Linux - GRUB"
OK. 可以用NT Loader加载Linux了, 其实上面过程基本思想就是用NT Loader来加载grub的引导区(grub.lnx), 其中的关键就是grub的引导区的获取. 。
(六)活用grub的交互功能
grub具有强大的交互功能.学会了将会使你受益非浅!
1.grub没有显示菜单怎么办?
当开机后进入grub界面但没了菜单,只剩下一个grub>提示符。
〈1〉grub>cat (hd0,7)/grub/grub.conf(为了看参数,或者用fdisk -l显示当前分区情况)
〈2〉grub>root (hd0,7)
〈3〉grub>kernel (hd0,7)/boot/vmlinuz-2.6.6-1-686-smp root=LABEL=/ ro vga=785
〈4〉grub>initrd (hd0,7)/initrd-2.4.18-14.img
〈5〉grub>boot
以上这个方法也可以用于测试新编译的内核.
2.进入单用户模式.
有时不小心把root用户密码忘了,只能进入单用户模式来重新设置root密码。
进单用户模式的具体方法为:在出现grub引导界面的时候,按e,然后选中kernel/boot/vmlinuz-2.6.6-1-686-smp root=LABEL=/ ro vga=785 splash=silent这一项再按e编辑他,把他该成kernel/boot/vmlinuz-2.6.6-1-686-smp root=LABEL=/ single ro vga=785 splash=silent之后按回车退出,再按b。
或者在在出现grub引导界面的时候然后按照上面的方法进行,只是在第三步要在后面加入single参数.
3. 设置GRUB的密码
<1> 进入grub字符cmd-line
#grub
grub> md5crypt
Password: ********** 你的密码
Encrypted: $1$U$JK7xFegdxWH6VuppCUSIb grub给出了密文
复制粘贴记下密文备用,如果忘记密文也无妨,重新md5crypt一下,因为同一个密码,grub给出的密文不一样
grub> reboot
#
<2> 编辑menu.lst
#vi /boot/grub/menu.lst
添加一行:password --md5 $1$U$JK7xFegdxWH6VuppCUSIb
password命令的位置可以不限,只要在所有title引导项之前就行了,然后是空格,两条短横线和md5,又是空格,你的密文。
现在要在启动时对GRUB菜单进行修改就不那么容易了,看菜单框下方的提示:你要敲“P”键,然后输入正确的密码才能对它动手动脚。
当然,这是不够的,它还能限制操作系统的访问。
在想要锁定的选项的title后一行加上lock命令:
title 在你想要的系统title项之后
lock 添加lock,即可实现进入本title系统,必须“p”之后才能进入的功能
root (hdx,x)