打印

如何在重装Windows后,使用Grub引导linux

这个帖子都顶了两年了,看来大家遇到的双系统启动问题还真不少,有必要普及一下分区和grub的相关知识了。

首先,要澄清一下分区方面的问题。根据dos的分区定义(注意只是dos,可能其他系统划分出来的分区可能不符合这些条件),一块硬盘,可以划分成多个分区,但是只能是两类,一类是主分区primary partition,另一类是扩展分区extended partition。在一块硬盘上,扩展分区最多只能有一个(也可以没有),而主分区和扩展分区的总数最大是4个。一个扩展分区,可以把它整个划分成一个单独的逻辑分区(这样做的人很少,因为你总的分区个数要受限制,不能大于4),也可以划分出任意多个逻辑分区,没有数量限制!这就是我们能够给一块硬盘分成大于4个分区的原因,也是dos要专门定义出一个扩展分区类型出来的原因!因为,能够引导系统(dos或者windows)的,只是主分区!而扩展分区和其划分出来的逻辑分区不能。不过在同一时刻,最多只能有一个主分区能够引导系统,它被标记为一个“活动”的主分区,而其他都必须标记为“不活动”,当然也可以让所有的主分区都标记为“不活动”,不过此时就没有任何分区(主分区、扩展分区、逻辑分区)能够引导系统了。要切换能主分区够否引导的“活动”标志也可以,很多工具软件都行,当然包括grub。而linux之所以能从扩展分区里的逻辑分区里引导和启动,就是因为它和dos不一样,它的引导程序是grub!(以前是lilo,这两个有区别,一个是基于文件系统的,一个是基于直接的硬盘地址的,有兴趣可以看看相关资料)。

另外要重点说一下,grub对分区的编号法则。默认情况下,主分区和扩展分区是从0到3(注意所有的编号是从0开始的,和我们平时从1开始的习惯不一样!),如果扩展分区里有逻辑分区,那么其编号从4开始,一直到给每个逻辑分区分配完为止!要注意,此时扩展分区的编号仍然要占用0~3中的某一个,但是我们无法对其进行格式化、存储数据等操作,因为它已经被分成了更多的逻辑分区,如果我们删除了某个扩展分区,那么我们就删除了所有包含于它逻辑分区!用过dos的fdisk的人都有印象,要删除某个扩展分区,必须先分别删除里面的逻辑分区才行,这就是一个fdisk程序防止我们误操作的措施。我们的硬盘,一般来说是分成一个主分区(就是win下的“C盘”)+一个扩展分区,然后再在扩展分区里划分逻辑分区(在win下从D开始,一次为E、F…………)。(hdx,y)中,x是指硬盘编号,第一块硬盘是0,第二块是1,依次类推;y就是我上面说的编号规则。一般来讲,我们只有一块一盘,一个主分区+一个逻辑分区,所以“c盘”是(hd0,0),“d盘”是(hd0,4),“e盘”是(hd00,5),“f盘”是(hd0,6).....依此类推。而在linux下,由于编号从1开始记数,所以他们分别是/dev/hda1、/dev/hda5、/dev/hda6.....等等。如果分区表做过改动,就是硬盘分区进行过重组(不一定时要全部删除重新分过,只是改变一下其中的某些分区,例如将扩展分区里的逻辑分区全部合并再重新划分,或者将某个主分区一分为二等),分区表的分区编号就会被打乱(用linux下的fdisk重新调整分区时就很明显),这时可以再用fdisk的f命令重新按上述规则给分区编号。明白了这些之后,很多问题就能迎刃而解了。另外强烈建议用linux的fdisk来分区,因为它功能最强,最主要的是用windows nt(2000、xp、2003)的分区工具来分区的话,会在各个分区的间隔之中插入一些只有几MB的小空间,既不能使用也不能回收,会将硬盘的搞得十分复杂,十分烦人!据说这是M$为了方便将来把磁盘分区升级为动态卷和加入其他功能而预留的,而且你在win的分区工具下看不见这些“分区碎片”,用linux下的fdisk和其他分区工具就看得一清二楚!

grub的引导程序可以装在mbr,就是硬盘的主引导记录,这里就是记录了硬盘的哪个主分区是“活动”的,系统启动时,bios就是到这里找可以引导系统的位置,再跳转到那里去引导系统的。所以把grub装在mbr优先级是最高的。grub也可以装到某个主分区里去,具体就是这个主分区的最前面几个扇区,如果我们把这个主分区标记为“活动”的话,那么bios也可以通过读mbr的信息然后跳转到这里开始启动linux。dos/windows只能用后一种种方式引导系统,而windows在安装时,将硬盘的mbr清空,使装在mbr的grub失去作用,此时bios就只能从有活动标志的主分区引导系统了。只要重新将grub装回mbr就可以解决问题,完全没必要重装win或者lin。不过一个启动光盘或者U盘、软盘之类的还是必须的,除非你用了grub4dos,用win的ntloader通过glrlr来重新启动grub,再把它装回mbr。所以强烈建议双系统的人用grub4dos的grub来引导系统,这样即使重装windows,mbr被覆盖,grub失效,仍然可以不用任何光盘、U盘之类的东西,只凭借硬盘上的ntloader和grub4dos里的glrlr,重新将grub装回mbr去。

还要说明的是,setup (hd0)就是将grub装到mbr,而setup (hd0,x)就是将grub装到第x+1个主分区去的。而且装到mbr或者某个主分区去的grub本身也只是一段引导代码(stage1的,整个操作系统的启动分成stage1和stage2两个阶段,具体的不讲了,有兴趣可以查查资料),它必须要有后继的stage2文件才能实现最终的引导,而这些stage2文件在装好grub之后不能被破坏或者转移位置,不然系统启动后,grub就会报错,无法进行继续进行下一步。如果有这种情况发生,那只能重新用光盘或者系统盘引导系统,将mbr里的grub清空后,重新安装grub了。所以grub装好后,千万不要去动boot/grub里的那些文件。


这里有个帖子,可以参考一下,我在回复里面讲了一些grub4dos和ntloader方面的东西,大家可以参考一下。
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=152185&postdays=0&postorder=asc&start=0
MicroSoft = Micro$oft
Intel = In£el
windows = 晕倒死
voodoomaster = 巫毒教主

TOP