分类: LINUX
2013-03-06 23:20:28
今天下午把E盘和F盘合并了,再重启电脑后,发现不能进入系统了,无论是vista还是fedora,极其郁闷了。google了一下,用了以下grub命令解决了:
1: grub>root (hd0, 0)
2: grub>makeactive //这句可加可不加
3: grub>chainloader +1
4: grub>boot
突然间觉得grub很强大啊,有了想研究的冲动,于是又google。
这里所说的Grub和上文中说的Grub for DOS是不一样的,上文的Grub跟磁盘的第一扇区没有关系,即是说,如果你把上面C盘里grub目录删除,不会影响你的系统启动。我下面讲的Grub却会把一部分代码写到磁盘的第一扇区上,即会写到主引导纪录MBR中。
1 Grub的代码分两部分,一部分写入第一扇区的主引导纪录MBR中,另一部分驻留在磁盘的某一固定位置。
2 Grub的工作过程。计算机启动后,BOIS先做自检等工作,然后BOIS会加载磁盘的第一扇区(512字节)到内存某处,然后跳转到该处执行代码,这段代码就是上面所说的Grub写入MBR的部分,这段代码有Grub第二部分在磁盘上的位置信息,这段代码就是根据此信息加载第二部分,第二部分才是Grub的核心,第二部分会读取/boot/grub/grub.conf配置文件,然后
根据此配置文件弹出用户界面,你看到的那些菜单选择项就是这么来的,当然,你也可以按字母键‘C’进入命令行方式。
3 如上所说,你的机器上的各操作系统的信息是写入配置文件grub.conf的,如果你的配置文件不正确,grub当然找不到你想起动的操作系统了,此时需要你手工启动。例如你因为在Windows里格式化某盘(或别的原因),结果重启机器后grub漂亮的界面不见了,只留下陌生的提示符“grub>”,别慌,你可以用命令来启动你的操作系统。
从命令行启动Windows:
1: grub>root (hd0, 0)
2: grub>chainloader +1
3: grub>boot
从命令行启动Fedora Core2(假设装在/dev/hda7上):
1: grub>kernel (hd0, 6)/boot/vmlinuz-2.6.5-1.385.img root=/dev/hda7
2: grub>initrd (hd0, 6)/boot/initrd-2.6.5-1.385.img
3: grub>boot
或者:
1: root (hd0,6)
2: kernel /vmlinuz-2.6.26.5-28.fc8 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
3: initrd /initrd-2.6.26.5-28.fc8.img
4: boot
注:不同的系统的vmlinuz和initrd不一样,请根据实际使用的系统来填写。
下面就一一解释这几命令。
第1行命令:指定/boot所在的分区。
要是不知道自己的/boot分区在哪里,没关系,先输入root (hd0,然后按Tab键,它会显示可能的分区,然后根据分区类型判断/boot分区。我就是这么做的......所以Tab键是linux里很好用的一个键。这里指定/boot分区并不是必须的,在这里省略的话要在kernel以及initrd中指定,即:kernel (hd0,2)/vmlinuz-2.6......和initrd (hd0,2)/initrd-2.6......
关于"hd0,2”,是指第一块硬盘的第三个分区,这是一个主分区。linux里的分区表示方法有两种:一是像"hd0,2"这种纯数字表示法,它是以"hd0,0"开始,意思是第一块硬盘的第一个分区;第二块硬盘就是hd1。还有一种是hda1这一种,它也表示第一块硬盘的第一个分区;第二块硬盘就是hdb。两种表示法用在不同的场合,纯数字表示法一般用在grub中指定/boot分区;第二种方法是日常使用的表示法,硬盘挂载等都用这种表示法。关于主分区与扩展分区,这里稍微提一点:扩展分区是从hdx5或hdx,4开始的,其中x代表硬盘号。要更加详细的了解linux的分区表示法,Google一下。
第2行命令:指定内核映像及根分区。
输入kernel /vmlinuz,然后按Tab键补全内核映像全名;补全以后可以看到我的fedora内核映像是vmlinuz-2.6.26.5-28.fc8。如果有一个以上的内核,它会全部显示出来让你选择(这种情况遇到过,从8升级到9以后,我的启动菜单里就有了两个映像)。还有就是,我的/boot分区不是在根分区中,而是一个独立的分区;如果/boot分区不是一个独立分区,而是位于根分区中,就要这样写: kernel /boot/vmlinuz-2.6.26.5-28.fc8 ro root=/dev/VolGroup00/LogVol00 rhgb quiet,下面的initrd要写成:initrd /boot/initrd-2.6.26.5-28.fc8.img。映像后面的部分是用来指定根分区的,要手动输入。ro的意思是read only,root=/dev/VolGroup00/LogVol00是根分区位置,rhgb意思是图形化启动过程,quiet意思是不要显示启动信息。在实际操作中,我发现内核映像以后的部分其实不是必须的;也就是说,即使不输入这部分内容,不指定根分区,不指定图形化启动过程,不省略启动信息,也可以正确启动。对于不必指定根分区,是否跟我的系统是单内核有关系?
这行命令要多理解一下。首先,vmlinuz中,vm是指vritual memery,linuz的意思是说,这一个经过压缩的内核映像。还有,这一行命令中的root跟第一行命令中的root表达的不是同一意思。第一行命令中的root指的是系统的启动分区,即/boot分区;第二行命令中的root指的是系统的根分区,即/分区。要详细理解两者的区别,就牵涉到linux文件系统及目录结构,它是linux中关键性的概念之一,我会找个时间写一些关于它东西,浅谈一下我对它的理解。"root="后面的"/dev/VolGroup00/LogVol00"就是根分区的位置;看起来是不是怪怪的?因为我的根分区用的不是普通的硬盘分区,而是逻辑卷,术语叫LVM(logical volume manager)。这个也是linux里一个很重要的东西。LVM要结合linux硬盘分区及目录结构来理解,这里就不谈了,否则会越扯越远,偏离正题。
第3行命令:指定initrd.img
initrd即initial ramdisk,字面上理解是初始化RAM磁盘。它实际上是一个临时的文件系统,而且是与内核绑定在一起的。一般用来加载必须的系统文件、驱动程序和存储设备等,系统启动以后它立刻被释放。据说,在没有其它存储设备的情况下,它就是永久的系统。我不是太了解,也写不出更多的东西来。总之,initrd.img是一个与内核绑定在一起的,用来加载必须的系统文件的临时文件系统。
第4行命令:启动系统。输入boot,敲回车键即可启动系统。
系统启动以后,再想一下这个手动启动的过程,如果了解grub的话,手动启动系统并不复杂。而启动菜单呢,很像是根据我们手动输入的内容编写而成的一个脚本。这个“脚本”让你在启动系统时不必每次都手动输入,所以这个“脚本”还是很有用的,我们还是手动编写一个吧。
若了解linux目录结构的话,就会知道启动菜单在根分区的boot文件夹下的grub文件夹中。grub文件夹中还有一个menu.lst,它是grub.conf的链接文件。你可能有点疑问:你的/boot分区不是一个独立的分区,不在根分区中么?其实这就是linux与windows不同的地方之一,它是通过挂载的方式与根分区产生关系的,这牵涉到文件系统和目录结构方面的东西,这里不详谈。找到并打开grub文件夹,创建一个grub.conf,你需要root权限!
grub.conf该怎么写呢?和上面输入的命令基本相似。下面是我虚拟机中fedora的grub.conf的内容:
其中,加#号的都是注释文字,启动时是被忽略的。核心部分如下:
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
#hiddenmenu title Fedora (2.6.26.5-28.fc8)
root (hd0,0)
kernel /vmlinuz-2.6.26.5-28.fc8 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.26.5-28.fc8.img
第一行,default项,表示默认启动的系统。0代表按照grub中的顺序默认启动第一个系统,改为1,则是默认启动第二个系统。以此类推。第二行,timeout项,表示选择菜单等待时间为5秒。这个可以自己设定选择菜单等待的时间。第三行,splashimage项,表示开机启动时出现的背景画面。若不想让画面显示,可以在前面加#号以忽略。第四行,hiddenmenu项,表示隐藏选择菜单,加#号表示不隐藏。若装了双系统又不想让它出现选择菜单,可以把前面的#号去掉。第五行,title项,选择菜单上出现的系统标题。下面的就不用再解释了。。。
仿照这个grub.conf另外写一个启动菜单,注意我实际电脑中的/boot分区是(hd0,2),其它的完全照搬。然后把它放在/boot/grub中,就可以正常启动fedora了。但是我的实际的电脑中装的是xp和fedora双系统,按照那个启动菜单虽然可以正常启动fedora,却不能正常启动xp,仍然需要手动输入。所还需要在刚才的启动菜单尾部加上一部分:
title windows xp
rootnoverify (hd0,0) #我实际电脑中xp系统是放在第一个分区中的
chainloader +1
若想让xp系统默认启动,把default项改为1。xp这一部分的启动菜单用了链式装入器,也不必理会什么意思,照搬就可以了。
现在一份新的启动菜单就弄好了!
这篇日记算是勉强写完了。一方面,我也不是特别了解grub,无法作更深入的挖掘;另一方面,这篇日记牵涉到很多linux文件系统、目录结构、硬盘分区等知识。既要谈一点这方面的知识,否则读起来会很吃力;又不能谈的过多,否则会偏离正题。但是不管怎么说,用命令行启动fedora是没什么问题了......
从命令行启动Debian和启动Fedora Core2类似。
说明:如果你通过分区软件调整了分区的大小,鬼知道会有什么结果。我没试过,从理论上说你玩完了,因为Grub的第一部分中的关于第二部份的地址信息会失效,结果Grub的核心加载不了了!
4 你以后可以使用同样的方法来启动系统,如果感到不爽,想要菜单,那就修改你的/boot/grub/grub.conf文件吧。现在机器已经跑起来了