|
我修复GRUB,重见Linux 和Windows双启动菜单的经过 write by spy2000 ,e-mail:spy_2000cn at
yahoo.com.cn
我的电脑本有三个系统:Windows Sever 2003,Windows XP Pro,RH AS 3。重装了XP后Linux 和
Windows 双启动菜单没有了,只剩下了Windows Sever 2003和Windows XP Pro的选择菜单。我知道这是
Grub 被覆盖的缘故,于是我收集Grub的资料,开始了“Grub 菜单修复行动”:
第一步:看Linux 的分区号有无变化。由于Linux 装的较早,分区号忘了。于是用Linux 安装盘启动
了电脑,选择安装模式到了手工分区这一步时查到Linux 分区分别是:/boot分区是hda6 swap分区是hda7
/分区是hda8。注意,我只是想查一下分区,不是要重分区!所以,记下各分区号后就重启了电脑。当然
,如果你记得分区号,就不用这一步了。
第二步:我手头上只有Grub for DOS 的资料,看了一下,感觉很有帮助(附在本文后),知道了Grub
中的分区号的表示方法,即:Grub中的(hd0,0)=hda1=Windows的C盘,(hdx,y)就代表第x个硬盘的第y分区
,x=0,1,2,3....,y=0,1,2,3...。而Linux中常见的hdxy,也代表第x个硬盘的第y分区,但
x=a,b,c...,y=1,2,3.....。我的/boot分区在Linux的hda6,在Grub中则表示为(hd0,5),而以前安装Grub的
hda1在Grub中则表示为(hd0,0)。
第三步:万事具备。用Linux安装盘启动电脑,选择linux rescue(RH AS 3中为按F5后输入Linux
rescue,回车。网卡随便选一下。下来选择载入系统,进入Shell。输入grub,回车。出现grub>的提示符
。我按下Tab键,看见一堆选项:
Possible commands are: blocklist boot cat chainloader clear cmp color configfile debug
device dis
playapm displaymem dump embed find fstest geometry halt help hide impsprobe initrd install
ioprobe
kernel lock makeactive map md5crypt module modulenounzip pager partnew parttype password
pause qu
it read reboot root rootnoverify savedefault serial setkey setup terminal terminfo testload
testvb
e unhide uppermem vbeprobe
我猜要安装Grub,应该是setup项,键入help setup,回车。出现setup的提示,我看了半天才搞明白,
其实可以简写为:
setup Grub安装盘 Linux的boot分区
这就好办了,Grub安装盘为第一硬盘,用Grub表示为(hd0)。Linux的boot分区,用Grub表示为
(hd0,5)。于是,我的修复命令为:
setup (hd0) (hd0,5) 回车,系统会自动check必要的文件,并重新写入Grub。
注意:如果不执行setup (hd0) (hd0,5),也可使用下面两条命令来代替setup (hd0) (hd0,5)这一条
命令。
embed /grub/e2fs_stage1_5 (hd0) 回车
install /grub/stage1 (hd0) (hd0)1+16 p (hd0,5)/grub/stage2 /grub/grub.conf 回车
最后输入quit退出Grub,输入exit退出Shell后自动重启后,熟悉的Linux 和Windows 双启动菜单终
于失而复得了。
总结:1.要看清每一个选项和说明文件,尤其是英文说明,多看几次就会懂了,我是CET-4,但第三步用
了三个多小时才搞定。
2.Linux下重要文件的位置要知道,比如刚才的stage文件,我开始也不知道在哪里,后来进了
Windows 后,用Total Commander(带Linux插件)查看了Linux分区,才找到。
3.注意不同的Linux发行版的方法可能有所不同,我用的是下载版的RH EL AS 3,如果是Mandrake,
用安装光盘就可以解决问题了,其它的Linux版本我没用过,也许会有少许不同,大家可以参照我的方法
,自行解决。
4.很多时候,我们也可以解决一些系统问题。只要多钻研,不必重装系统,也可以用几个命令解决
问题。而且,那种成就感,也是很爽的。
5.看起来好象很简单的事情,其实我用了一整晚加上一上午的时间,将近七个小时,虽然累,但想
到大家可以少走弯路,我也很开心。
附Linuxeden.com上的Grub for DOS 的资料:
用 GRUB 来引导软盘映象——节约软盘介质了
【2 月 7 日更新】 GRUB for DOS 0.2.0pre 发布。希望它不做任何更动就可成为最终
版。
仍然借用中国 DOS 联盟 联合 DOS 论坛 之“启动盘室”报告 BUG。
下载 grub for dos 0.2.0pre:
ftp://211.100.7.71/incoming/grub_for_dos-0.2.0pre.tar.gz
ftp://ftp.cosoft.org.cn/incoming/grub_for_dos-0.2.0pre.tar.gz
另外注意(Linux伊甸园首页)以下网址的消息:
http://www.linuxeden.com/download/softdetail.php?softid=1026
正式版的推出日期基本上完全取决于英文文档的完成日期,希望有人能够帮助【可以参
照本文结尾的中文文档,从而贡献一篇英文的说明文档】。我写作英文比较吃力,所以,如果由我来写
0.2.0 的英文说明,可能就太过于简化了。
grub_for_dos 版本 0.1.x 是一个开发版的系列,在 GNU GRUB 原有的基础上实现了引导
1.44M
floppy.img 的功能。从这里得到这个软件:
ftp://ftp.cosoft.org.cn/incoming/grub_for_dos-0.1.4.tar.gz
也可进入目录查看:
ftp://ftp.cosoft.org.cn/incoming/
感谢 Wengier 兄在中国DOS联盟成员新DOS时代为 grub_for_dos 建立镜像下载和英文推介
网页:
http://newdos.yginfo.net/grubdos.htm
〖顺便说:FreeDOS ——GNU/Linux 的一个极好的补充,有着旺盛的生命力。在需要用到实
模式的时候(正如运行 GRUB for
DOS 所要求的那样),我们就想起来 DOS 的好处了。某个著名的 DOS 公司正在努力让 DOS
消亡,但 DOS
是不会消亡的。那个公司不想要 DOS 了,但是我们还要;DOS 的未来是我们的,不是那个
公司的。〗
下载解压后,在纯 DOS 下运行 grub.exe 文件即可。不要被“for DOS”这个后缀吓坏了,
实际上你完全可以在 Linux
下正常编译生成通常的 grub 引导管理器文件,这样,你的 grub 同样可以把软盘映象文件
模拟成启动软盘。整个
grub_for_dos 项目就是对 GNU GRUB 的丰富和加强,你可以认为 grub_for_dos 不过就是
GNU GRUB
的补丁而已(源程序就是以补丁的形式出现的)。再次说明,grub_for_dos 是 GNU GRUB
的功能扩展(起初只是让 GRUB
能够从 DOS 运行,所以取了“for dos”这样的名字),不是“只能用于 DOS 环境”的意
思。正常编译之后,安装在(例如) MBR
中,当然是可以的。
0.1.2 修正了一个读取软盘扇区的 BUG;增加了从 menu.lst 菜单安装 GRUB 到 MBR
的菜单项。使用方法是,将解包后的 boot 目录拷贝到 C:\ 也就是根目录下(于是就有了
这个文件
C:\boot\grub\menu.lst)。这需要在 Windows 下操作(或者在一个可以创建长文件名
的 DOS 下操作),因为在
C:\boot\grub 目录下有很多长文件名,而你所用的 DOS 或许不能建立长文件名。拷贝完
成后,进入纯 DOS,运行
grub.exe,当看到菜单后,选择“install GRUB on (hd0,0) to MBR (hd0) and
reboot”这个菜单项就行了。这里假定你的 C: 盘是 FAT32 格式的,并且分区号是
(hd0,0)
也就是第一块硬盘上的第一个主分区。
0.1.4 优化了 FreeDOS 的相关代码,可望能够在未来的任何 FreeDOS 版本中运行。谢谢
wengier 兄快速的消息。
在“虚拟的” DOS 环境下运行 grub.exe,会出现以下错误信息:
Cannot run in protected mode. Must run in real mode.
Windows Me/2000/XP 的用户获得“纯 DOS”的一个方法是,在资源管理器中格式化一张—
—有启动能力的——软盘,把
grub.exe 拷贝到软盘上,然后用这个软盘引导机器,就可进入实模式的 DOS 了。在这个实
模式 DOS 的 A:> 提示符下敲入
grub 并回车,就可以看到 grub> 提示符了。
有关 grub_for_dos 的用法和注意事项,请看里面的 README 和 ChangeLog 文件。这里摘
录其主要部分:
以下命令集可以引导 Windows 98 SE
map (hd1,0)/dos98se.img (fd0)
chainloader (hd1,0)/dos98se.img
rootnoverify (fd0)
boot
另外一个例子,用 hd.img 文件引导 Mandrake 的安装程序
map (hd0,0)/hd.img (fd0)
chainloader (hd0,0)/hd.img
rootnoverify (fd0)
boot
软盘映象的大小必须是 1440KB, 即 1474560 字节。映象文件必须是连续的磁盘块,不能有
碎片。
如果你用 ext2 之类的分区,恐怕无法生成 1.44M 的连续文件。解决的办法是采用 FAT32
分区。
在 FAT32 分区中将一个文件拷贝成 10 个或 20 个文件,看看哪个文件是连续的,就采用
哪个。
在 grub 的提示符下敲入
grub> blocklist (hd0,0)/hd.img
可以看到该 hd.img 文件是由几个不连续的块组成。如果没有逗号,表示是连续的(只有一
块)。逗号越多,表示碎片越多。在敲入
blocklist (hd0,0)/hd.img 命令之后,应当显示出类似下面这样的结果:
(hd0,0)879328+2880
879328 是起始扇区号,这个数可以随便,没有任何影响。而那个 2880 就是 1.44M 的意思
(2880个扇区就是
1440K)。这说明 hd.img 是硬盘上的一个连续的扇区序列,因此你可以把它仿真成软盘了
,好!
如果显示成类似下面这样的结果:
(hd0,0)879328+96,880000+2784
你注意到 96 和 2784 加起来正好等于 2880。但是,这个 hd.img
文件不能用来仿真软盘,因为它在硬盘上是不连续的,它被放置在两个区域,一个区域是连
续的 96 个扇区,第二个区域是连续的 2784
个扇区。要想使用 grub_for_dos
的软盘仿真(将来还有硬盘和光盘仿真)功能,必须要求——用来仿真的那个区域——是连
续的磁盘块!!我们的实现方法是接管 int13
中断,是用硬盘区域而不是用内存区域来仿真(将来仿真大硬盘,本来就不可能用内存来仿
真的),因而不用接管像 int15
这样的调整内存大小的中断。连续的硬盘区域减轻了编程的负担,也使得仿真之后的硬盘
BIOS 底层操作效率不受到影响。
grub.exe 文件放在任何目录都一样,无关紧要,只要你能运行它就行。
hd.img 放在哪里也是无关紧要。但是,如果不是在根目录,你需要在上述命令中指出所在
的位置,例如
(hd0,0)/somewhere/else/hd.img
如果你的机器没有软驱,而你又需要运行某个 floppy.img 上的安装程序(或者引导程序)
,那么这个软件正是你所需要的。
如果你有软驱,但想节约软盘介质(软盘容易坏掉啊!),也可以试试。
还要说明,map 命令定义了磁盘仿真的映射,如果你不需要从仿真磁盘上引导启动你的操作
系统,你当然可以 chainloader
别的某个引导扇区,并非一定得是这个软盘的映像文件。
已知的问题:
正如上面所说,GRUB 对于磁盘的仿真是基于 BIOS 的 int13。那些使用 BIOS 的操作系统
,在 GRUB
仿真之下能够很好地运转。这些系统有:各种各样的 DOS;Windows Me 以前的系统
(Wengier 说包括 Windows
Me)。(Wengier 说)只有 Windows NT 系列才脱离了 BIOS。已知 LINUX 也不使用 BIOS
。
——那些使用 BIOS 的操作系统都能正常使用 GRUB 的磁盘映射功能吗?
——是的。磁盘映射一旦由 map 命令定义,这个映射从操作系统的引导开始就有效,一直
持续到操作系统退出为止。如果你在 grub 中用
map 命令定义了软盘的映射,此后你用 chainloader 命令引导了 Windows 98,则在
Windows 98
之下,你访问到的软盘,就是你的 img 文件的内容。相反,如果你用 chainloader 命令引
导了 Windows 2000,则在
Windows 2000 中你有可能看不到仿真后的软盘,你可能发现,软盘操作总是指向你的真实
软驱。
——那些不使用 BIOS 的操作系统就不能用 GRUB 的磁盘映射功能了吗?
——在这些操作系统引导的时候,磁盘映射还是起作用的。但是,当这类操作系统的内核引
导完毕之后,它就不再使用仿真了。例如,你用一个软盘映象文件引导了
Linux,在 Linux 内核开始运行之后,Linux 就不使用仿真了。假如这时你访问 /dev/fd0
,可以看到软盘驱动器的灯亮了。此时假如你还想找回你的软盘映象 img 文件的内容,可
以在 Linux 内部通过硬盘文件系统来访问这个
img 文件。另外,设想你可能仅仅想用某个软盘映像文件来引导
Linux,而并非想让这个仿真效果在操作系统引导之后仍然保持下去;如果是这个目的,那
么用 GRUB for DOS 应当是合适的。 |
|