Total Pageviews

Thursday, 22 August 2013

有关多系统的引导构建与修复(涉及GRUB,NTLDR,BOOTMGR以及SBM)

本文的目的是以我的电脑为案例,简要的说明一下系统启动过程,并介绍几个启动工具。
本文的预期阅读对象是:多系统用户(涉及多重引导)、老旧电脑用户(BIOS不支持优盘或者光驱启动)


开机原理:
1、开机电脑从BIOS开始,进行硬件扫描,如果没有问题,将默认使用BIOS中定义的第一引导设备(一般为第一块硬盘)引导系统。
2、对于每一个引导媒介,其引导信息位于其存储空间的第一个Block,即前512字节。
3、在安装操作系统时,为了兼容可能发生的多系统并存,操作系统通常会将引导信息同时写在引导设备的前512字节和系统分区的前512字节。
4、因此MBR通常指向最后一个安装的操作系统所在的分区,并引导电脑加载该分区的Bootloader。
5、Bootloader可以引导电脑加载操作系统核心并启动操作系统,或者将引导任务转交给其他的Bootloader。
*6、另外MBR的最后64字节与引导无关,是磁盘的分区表。

我的电脑本来是三个系统,Windows XP, Windows 7以及Ubuntu。
最先安装的WinXP到/dev/sda1,然后MBR就指向/dev/sda1,而/dev/sda1的前512字节内容则指导电脑加载NTLDR也就是Windows XP的Bootloader。
然后安装的Win7到/dev/sda2MBR仍然指向/dev/sda1,而/dev/sda1的前512字节的功能变成了指导电脑加载BOOTMGR也就是Windows 7的Bootloader。
最后安装的Ubuntu到/dev/sda5MBR指向/dev/sda5,而/dev/sda5的前512字节的内容指导电脑加载GRUB 2也就是Ubuntu的Bootloader。

另外/dev/sda3被作为数据盘用来交换数据,没有安装任何操作系统。
另外/dev/sda4是扩展分区,内建两个逻辑分区/dev/sda5和/dev/sda6,作为Linux系统的根分区和swap分区。

三个系统和平的共存着,直到今天。
今天我突然意识到,我的WinXP,当初作为万一有Win7不兼容的程序的后备系统,在最近一年之中根本没有用到。
而在可预期的未来也不会再用Windows XP这样老的操作系统了,因此我准备把Windows XP完全卸载掉,腾出一个分区用。


然而我意识到,/dev/sda1作为硬盘的第一个分区,格式化第一个分区可能导致MBR改变从而开机无法进入GRUB,进而无法进入任何一个系统。
即 使格式化第一个分区没有影响到MBR中的引导信息,除了Windows XP之外,Windows 7的引导文件也在/dev/sda1上(先安装WinXP再安装Win7一般就会这样),所以假设GRUB可以正常启动,可以正常引导Linux系统,却 无法进入Win7,因为承载BOOTMGR的分区被我格式化了。

因此我必须保证以下几点:
1、将Win 7的核心引导文件BOOTMGR以及BOOT目录迁移到/dev/sda2
2、保证GRUB在/dev/sda1格式化后可以正常加载
3、修改系统的Bootloader从而让Ubuntu和Win7能够和平共存并且具有鲁棒性,方便以后安装系统。


所以以下是操作步骤:
1、启动到Win7,把/dev/sda1根目录中的bootmgr以及Boot文件夹复制到/dev/sda2也就是Win7系统的根目录。
2、启动到Ubuntu,将/dev/sda1格式化,将/dev/sda1去掉boot标志,将/dev/sda2加上boot标志位。
3、不要关机,趁现在还在Linux下,重新安装Grub到/dev/sda,方法是


  1. sudo grub-install --no-floppy /dev/sda
  2. sudo update-grub

以上两行命令的作用分别是:
安装Grub引导管理器,并向MBR写入引导信息
更新Grub操作系统选单。

4、准备一张Windows7系统盘,放进光驱,重启计算机,选择从光盘启动。进入Windows7安装向导,选择修复计算机。
5、取消安装向导可能提示你进行的自动修复,进入命令提示符进行手动修复,执行以下命令:

  1. bootrec /scanos
  2. bootrec /fixboot
  3. bootrec /rebuildbcd

以上三行命令的作用分别是:
扫描磁盘寻找已安装的Windows系统,
将引导信息写入系统分区的前512字节(而非MBR),
重新构建系统选单,防止BOOTMGR找不到Windows系统。
注意到我并没有使用bootrec /fixmbr命令,因为如果那样的话Grub写入MBR的引导信息会被覆盖。
6、关闭命令提示符,重启计算机并取出光盘,从硬盘启动电脑。
现在你的电脑开机,读取MBR会引导计算机从/dev/sda5启动,并加载位于/dev/sda5的GRUB也就是Ubuntu使用的Bootloader,
然后你可以选择启动Linux系统或者将引导任务转交给/dev/sda2,并加载位于/dev/sda2的BOOTMGR也就是Windows7使用的Bootloader。


