当前位置:Linux教程 - 安装启动 - 安装启动 - 小菜鸟与grub的故事

安装启动 - 小菜鸟与grub的故事

小菜鸟与grub的故事
2004-04-23 15:18 pm
来自:Linux文档
现载:Www.8s8s.coM
地址:无名

记念我花了一个晚上搞定GRUB的艰苦历程,也送给有同样难题的兄弟.

故事是这样的:原先小菜鸟我有一块40G的硬盘,装了2k和98,快乐又太平.后来拿到手RedHat 7.3,不免心痒拿出来装...可是原先40G的硬盘满满当当Linux塞不进,一冲动,就把老奔机器上一块10G的硬盘给卸了,当做我装Linux的硬盘,也省去了分区的麻烦.谁知,麻烦就来了...
好了,不要扔蛋,正题来了.
Linux在安装并配置Loader之时,我理所当然选择了GRUB,但是发现:他要覆盖我/dev/hda1中的mbr,也就是我原先那块40G硬盘的mbr,这还了得?我本来是不想让我原先的硬盘被改写的,那里面的数据对我太重要了,万一一个安装失败,它就给我个boot failure那我岂不是哭死?但是那下拉选单中又没有/dev/hdc1(在我机器上是那个10G小硬盘),无奈之下退出,只好将大硬盘先disable掉.再装,成功了,能写小硬盘的mbr了,我欢欣鼓舞,继续......
于是,问题渐渐显露,我在用Linux时候,想换到Windows下要启动2次:一次先把cmos中的启动顺序该为先启动大硬盘,也就是windows所在硬盘,再存进cmos重新启动,一开始还能忍受,日子久了,不胜其烦...于是萌生了修改grub能启动我的Windows 分区的想法...这也便是痛苦的开始

先是看RH自代的文档盘,找了一个样例文件,如下:
default=linux
timeout=10
color=green/black light-gray/blue

# section to load linux
title linux
root (hd0,1)
kernel /vmlinuz root=/dev/hda5
boot

# section to load Windows 2000
title windows
#(hd1,2)是我机器上装Windows硬盘的id
rootnoverify (hd1,2)
chainloader +1

哟,加3句话可以搞定?好,试试!重启,选择windows,死机...默哀中.除了耳熟能祥的Ctrl+Alt+Del按什么都没用.于是到这里发了贴子,北南老大教育我要多用搜索,脸红,是的,我后来看了他给的几篇文章,GRUB是够清楚了,连它的command line模式我也差不多能用的很熟,可是,大家也猜到了,死机依旧.我当然确定了我没有弄错硬盘分区的id,但是屏幕上没有任何显示!这让大多数的Troubleshooting和FAQ都变的像一纸空文.我快泄气了.

由于不好意思再到论坛里瞎问,只能继续在文档盘里找结果.The Official Red Hat Linux Reference Guide中给出了几个链接,去看看!
第一个去的地方:
http://www.linuxgazette.com/issue64/kohli.html
唔,学到了不少:

Let's try another example with Windows installed in /dev/hda1 or (hd0,0). The procedure for booting with Windows is as follows:

#在menu.lst也就是grub.conf文件中:
rootnoverify (hd0,0)
makeactive
chainloader +1
boot

喔,原来需要加一个makeactive和boot!!怎么都没人高诉我讷?试试!(满心欢喜)
结果,问题依旧....
好把,继续找出路:
http://www.redhat.com/mirrors/LDP/H...-with-GRUB.html
好,Redhat的官方支持,准没错!
嗯,在文档里看到了修改menu.lst文件的另一个版本:

title Windows 2000
unhide (hd0,0)
hide (hd0,1)
hide (hd0,2)
rootnoverify (hd0,0)
chainloader +1
makeactive

需要将非linux分区隐藏?我试试......
死机....
重启....
问题来了!我的GRUB怎么变成文本格式了?!我怎么启动??
真的,GRUB变回了你在控制台中的命令行bash-like方式,这这这,怎能不叫人眼前一黑?
冷静,feng_ye,冷静,想想,对了!一定是hide命令隐藏了linux分区,那么恢复它!通过按<tab>获得帮助,我unhide了所有的分区...按<Esc>,回到了可爱的(可恶的?)GRUB GUI界面(呼~还好,没冲动把Linux重装,因为我没有启动软盘)

看来都不行...在我心灰意懒之余我到了GNU的主页作最后一次挣扎,(谁知,嘿嘿)

http://www.gnu.org/software/grub/

那里有相当专业的FAQ和TroubleShooting, 而我也在那里发现了救命稻草:
原文如下:

If you have installed DOS (or Windows) on a non-first hard disk, you have to use the disk swapping technique, because that OS cannot boot from any disks but the first one. The workaround used in GRUB is the command map (see map), like this:

grub> map (hd0) (hd1)
grub> map (hd1) (hd0)

好像......就是它!!

尔后, 我修改了我的menu.lst,去掉了hide, unhide, 全文件如下:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,1)
# kernel /boot/vmlinuz-version ro root=/dev/hdc2
# initrd /boot/initrd-version.img
#boot=/dev/hdc
default=0
timeout=10
splashimage=(hd0,1)/boot/grub/splash.xpm.gz
title Red Hat Linux (2.4.18-5)
root (hd0,1)
kernel /boot/vmlinuz-2.4.18-5 ro root=/dev/hdc2 hdd=ide-scsi
initrd /boot/initrd-2.4.18-5.img
title Red Hat Linux (2.4.18-3)
root (hd0,1)
kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hdc2 hdd=ide-scsi
initrd /boot/initrd-2.4.18-3.img
title Windows
map (hd0) (hd1)
map (hd1) (hd0)
rootnoverify (hd1,2)
chainloader +1
makeactive
boot

原来如此. 怪不得我以前在控制台打grub检索硬盘分区和在启动时进入command-line mode检索分区得到的硬盘列表正好相反(很拗口是吧?就是hd0的分区变成了hd1的,而hd1的分区变成了hd0的).原来用map命令可以虚拟掉换两硬盘的id.

重启, 成功!

经验三条:1,不要没做研究就到论坛上问,除非你的时间太紧迫;
2,英文很重要,读懂官方文件和Online manual,对我们好处多多;
3,坚持不懈,我就不信它牛得过我?!

后记: 多谢北南,虽然没有在他的教程里找到答案(说不定也有?), 但是也获益非潜.后来在RH的文档盘里也发现了这关键的map命令,只是当初没留意...