对于多数没有或很少接触过linux的windows用户来说,刚开始使用grub时离不开菜单。也就是说,使用grub前,我们要准备menu.lst文件。
先讲一些最为常用的命令
help
用来显示其它命令的用法,例子:
help root
default
指定缺省的菜单项,由0开始算起,例子: default 0 该命令必须在第一个title之前指定
timeout
缺省的等待时间,如果在指定的时间(以秒为单位)不按任何键,则会启动缺省的菜单项,例子: timeout 10该命令必须在第一个title之前指定
root
用来指定根设备,例子: root (hd0,0)
rootnoverify
该命令也可以用来指定根设备。root在设置根设备前,先测试一下该分区的文件系统是否可以识别,而rootnoverify则省略这一测试。rootnoverify (hd0,0)
chainloader
把启动扇区的内容装入内存,参数+1指的是把分区的第一个扇区,例子: chainloader +1
boot
启动操作系统。在使用该命令前,必须用kernel或者chainloader把系统内核或者启动扇区/启动文件装入内存。例子: boot
在配置文件中不需要使用这个命令。这是因为GRUB在执行了菜单项的所有命令后,会自动加上boot。该命令一般在命令行界面里使用。
Grub4dos高级功能
虚拟磁盘
GRUB4DOS中的虚拟磁盘是由map命令实现的。map命令的功能介绍如下:
磁盘交换
map命令在GRUB Legacy中也存在,用作磁盘交换。
比如说,你有两只硬盘,但两只硬盘上均有可启动的系统。在第一只硬盘上启动时,不需要特殊的处理,直接用chainloader装载启动扇区就可以了。不过,如果要从第二只硬盘上启动,那么单单用chainloader是不够的,这是因为很多操作系统都缺省地从第一只硬盘上装载启动所需的文件,如果文件不在其上,系统便不能顺利地读取,从而导致启动失败。
一个原始的解决方法是在BIOS中修改启动顺序,把需要启动的硬盘放到最前面。那么,重启计算机后该硬盘便会成为第一只硬盘,从而可以正常启动,但这种方法明显很麻烦。
GRUB中的map命令可以在运行时交换磁盘,而无需修改BIOS。例如:
title Boot First Partition on Second Disk
map (hd0) (hd1)
map (hd1) (hd0)
chainloader (hd1,0)+1
boot
在该例子中,使用了map命令交换了(hd0)和(hd1)。要注意,交换是在命令boot后才生效的。因此在chainloader命令中,读取的仍然是第二只硬盘。
建立虚拟磁盘
在GRUB4DOS中,大大地扩展了map命令的用法。利用该命令可以建立虚拟磁盘,例子:
把(hd0,0)根目录下的aa.dsk文件映射为第二只硬盘,并且使用原来硬盘上的系统启动:
title Create Virtual Disk
map (hd0,0)/aa.dsk (hd1)
root (hd0,0)
chainloader +1
boot
(在该例子中,把(hd0,0)根目录下的aa.dsk文件映射为第一只硬盘,原来的第一只映射为第二只硬盘。)
从aa.dsk里虚拟出来的磁盘中启动:
title Boot From Virtual Disk
map (hd0,0)/aa.dsk (hd0)
map (hd0) (hd1)
map --hook
root (hd0,0)
chainloader +1
boot
上面提到,map命令的映射不是马上起作用的。但是要从虚拟磁盘中启动,就必须从中读取数据,因此需要使映射提前起效。map --hook的作用便是使前面map命令指定的映射立刻生效。
把(hd0,0)根目录下的aa.img文件映射为第一只虚拟软盘,并从中启动:
title Boot From Virtual Floppy
map (hd0,0)/aa.img (fd0)
map --hook
root (fd0)
chainloader +1
boot
使用这种方式进行映射后,虚拟磁盘的内容和影像文件的内容是同步的,也就是说,如果你修改了虚拟磁盘的内容,影像文件也同样被更新。如果你重启了机器,该修改的效果仍然存在。
在使用这种方式进行映射时,影像文件在磁盘上的存放必须是连续的。
GRUB4DOS中建立的虚拟磁盘,包括以下所说的内存盘,都是通过截取INT 13来实现的。因此在启动了操作系统后,如果该系统是通过INT 13来访问磁盘的,例如各类的DOS,那么在进入系统后仍然可以访问虚拟盘。如果系统是采用其它方式来访问磁盘,例如Linux、Unix和WinNT系列的操作系统,那么在进入系统后便不能访问虚拟盘。但古典系统Win9X系列比较特殊,正常情况下它使用保护模式的驱动来访问磁盘,但如果找不到合适的驱动时,win9x会使用INT 13来访问磁盘,因此,在Win9X下也可以访问虚拟磁盘。
建立虚拟内存盘
用map也可以建立虚拟内存盘,其用法和以上的很相似,你只需要在map建立虚拟盘的命令中加上--mem参数就行了。使用了该映射方式,影像文件的内容是装载到内存后才进行映射。所以你必须有足够的内存来存放影像和启动系统。而且,虚拟磁盘和影像文件是分离的,对虚拟磁盘所作的修改不会被更新到影像文件中。
在这种映射方式中,映像文件在磁盘上的存放不需要是连续的。
例子:把(hd0,0)根目录下的aa.dsk文件映射为第一只硬盘,原来的第一只映射为第二只硬盘,并且从aa.dsk里虚拟出来的磁盘中启动:
title Boot From Virtual Disk
map --mem (hd0,0)/aa.dsk (hd0)
map (hd0) (hd1)
map --hook
root (hd0,0)
chainloader +1
boot
把(hd0,0)根目录下的aa.img文件映射为第一只虚拟软盘,并从中启动:
title Boot From Virtual Floppy
map --mem (hd0,0)/aa.img (fd0)
map --hook
root (fd0)
chainloader +1
boot
自动生成MBR
映像文件有两种类型。一种是文件系统映像,它里面只包含某一个文件系统的数据。另一种是磁盘映像,它里面包含了类似于物理硬盘的结构,也就是,映像以MBR开始,然后才是文件系统的数据。对于虚拟内存盘,其结构是类似于真实硬盘的,因此在使用map命令进行映射时,应该使用磁盘影像。
GRUB4DOS考虑到了这个问题。为了让用户使用更加方便,GRUB4DOS作了如下的改进:当把磁盘影像读入内存时,程序会检测其结构,如果发现是文件系统影像,那么在它前面自动生成MBR,把它变为磁盘影像。因此,无论用户选择使用文件系统影像还是磁盘影像,装载到内存后都会变成正确的格式。
自动生成MBR。
还有一个应用,就是直接从硬盘上的装载分区,从而生成虚拟磁盘。例如:
title Load Partition From Disk
map --mem (hd0,0)+1 (hd0)
(注意:在map命令中,(hd0,0)+1是指整个(hd0,0)分区,而不是(hd0,0)的第一个扇区。这种表示只是在map命令中适用,在其它的地方,(hd0,0)+1 还是原来的意义。)
map (hd0) (hd1)
map --hook
root (hd0,0)
chainloader +1
boot
该菜单的功能是把硬盘上第一个分区装载到内存,并自动在其前面加上MBR生成虚拟磁盘。然后把该虚拟磁盘映射为第一只硬盘,原来的硬盘映射为第二只硬盘。最后,从虚拟磁盘中启动。
在使用该菜单启动后,系统分区的内容和好像和原来一样,但这时实际是使用在内存里的虚拟磁盘。对分区的修改会在重启机器后消失。
该菜单是把整个分区的内容装载到内存,要确定内存足够大,否则命令不会成功。
虚拟设备(md)
在GRUB4DOS中,你可以用设备(md)来访问整个内存,就和用(nd)访问网络设备,用(cd)来访问光盘类似。
GRUB4DOS也扩展了cat命令,它可以用--hex来以十六进制输出,也可以用--locate=STRING来在文件中搜索字符串。
例子:
cat --hex (hd0)+1 以十六进制形式显示第一只硬盘的MBR。
cat --hex (hd0,0)+1 以十六进制形式显示第一只硬盘第一个分区的启动扇区
cat --hex (md)+2 以十六进制形式显示内存开始1K的内容,这里其实是中断向量表。
cat --hex (md)0x800+1 以十六进制形式显示内存从0x800 * 512 = 1M 开始512字节的内容,也就是从扩展内存开始的512字节。
虚拟设备(rd)
用虚拟设备(md)可以访问从地址0开始的物理内存,而使用(rd)则可以访问从某一地址开始的内存。
map --rd-base=ADDR 用来设置(rd)内存设备的开始地址(以字节为单位)。
map --rd-size=SIZE 用来设置(rd)内存设备的长度(以字节为单位)。
当把grub.exe作为linux内核启动时,可以用指定初始盘。进入grub后,(rd)设备的开始地址和长度自动设置为初始盘的地址和长度。因此,可以在grub中用(rd)设备来访问初始盘。
map --ram-drive=RD
用来设定访问(rd)内存设备的BIOS设备名。缺省值是0x7F,表示(rd)对应的虚拟盘是软盘设备。如果(rd)对应的虚拟盘是硬盘设备,那么需要设置RD, 使得 0x80< RD < 0xFF。
map的其他参数
* --status
用于显示当前的磁盘映射。 map --status
* --floppies=M, --harddrives=N
指定软盘/硬盘的数目。 map --harddrvies=2 使用该命令后,本地硬盘的数目设为2。
* --memdisk-raw=RAW
RAW取值0或1(缺省是1)。RAW=0时,使用int15/ah=87h读扩展内存。RAW=1时,使用内部的函数来读扩展内存。 map --memdisk-raw=0
* --safe-mbr-hook=SMH ,--int13-scheme=SCH
这两个参数是为了在Windows 9X下能正常使用虚拟盘而设的。
SMH取值0或1(缺省是1),当你在Windows 9X下使用虚拟盘时出现问题时,可以试试使用以下的命令: map --safe-mbr-hook=0
SCH取值也是0或1(缺省是1),当你在Windows 9X下使用虚拟盘时出现问题时,也可以试试使用以下的命令: map --int13-scheme=0
* --read-only
使用了该参数后,当前进行映射的磁盘被设为只读模式。 map --mem --read-only (hd0,0)/aa.dsk (hd1)
* --fake-write
使用了该参数后,当前进行映射的磁盘看似可写,但写入的内容均被丢弃。 map --mem --fake-write (hd0,0)/aa.dsk (hd1)