那么,目前存在一个小小的缺憾是:
GRUB Bootloader可以将引导任务转交给BOOTMGR,然而BOOTMGR却不能将引导任务交还给GRUB。
所以进阶教程主要研究如何尽量在不更改主硬盘MBR的前提下让Bootloader可以互相转交引导任务,以及介绍更多引导工具。
我选择的是GRUB4DOS,因为他太简单了!完全无需更改MBR。

操作步骤:
1:下载Grub4dos,从中解压缩出来三个文件,grldrgrldr.mbr,以及menu.lst,并将它们放进Windows系统根目录。
严 格来说,menu.lst是需要修改一下以适应不同的电脑,不过其初始menu.lst已经写的很不错了,可以寻找并加载磁盘上的Windows系统或者 使用Grub Legacy的任何Linux系统,但默认不支持引导使用Grub 2的Linux系统。所以如果你是新手你可以不管menu.lst,老手的话可以自行修改。

2(对Win7用户):
Win7系统其实已经不再使用boot.ini文件了,不过仍然兼容它,所以在Win7系统根目录建立一个boot.ini文件,并写入如下内容

  1. [boot loader] 
  2. timeout=10
  3. [operating systems]
  4. C:\grldr.mbr="START GRUB4DOS"

保存退出。

2(对WinXP用户或Win7/XP并存用户):
你的WinXP系统根目录下应该已经存在boot.ini文件,如果没找到,请开启系统文件、隐藏文件的显示。
更改boot.ini的属性,取消勾选只读属性,打开该文件,先将timeout的值修改为0以上的数字,例如5。然后再文件最后追加一行:

  1. C:\grldr.mbr="START GRUB4DOS"
保存后不要忘记更改boot.ini的属性,重新勾选其只读属性。


3:重新启动计算机,你可以看到在Windows系统的引导界面,多出了一个叫做START GRUB4DOS的操作系统,选择他就可以进入GRUB4DOS引导了。
GRUB4DOS默认可以寻找并启动电脑上的Windows系统,寻找并启动电脑上使用Grub Legacy的Linux系统,或者选择从软盘启动。
我对Grub4dos的配置文件进行了小小的修改,让他可以从第一块硬盘启动,这样我又可以回到GRUB 2引导管理器了。
只需在menu.lst中新增下面几行:

  1. title Boot from First HDD
  2. chainloader (hd0)+1
  3. rootnoverify (hd0)


到这里其实已经很完善了,你的电脑的多个Bootloader将可以互相转交引导任务,对大多数人其实已经完美了。然而……
接下来所要讲的是老旧电脑的支持。

有些同学家里可能有2000年左右的电脑,他们往往已经支持USB设备了,但其BIOS不支持USB启动,除硬盘外,仅支持软盘或光盘启动。
或者还有更老的电脑,除硬盘外,他们仅仅支持软盘引导启动,连光盘都不支持。

可是你又希望能够给这样的电脑安装一个像样的操作系统,不是吗?
于是这时候就需要祭出引导大杀器了,这是国人写的不到30K的软件哦:Smart Boot Manager,简称SBM。
你可以去其官网下载,或者最新版的Ubuntu 12.04系统盘中的install文件夹中就有sbm.bin。

SBM最牛X的特点在于:
1、大小不足30KB,可以轻松的放进一张软盘
2、可以选择从你能想到的各种设备引导计算机开机
3、可以将引导任务转交给多种设备。例如转交给优盘启动,即使你的电脑BIOS本来不支持从优盘启动


不过这里声明SBM本身并不是Bootloader,他更像一个加强版的BIOS,可以让你选择更多的引导启动设备而不受BIOS的限制

在这里介绍SBM的两种用法:
1、用dd直接烧到软盘里用
2、用Grub的映射功能,将硬盘上的sbm.bin软盘镜像映射成软盘,然后启动SBM

两种办法都很简单,不过第一个要求你必须有真的软盘。
第二个的话Grub4dos默认的系统选单就有,只要你把sbm.bin与grldr放在同一个目录下就可以

这下你可以强制BIOS中不支持光盘启动或者优盘启动的计算机,从光盘或者优盘引导启动了。
(但前提是你的系统还是支持光盘或者软盘设备的,就是说你在操作系统中无需安装额外的驱动就可以使用)
最终,我的电脑里的几个Bootloader加上SBM的关系是这样的(为了简单起见,因为MBR直接指向/dev/sda5所以没有画出来): 

全文完。

哈哈说了这么多,我终于可以在那个老旧、光驱已经坏了的Thinkpad R30上安装一个像样的操作系统了!
注:Thinkpad R30支持内建光驱、内建硬盘启动,以及USB-FDD启动,不支持USB-HDD启动,因此无法用常规的方法优盘安装系统。
注:其实以我家的网速,我是准备直接从互联网给Thinkpad R30安装Debian的,使用SBM其实是PLAN B。