GT前段时间在WinXP的基础上安装了Win7,因为有双硬盘所以直接双系统各占一个硬盘的主分区。我个人经常乱用电脑做各种试验,所以把双系统装到双硬盘上也是未雨绸缪,两个硬盘各施其责互不影响。
不过因为安装Win7时是在WinXP下选择“保留较老版本OS的安装”,所以安好Win7之后发现WinXP被“劫持了”:具体表现就是WinXP被整合到了Win7的启动管理器里面,而一旦我把WinXP所在的硬盘设置为主硬盘,启动引导就会报错,无法脱离Win7的启管理器来独立启动WinXP。我的初衷就是想让两个硬盘可以独立工作的,于是决定查查这两个系统的启动方式,然后看看怎么把我的WinXP解救出来。
查了很多资料,事情总算有些眉目了,一下是我总结的一些要点。
--------------------------------------------------------------------------------------------------------------------------------------------------
一、引导扇区的代码格式
讲到系统引导首先要知道的就是磁盘的引导扇区。引导扇区通常就是指磁盘的第一个扇区,当系统从该磁盘启动,启动时首先读取的就是引导扇区里的数据。
然后就是Windows系列操作系统的一个分界线:Windows Vista之前的操作系统使用一种引导扇区代码,即nt52,Vista及Vista之后的产品使用另一种引导扇区代码,即nt60。
可能微软也意识到了我的这种需要,所以在微软的系统安装盘下的i386文件夹里现在有一个叫bootsect的小工具,用法也很简单,直接cmd目标bootsect.exe加命令参数/nt52或/nt60再加目标盘符,就把该盘的引导扇区代码改成指定格式了。
--------------------------------------------------------------------------------------------------------------------------------------------------
二、引导信息
说完引导扇区,那么nt52和nt60代码的引导究竟有什么不同呢?
从我非专业的角度来说,也没办法解释清楚代码的内在原理,只能说它们使用的引导信息不同。接下来就讲一下引导信息
--------------------------------------------------------------------------------------------------------------------------------------------------
nt52:以WinXP为代表,nt52使用一个ntldr文件来储存引导信息,而ntldr还要加载boot.ini中的启动信息和启动列表,所以WinXP的磁盘分区下会有一个隐藏的ntldr和boot.ini。关于boot.ini的编辑相信很多人都懂——因为它是可以用文本方式来编辑的,所以这里就不赘述了。
--------------------------------------------------------------------------------------------------------------------------------------------------
nt60:以Win7为例,nt60加载的是bcd(Boot Configuration Data)文件中的引导信息。不过bcd文件的内容隐藏得比较深,需要微软的工具——bcdedit.exe才能编辑。这个东西同样在i386下可以找到。
关于bcd文件,因为我也编辑过了,所以写写个人的理解。
--------------------------------------------------------------------------------------------------------------------------------------------------
bcd文件的接口:不知道这么抽象的东东怎么解释,姑且称之为接口吧,bcd文件中编辑好的一个启动项就是一个接口,总的来说bcd数据中的接口有三类,第一个就是启动管理器:标识符bootmgr,这个接口叫主接口,是必须在bcd中定义好的,用来载入系统盘下的bootmgr文件,bootmgr则可以连接第二类和第三类接口;这两类只有一点点不同:对于较早版本的Windows(即Vista之前的版本)要使用标识符ntldr(所以WinXP就被Win7劫持了);而后者的标识符则是创建时系统随机生成的。
说到标识符,要说明一下,在bcdedit中,列出bcd文件中的内容以后可以看到,每个启动项都有一些对应的属性,其中标识符就是一个:
BCD文件信息
-------------------------------------
主入口:Windows启动管理器
标识符:{bootmgr}
device:主入口bootmgr所在驱动器号
inherit:全局设置
-------------------------------------
老式入口:Vista以前版本Windows启动加载器
标识符:{ntldr}
device:引导文件ntldr所在驱动器号
path:引导程序路径
inherit:启动项设置
......
-------------------------------------
新式入口:Windows启动加载器
标识符:随机ID
device:引导文件ntldr所在驱动器号
path:引导程序路径
inherit:启动项设置
......
由此可知,bootmgr入口是必须有的,ntldr入口最多只有一个,而新式入口可以有多个。
--------------------------------------------------------------------------------------------------------------------------------------------------
然后是bcdedit一些常用的命令行参数
/?或/help是帮助信息,用来列出参数解释(其实有这个就够了,囧)
/creatstore <bcd file path> 创建空BCD文件
/store <bcd file path> 指定操作的对象bcd(没有指定前使用当前系统默认bcd文件,应该是吧?)
/export <bcd file pate> 备份当前操作对象bcd到path
/import <bcd file path> 还原path的bcd到当前操作对象
/enum 列出当前操作bcd文件中的信息
/v 列出当前操作bcd文件中的信息且标识符被显示为一个巨长的唯一编码
其他的,关于添加删除启动项,属性设置等,有兴趣的自己看去吧,哈哈哈
话说我发现Win7真正的引导程序是Windows/system32/winload.exe哎,真不明白为神马要搞这么复杂。。。
--------------------------------------------------------------------------------------------------------------------------------------------------
So,最后我把两个硬盘独立开的方法,(C盘WinXP,H盘Win7)先进Win7,用bootsect把C盘改成nt52,因为C盘原来的ntldr还保留着,所以这样设置好之后,只要C盘的磁盘优先级高,WinXP就可以直接从C盘启动而不用理H盘的bootmgr了。
然后,索性把WinXP从启动菜单里删掉,这样开机就不用显示启动项界面直接进Win7了,有了上面的基础这也很容易做到,用bcdedit把H盘下boot/bcd文件中的ntldr项删去:/delete /f {ntldr}
至此,两个硬盘的系统引导搞定,我的主板设了个快捷键F12直接调启动位置(但不影响bios设置中的优先级顺序),所以平时把经常使用的系统盘放在启动序列的前面,然后偶尔要用到另一个就F12选一下就OK了
--------------------------------------------------------------------------------------------------------------------------------------------------
二号硬盘剩下近百G的空间,考虑再装个linux内核的玩玩,so,现在研究一下linux的启动方式去……