1、引言
对于在一个硬盘上安装多操作系统而言,经常面临的一个问题就是当重新安装了Windows后,引导分区将会被Windows覆盖掉。无论是安装Linux还是FreeBSD,当重新安装Windows时,都会遇到这个问题。作者就在自己的机器上安装了双系统:Windows XP和FreeBSD 6.1。最近由于Windows出现被病毒感染的症状,因此作者一怒之下将Windows重装了,这下,世界彻底清净了。但同时,也就无法启动FreeBSD了。作者通过阅读网络上的相关文章,采用一种与通常的方式稍微不同的办法来解决了这个问题。
2、通常采用的方法
作者在网上查找了相关的资料,发现大多数都是通过修改Windows的C:\boot.ini来实现NTLDR(Windows的引导程序)的多系统引导。这种解决方式的做法如下:
1、 首先用FreeBSD的引导光盘(或软盘)启动FreeBSD,进入Fixit控制台;
2、 通过mount_msdosfs命令挂载Windows系统所在的分区,通常是C:\,其在FreeBSD下的设备通常对应的是/dev/ad0s1。因此挂载(mount)命令如下:
mount_msdosfs /dev/ad0s1 /mnt
3、 通过dd命令将FreeBSD的引导扇区的内容转储到一个文件中,通常FreeBSD的根文件系统位于/dev/ad0s3a上----至少在作者的机器上是这样的。这里将转储的输出文件命名为bootsect.bsd,同时这个文件应该位于Windows的C:\下,故具体的命令如下:
dd bs=512 count=1 if=/dev/ad0s3 of=/mnt/bootsect.bsd
4、 然后取出FreeBSD的引导光盘,启动Windows,修改C:\bootsect.bsd文件,在其末尾添加下面一行:
c:\bootsect.bsd=”FreeBSD 6.1”
实际上,等号后面的字符串是NTLDR显示操作系统列表的时候的字符串,因此可以写成任何你喜欢的值----你甚至可以用你的宠物的名字来命名,比如RedDaemon(假设这是你养的一只猫的名字)。
5、 然后,再次启动Windows的时候,就会出现一个让用户选择启动哪个操作系统的提示,就好像Windows安全模式下那样。
以上就是作者在网上找到的被说明得最多的方法。然后作者试过之后,发现这种方法不能在作者的机器上工作。具体的原因并不清楚,于是作者试图寻找另外一种做法。
3、作者采用的方法
实际上,在FreeBSD中有这样一个工具:boot0cfg,其man手册说这是一个boot managerinstallation/configuration utility,通过这个工具可以修改硬盘的MBR(也就是引导扇区)。这不就是我们所需要的么?作者仔细阅读了boot0cfg的man手册,详细了解了其各项参数的意义。最后给出了本文将要说明的这种修复MBR的方案:
1、 通过FreeBSD引导光盘启动FreeBSD的Fixit控制台,在这个控制台下可以使用各种系统工具----这些系统工具都位于引导光盘上,而引导光盘则被自动挂载到了/mnt2上,使用者也不需要修改PATH环境变量,因为PATH环境变量也被自动地做了修改,使得不用给出绝对路径就可以使用各种系统工具,这其中自然也包括boot0cfg。
2、 通过下列命令修复MBR(也即硬盘的引导扇区),关于boot0cfg的这几个命令行选项,这里仅做简要说明,感兴趣的读者请参考[1]。以下命令需要root权限(这句是废话,通过Fixit控制台进入系统自然就是root用户):
boot0cfg -B -v -o noupdate -t 185 ad0
简要的说明一下:
-B选项:指明要在硬盘上安装引导程序
-v选项:给出详细信息
-o noupdate选项:避免在某些平台上出现问题(这些平台带有反病毒硬件,不允许修改MBR)
-t 185选项:启动时暂停10秒(近似值),以允许用户选择要启动的系统
本来,像上面这样用一个boot0cfg命令将MBR修复了工作也就完成了。但是在作者的系统上还遇到了下面这样一个问题:内核启动之后,要求手动加载/dev/ad0s4a根文件系统。但是却无法加载----内核被锁住了。经过一番搏斗之后,作者发现了问题的所在:原来,在重新安装Windows的时候格式化了原来的C盘,这导致分区标号(label)发生了变化。原来的根文件系统是在/dev/ad0s4a上的,但是现在却不在这个分区上了,而变成位于/dev/ad0s3a上了。作者是通过在Fixit控制台下面使用fdisk命令发现这一变化的。知道了这一点之后,事情就很好解决了。因为我们知道FreeBSD要加载的文件系统是在/etc/fstab中指定的。因此只需要把这个文件中的所有/dev/ad0s4*改成/dev/ad0s3*就可以了(这里*表示下列字符之一:a、b、d、e、f,没有c,因为/dev/ad0s*c通常被交换分区占用了)。具体说来,作者采用的详细步骤如下:
1、 通过FreeBSD引导光盘(或软盘)启动FreeBSD;
2、 进入Fixit控制台;
3、 通过下列命令挂载FreeBSD的根文件系统:
mount /dev/ad0s3a /mnt
4、 切换当前目录到/mnt/etc下:
cd /mnt/etc
5、 通过vi编辑器修改fstab文件(不能使用vim),修改的方式如上所述:
vi fstab
这样,就可以正常地启动FreeBSD了。就好像什么都没有发生过一样----尽管实际上有些地方已经变化了。
4、结论
在作者采用的这种解决方案中,修复文件系统表/etc/fstab实际上与修复MBR是没有关系的。即便是采用第一种修改方式能够启动FreeBSD内核,也必须修复文件系统表/etc/fstab。因此,比较而言,真正的工作完全是通过boot0cfg来完成的,只需一个命令就可以了。而通常采用的修改Windows下的boot.ini的方法则要麻烦一些。
最后,两种方法更改的内容也不相同,第一种方法修改的并不是MBR(引导扇区),而是修改的NTLDR(也许可以把它称作Windows的bootloader)的配置文件boot.ini,在硬盘的引导扇区中存在的仍然是Windows的引导程序。作者采用的方法则直接修改了硬盘的MBR。