有关Windows启动,GNU GRUB和GRUB4DOS的一些启

有关Windows启动,GNU GRUB和GRUB4DOS的一些启动流程与细节汇总 
上手grub一阵了,看了很多的启动资料,想着做一个汇总会让自己条理更清晰,同时也可以给新来快速查找menu.lst代码和细节问题的朋友带来帮助,就写下了此帖。如果有错误请指正。  
主要是一个汇总和整理工作,如果让一个全新上手的同学来用,会有很多不清楚的地方,还是希望多看置顶帖和在站内google。2006年以后的都有很大的参考价值!  
首先,grub分两种,一种是ubuntu默认安装的,叫GNU grub,现在9.10默认为GNU grub2,而中国的网络爱好者开发了一款更灵活的引导器,叫grub4dos,和GNU grub一代有着一个相似之处,就是读取相同格式的menu.lst来显示启动列表,而grub2只认识grub.cfg文件。GNU grub一代有诸多弊端,所以才有了grub4dos的方便,同时,GNU grub2的自动化特性非常好,几乎完全取代GNU grub,但经常我们还是用grub4dos,因为灵活性高。  
网上经常把GNU grub简称为grub。grub4dos经常直接以grldr这个关键文件来称呼。  
一、MBR的选择 
是硬盘上开头不算入分区的、看不见的一块区域,一个扇区大小,被BIOS调用。  
1.若要写入或恢复XP版本的MBR,用任意一张带DOS的光盘,输入fdisk /mbr就可修复成win98/dos的MBR,可以顺利引导xp。MBR会自动寻找被激活的主分区的引导记录。  
2.Vista和Win7使用新的程序写入MBR,所以直接用DOS或xp的恢复是不推荐的。 方法有三:  
i>vista的光盘启动系统故障修复控制台,输入bootrec /fixmbr: 微软说明:  引用: 
要运行 Bootrec.exe 工具,必须启动 Windows RE。为此,请按照下列步骤操作:  
   1\. 将 Windows Vista 安装盘放入光盘驱动器中,然后启动计算机。    2\. 在系统提示时按某个键。 
   3\. 选择语言、时间、货币、键盘或输入法,然后单击“下一步”。    4\. 单击“修复计算机”。 
   5\. 单击要修复的操作系统,然后单击“下一步”。 
       var script = document.createElement(‘script’); script.src = ‘http://static.pay.baidu.com/resource/baichuan/ns.js’; document.body.appendChild(script);    
   6\. 在“系统恢复选项”对话框中,单击“命令提示符”。    7\. 键入 bootrec /fixmbr,然后按 Enter。    
ii>或使用mbrfix程序,网上下载它,存起来,在winpe下,进入所存的目录, 代码: 
mbrFix /drive 0 fixmbr /vista /yes  
详见yang_hui1986527   彻底清除grub,恢复MBR的两种方法 
Mbrfix是款很好的程序,配合MS原装的bootsect.exe,任何windows的启动问题都可以顺利修复。  
iii>还有款软件叫diskgenius,也可方便地修复,它可以用于windows下,也可用winpe进入。还可以用来进行硬盘丢失数据恢复。http://www.diskman.cc/  
3.安装GNU grub或grub2进入MBR:  
对于GNU grub一代,也可安装ubuntu 9.04或以前版本自带的GNU grub进入MBR,ubuntu默认安装,如果没有,在后期手动安装时要指明root分区在哪里,也就是GNU grub去哪个分区找相关的配置文件menu.lst。它会搜索相关分区的/boot/grub/menu.lst。 分区的系统或9.04的LiveCD下: 代码: $ sudo grub 
grub > root (hdX,Y-1) #你的ubuntu分区 grub > setup (hdX) #启动硬盘的MBR grub > quit   引用: 
Windows位于第一块硬盘的第一个分区,在Linux下表示为sda1,在Grub下表示为(hd0,0),而Linux位于sdaX,用Grub表示为(hd0, X-1)。——Linux下的硬盘分区计数是从sda1开始的,而Grub的硬盘分区计数是从(hd0,0)开始的,所以sdaX就是(hd0,X- 1)。这里X如果在1-4之内,说明Linux分区是主分区,如果X大于4,说明Linux分区是逻辑分区。  
上面的不论GNU grub或grub4dos均成立,而GNU grub2认为硬盘从0开始编号,分区从1开始   
对于GNU grub2,sudo grub命令已经不能使用了。 在9.10或以后版本的livecd下: 安装grub进入选择的地方: 代码: 
假如你的ubuntu的 / 分区是sda7,又假如 /boot分区是 sda6,用livecd启动,在终端下输入 sudo -i 
mount /dev/sda7 /mnt 
 var script = document.createElement(‘script’); script.src = ‘http://static.pay.baidu.com/resource/baichuan/ns.js’; document.body.appendChild(script);
