如何使用GRUB引导操作系统进行自定义多启动
本文主要内容是使用GRUB来引导目前的绝大部分的系统,包括Windows、linux、bsd、UNIX、OSX等,对于其中涉及系统启动原理和硬盘工作原理部分都是来自于资料和个人理解,难免有错漏之处,请大家多多包涵。关于硬盘结构构成的部分就不附上了。
我们日常使用得最多的操作系统是Windows,包括Windows xp、Windows 2000、Windows 2003和Windows vista、Windows2008等。Windows目前的系统的引导都是通过ntldr文件来传递引导参数; Windows 2000-Windows 2003是通过boot.ini文件来作为启动菜单;到了Windows Vista至目前最新的Windows 7是通过bootmgr启动管理器来管理启动菜单,也就是我们看到的启动windows时候给你选择的按F8,安全模式等等那个菜单。当然各个系统的 ntldr文件大小引导参数各不相同,但作用都是一样的。而linux、bsd等类unix系统是通过lilo或者grub等启动菜单直接加载内核(通常 是一个vmlinuz的内核)来启动,和Windows完全不同。
在用grub来引导所有系统之前,先看一下mbr的原理,这样对于使用grub来引导系统有很大帮助。mbr是“主引导记录”master boot record的英文缩写。一个扇区的硬盘主引导记录MBR由4部分组成:
1. 主引导程序(偏移地址0000H--0088H)。它负责从活动分区中装载,并运行系统引导程序。
2. 出错信息数据区。偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节。
3. 分区表(DPT,Disk Partition Table)。含4个分区项,偏移地址01BEH--01FDH。每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4。
4. 结束标志字。偏移地址01FE--01FF的2个字节值为结束标志55AA,如果该标志错误系统就不能启动。
mbr占用512个字节,位于硬盘的0柱面、0磁头、1扇区,可以直观的理解为mbr处于硬盘的最开始位置,一切硬盘的操作都是由它开始。mbr不 属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它。我们通常所用的pqmagic(硬盘分区大师)、pm(partition manager)、diskgen(分区精灵),甚至dos的最常见命令fdisk(fdisk/mbr这个重建分区表的命令相信一些朋友用过了)都是通 过用ROM-BIOS中提供的INT13H(中断)的2号功能来读出该扇区的内容。 512字节的小空间只能作为一个引导符号标志用哪些引导文件来启动,所以MBR可以看做只是一个引导的符号链接。
Windows的启动便是通过修改mbr的第一个数据-主引导程序来实现对Windows的引导,直观的理解就是安装Windows的时候,它会修 改主引导程序,“通知”它 “我是Windows系统”,你只要寻找活动分区,然后找到ntldr,用这个文件来启动就好了。问题是如果是多类型系统的硬盘或者多样系统多硬盘混合的 硬盘,那就没辙了。Windows/dos的启动叫做链式启动,它不能直接启动linux,只能通过婉转的方式在boot.ini中加入对grub的支 持,再间接启动linux/bsd等。我们通常所用的矮人工具箱,或者grub4dos就是属于这一种。
Windows在 vista之前,使用这个方式启动linux配置起来是很简单的事情,但到了vista时代又不同了。微软不再是用boot.ini来管理启动菜单,而是 通过bootmgr启动菜单管理器。从此修改启动菜单只能通过命令行来修改。当然可以通过vistaboot等有gui界面的软件来修改,问题是经常不能 启动。这是个“划时代”的愚蠢作品。首先我完全看不出这个bootmgr有何新亮点,一样不支持命令组合,一样不支持直接引导类unix系统,一样不支持 虚拟光驱,对于这么一个产品,只能说它是个废物,目的只是为了加速grub进入电脑玩家的视野。
我便是因为Windows vista开始的bootmgr超级废物才决心去研究一下grub这个引导软件。grub有自己的命令组合(它的命令解释器很复杂,本人也没有完全掌握所 有的命令),可以随时调试分区启动,不用每次都进入系统去修改启动配置。grub现在已经作为各种linux发行版的标准配置了,甚至越来越多人使用 grub4dos。它是个万能的引导工具。
了解了一些硬盘引导的原理,接下来使用grub引导系统就很好理解了。目前虽然linux也渐渐普及,几个比较好的发行版桌面化也做得非常好,比如 opensuse、ubuntu,但是大多数人使用的还是Windows系统为主。对于linux系统的grub使用和Windows的完全相同。 grub4dos完全是绿色版的。了解过了mbr的简单知识之后,可以知道换个引导工具只需要修改主引导程序。直接解压附件grub4dos到C盘,启动 grubinst_gui.exe,如图,如果有多硬盘,务必在磁盘的选项选中需要安装grub4dos的硬盘,包括U盘也可以直接使用grub启动(前 提是把U盘格式化成zip/hd/flopy模式)。一般情况下按照图中的选项配置后重启计算机就会进入grub的菜单。注意的是某些U盘就算使用硬盘模 式或者zip模式格式化之后还是无法直接使用grub-install gui修改其主引导程序,这是只能用命令行安装,加上--skip-mbr-test参数,总命令如下:grubinst.exe--pause-- verbose--no-backup-mbr--mbr-disable-floppy --mbr-disable-osbr --skip-mbr-test (hd你自己要安装的硬盘,参考GUI界面的磁盘选择)。
菜单文件menu.lst可以用编辑器打开。如果用记事本打开行列顺序会错乱。最好是右击文件,用写字板打开。编写menu.lst之前,先要理解 grub对硬盘和分区的定义。在grub中,第一硬盘为hd0,第一硬盘的第一分区为(hd0,0),接下去类推,而不是由1开始的,如果不知道是第几分 区也不重要,在grub命令的(hd0,按TAB键,就可以列出硬盘的分区列表)。这点对确定linux的根分区很重要,因为根分区是从1开始的。
(1)Windows类系统和osx使用tboot引导:Windows类系统的引导前面已经说过是链式引导,grub支持直接链式引导任意的 Windows系统,也就是本来硬盘的引导顺序是主引导程序-Windows链式引导文件ntldr 变为主引导程序-grub-Windows链式引导文件ntldr 而已,其根本是完全没有变化的。Windows类的引导只需三行,指明分区和加上链接启动。如Windows2003的启动(假设装在第一硬盘第一分区)
title Windows 2003
root (hd0,0)
chainloader +1
chainloader就是声明链式启动的意思,其他Windows版本也是相同。如果OSX4x86系统是使用tboot来引导,也是属于链式引导,所以也可以这样编写:
title osx
chainloader (hd0,0)/tboot
有的文章指出链式连接启动Windows必须加上makeactive参数,不过只要Windows装在主分区,无论怎么试验,加不加 makeactive参数都是能启动的,反而加上makeactive会频繁修改mbr不是很稳当的做法,个人认为在不使用makeactive无法启动 的情况下再加上这个参数。
需要注意的是,如果是多硬盘环境,务必要加上map参数,因为Windows系统启动只认第一硬盘,比如Windows系统装在第二硬盘第一分区,需要加上map参数,把第二硬盘映射为第一硬盘。
title Windows 2003
root (hd1,0)
map (hd0) (hd1)
map (hd1) (hd0)
chainloader +1
map映射顺序绝对不能搞错,首先要把hd0映射为装系统的盘,然后再把装系统的盘映射为hd0。
出现这个错误一般是因为分区表混乱或者错误,有时在U盘进行HD模式修改后,兼容性不好也会出现。
附件是我自己精简了一下的grub最小化Windows包,纯绿色,加上gui界面很直观,
附件还有一个32位的bootsect,可以把方便把MBR修改回Windows引导,包括NT52(对应WINDOWS XP和WINDOWS2003,通过NTLDR引导)和NT60类型(WINDOWS VISTA以及后续的WINDOWS版本,bootmgr引导)。
中:
(2)linux/bsd类系统的引导
(3)直接链接ISO等映像文件引导……。