mount /dev/sda6 /mnt/boot (如果没 /boot 单独分区这步跳过) grub-install –root-directory=/mnt  /dev/sda 要装入第二硬盘的把sda改为sdb。    
需要说明,不论grub1还是grub2,此时不会改动你的menu.lst或grub.cfg,而全新安装ubuntu(第7或8步有个“高级”选单)会安装grub到指定的地方,然后为你配置menu.lst(grub.cfg)。  
如果分区状况改变,进不去ubuntu了,下面的情况会生成新的menu.lst 或grub.cfg文件,解决问题: 
在需要更改的操作系统下直接: 代码: 
sudo update-grub   
或在对应版本的livecd下:  代码: 
假如你的ubuntu的 / 分区是sda7,又假如 /boot分区是 sda6,用livecd启动,在终端下输入 sudo -i 
mount /dev/sda7 /mnt 
mount /dev/sda6 /mnt/boot (如果没 /boot 单独分区这步跳过)  
mount –bind /proc /mnt/proc mount –bind /dev /mnt/dev mount –bind /sys /mnt/sys  
chroot /mnt update-grub(生成menu.lst或grub.cfg)  
umount /mnt/sys umount /mnt/dev
locale=zh_CN.UTF-8 initrd /initrd.gz    
相应的iso文件改成installation.iso,9.10的desktop版的initrd用initrd.lz  
5.引用其他menu.lst项  代码: 
title       Other menu.lst 
configfile    (hdx,y)/boot/grub/menu.lst   
引用相应的menu.lst作为次级菜单  
5.进入Wubi的Ubuntu,9.04为例,9.10请找出相应的核的全称:  代码: 
title      Ubuntu 9.04 wubi root      (hdx,y)/ubuntu/disks 
kernel      /boot/vmlinuz-2.6.28-15-generic root=UUID=xxxxxxxxxxxxxxx loop=/ubuntu/disks/root.disk ro quiet splash  initrd      /boot/initrd.img-2.6.28-15-generic    
当然,下面的方法不用找核的全称,也许也可以: 代码: 
title      Ubuntu 9.04 wubi root      (hdx,y)/ubuntu/disks 
kernel      /vmlinuz root=UUID=xxxxxxxxxxxxxxx loop=/ubuntu/disks/root.disk ro quiet splash  initrd      /initrd.img    
xxxxxxxxxxxxxxxxx解释同上。UUID为ubuntu文件夹所在分区真正的UUID,那个分区其实是一个ntfs或fat32的。  
6.创建软盘img的引导项(用来制作方便地进入DOS版 ghost或其他的U盘,需要的人拿走) 代码: title xxxxxx 
map –mem (hd0,0)/xxx.IMG (fd0) map (fd0) (fd1) 
map –floppies=2 map –hook 
chainloader (fd0)+1 rootnoverify (fd0)  
xxx.img为想要添加的img文件    
五、总结 
那么,有几种常用的配置windows和ubuntu启动的方法呢? 
1、BIOS->xp的MBR或者Vista配置过的MBR->windows引导扇区->ntldr/bootmgr->boot.ini         ->(grldr.mbr->)glrdr->menu.lst->ubuntu         ->Windows 
2、BIOS->MBR中的GNU grub->/boot/grub/menu.lst         ->ubuntu         ->Windows 
3、BIOS->MBR中的Grub4dos->grldr->menu.lst         ->ubuntu         ->Windows  
第一种是最容易变动和恢复的,所以很多人其实不选择把CD上自带的GNU grub装入MBR,而只是装入所在分区,只是为了得到一个配置好的menu.lst或grub.cfg,然后用方法1来引导,这也是推荐的措施。  
以xp或vista搭配ubuntu9.04或更早以前的为例,具体:  
0、恢复windows的引导 
从前面的知识,如果windows的那串引导链出了问题,我们可以按需要一点点把它补上。mbrfix.exe重写mbr,bootsect.exe重写windows启动分区的引导扇区。 代码: 
bootsect /nt52 C:  
具体的,/nt52为xp对应的代码,/nt60为vista和7对应的,C:就是安装到C:盘  
1、下载grub4dos最新的包,拿出grldr(vista和7还要grldr.mbr)放到windows分区根目录  
2、编辑boot.ini,vista就新建一个。 XP在最后一行回车,加上 代码: 
C:\grldr = “Ubuntu”   
vista新建: 代码: 
[boot loader]  [operating systems] C:\grldr = “Ubuntu”      
Win7用ubuntu9.04或更早(9.10需要参考一下,但是不要下载它的附件)的同学具体请看: 
vista 或 win7 下添加 grub4dos 启动项的简便方法(本法和软改 bios 有冲突,请慎用)此为9.04以及以下版本的。  
如果win7给您分了一个100MB的“隐藏”分区,请在我的电脑右键-管理-磁盘管理中给它分配一个盘符再打开那个盘,所有的要复制粘贴的就不再是在C:里完成,而是在这个分区,使用后可以把盘符删掉。  
Win7+ubuntu9.10的同学用本帖子的附件LDRs,用相似xp的方法。9.10使用修改过的grldr,现在就叫g2ldr吧。附件的LDRs里有下载,都是论坛资料。  引用: 
boot.ini实在不能用的话,就编辑bcd文件吧。  
把那些相应的文件拷到C:下,删掉上面的boot.ini,开始菜单,搜索cmd,用右键管理员模式打开:  
  1.在命令界面bcdedit /create /d “Ubuntu” /application bootsector 
        得到像c:\windows\system32>bcdedit /create /d “Ubuntu” /application bootsector//多启动菜单上显示的名字项{dbff544b-a7c4-11dd-a51d-00155803ebb4} 成功创建。   2.把{}中的id复制下来,如:dbff544b-a7c4-11dd-a51d-00155803ebb4 
  3.再输入下列命令 (注意:自己替换下面{}中的id为第2步得到的id,xxxxx为grldr或g2ldr)       bcdedit /set {id} device partition=c:       bcdedit /set {id} path \xxxxx.mbr       bcdedit /set {id} description “Ubuntu”       bcdedit /displayorder {id} /addlast   
以后删除用bcdedit /delete {id} /f     
——————————————————————————————————————————————  
附几个解释:  
引用: makeactive  
makeactive用来激活的主分区,现在的grub好像可以直接chainloader +1进入逻辑分区,但以前是需要激活的主分区的。对回复windows的引导,这是一个挺有用的命令。如果安装其他系统没有改变mbr,删除linux,但是windows却意外启动不了了,那很大可能就是windows的分区未被激活,用livecd的grub命令激活之即可。比如fedora系统会默认把自己的分区设为激活分区,霸道吧。  详见
http://forum.ubuntu.org.cn/viewtopic.php?f=139&t=214256http://forum.ubuntu.org.cn/viewtopic.php?f=139&p=1527805  
chainloader +1  
chainloader +1用来对makeactive所激活的主分区加以引导,同上:它只能引导主分区,所以通常是用来引导Windows系统,而linux系统可以安装在扩展分区上的逻辑分区,通常是使用kernel和initrd这种功能更为强大、灵活的引导方式;  
对于是否要makeactive,billbear说98后的系统就不需要makeactive了,即使是未激活的主分区也可以load。(未尝试)      
六、[附]grub4dos制作一个U盘版WinPE 引用: 
1、grldr放入U盘 
2、用前面讲的方式把grub4dos写入优盘MBR(看好了!) 3、编辑一个menu.lst,添加也可  代码: title PE root (hd0,0) chainloader /ldrxpe   
4、下载一个pe的iso,推荐laomaotao的。 
除了auturun.inf,SETUP文件夹,其他全拿出来放在U盘根目录下,把WXPE中的两个文件取出放到U盘根目录,SETUPLRD.bin改名ldrxpe。  
开机就可以用了

你可能感兴趣的:(学习)