1 背景
之前安装过Win7和Ubuntu的双系统,安装的过程是先安装Win7,然后安装Ubuntu,在安装Ubuntu时将GRUB引导程序安装在硬盘的主引导扇区中。按这样的安装顺序是因为Windows系统的引导程序无法自动检索Ubuntu系统的引导程序,而且安装Win7系统时,默认会将Windows系统的引导程序安装在硬盘的主引导扇区,这样就会造成无法进入Ubuntu系统。
将GRUB引导程序安装在主引导扇区固然方便,但是每当我们 要重新安装Windows系统时,就要重新安装Ubuntu系统或者GRUB引导程序。通过网上的一些资料,知道可以修改Win7系统的引导文件来引导Ubuntu系统,这样每次要重装Win7系统时只要再修改一些Win7系统的引导文件即可正确引导已安装的Ubuntu系统。过去的两天重装系统就打算用这种方式,然而折腾了一天一夜,最终还是没有成功。下面是我重装系统时做的一些功课,以及我的失败情况。
2 主引导记录
2.1 主引导记录MBR
参考资料:主引导记录 - 维基百科
主引导记录(Master Boot Record,MBR),又称为主引导扇区,是计算机硬盘的第一个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。主引导记录记录着硬盘本身的相关信息以及硬盘各个分区的大小以及位置信息。
主引导记录的组成包括:启动代码、硬盘分区表和魔数(0x55AA,表示主引导扇区的结束)。启动代码占据主引导扇区的前446个字节,其中的硬盘引导程序的主要作用是检查分区表是否正确并且在硬件完成自检以后将控制权交给硬盘上的引导程序。硬盘分区表占据主引导扇区的64个字节(偏移01BEH—偏移01FDH),可以对四个分区的信息进行描述,其中每个分区的信息占据16个字节。具体每个字节的定义可以参考下面的硬盘分区结构信息。
偏移 |
长度(字节) |
意见 |
00H |
1 |
分区状态:00Hà非活动分区;80Hà活动分区;其他数据没有意义 |
01H |
1 |
分区起始磁头号(HEAD),用8位 |
02H |
2 |
分区起始扇区号(SECTOR),占据02H的位0-5;该分区的起始磁柱号(CYLINDER),占据02H的位6-7和03H的全部8位 |
04H |
1 |
文件系统标志位 |
05H |
1 |
分区结束磁头号(HEAD),用8位 |
06H |
2 |
分区结束扇区号(SECTOR),占据06H的位0-5;该分区的结束磁柱号(CYLINDER),占据06H的位6-7和07H的全部8位 |
08H |
4 |
分区起始相对扇区号 |
0CH |
4 |
分区总的扇区数 |
2.2 引导程序读取流程
当系统开机或重启时,
- BIOS加电自检(Power On self Test – POST)。BIOS执行的内存地址为FFFF:0000H处的跳转指令,跳转到固化在ROM中的自检程序处,对系统硬件(包括内存)进行检查。
- 读取主引导记录。当BIOS检查到硬件正常并与CMOS中的设置相符后,按照CMOS中对启动设备的设置顺序检测可用的启动设备。BIOS将相应启动设备的第一个扇区(即主引导扇区)读入内存地址为0000:7C00H处。
- 检查0000:7DFEH-0000:7DFFH(MBR的结束标志位)是否等于55AAH,若不等于则转去尝试其他启动设备,如果没有启动设备满足要求则显示“NO ROM BASIC”,然后死机。
- 当检测到有启动设备满足要求后,BIOS将控制权交给相应启动设备。启动设备的MBR将自己复制到0000:0600H处,然后继续执行。
- 根据MBR中的引导代码启动相应分区的引导程序。
3 Win7引导过程基本知识
Xp系统的引导文件是boot.ini。如果存在多个系统,那么需要在该文件中进行设置。当MBR的引导代码启动xp系统所在分区的引导程序后,将读取boot.ini文件来显示启动选项。在Win7系统中没有了boot.ini文件,而是通过bootmgr和BCD(Boot Configuration Data,启动配置数据)来进行引导配置。
3.1 Win7引导过程
MBR的引导代码启动Win7系统所在活动分区的引导程序后,引导程序将通过bootmgr来寻找并读取BCD,如果有多个启动选项,则将其显示,由用户进行选择。启动Win7时会加载C:\windows\system32\winload.exe,并开始加载内核。
3.2 BcdEdit基本知识
BcdEdit时一个管理BCD存储的命令行工具。它有多种功能,包括创建新存储、修改现有存储以及添加启动菜单选项等(注:需要管理权限才能使用BCDEdit修改BCD)。该工具与Win7分发一起包含在%WINDIR%\System32文件夹中。
BcdEdit的命令行格式为:BcdEdit /command [Argument1] [Argument2] …
表格 1 常用的BcdEdit命令行选项
选项 |
描述 |
/? |
显示BcdEdit命令列表。 |
/createstore |
新建一个空的启动配置数据存储。创建的存储不是系统存储。 |
/export |
将系统存储的内容导出到文件。仅对系统存储有效。 |
/import |
将某存储导入系统存储,之前的系统存储内容将删除。 |
/store |
指定特定的存储。未指定是对系统存储进行操作。 |
/copy |
复制同一系统存储中指定的启动选项。 |
/create |
在启动配置数据存储中创建一个新的空项。 |
/delete |
删除指定项。 |
/deletevalue |
删除启动项中指定的元素。 |
/set |
设置一个项的选项值。 |
/enum |
列出存储中的项。 |
/default |
指定在超时到期时启动管理器选择的默认项。 |
/displayorder |
指定向用户显示启动选项时启动管理器使用的显示顺序,有两个值/addfirst和/addlast。 |
/timeout |
指定在启动管理器选择默认项之前要等待的时间,以秒为单位。 |
4 解决方案
下面是我在网上找的一个修改Win7启动配置文件来引导Win7和Ubuntu双系统的一个解决方案。
1. 以管理员身份启动命令提示符。
2. 使用bcdedit配置新引导项。
>bcdedit /create /d “Ubuntu” /application osloader
新建引导项,成功后返回一个GUID值,格式为{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}该GUID值用于唯一标识该引导项。
>bcdedit /set {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} device partition=c:
设置新引导项的引导文件所在分区。
>bcdedit /set {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} path \linux.bin
设置启动项的启动文件在分区中的相对路径,注意文件之前的“\”时必须的,表明是在所在分区的根目录下。
>bcdedit /displayorder {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} /addlast
设置引导项顺序,addlast为将其添加到引导项列表的最后。
3. 制作Ubuntu系统的引导文件linux.bin。
通过LiveCD进入Ubuntu系统,通过命令fdisk查看各个分区信息,将Win7系统所在分区(假设为sda2)挂载在/mnt/dos目录下(挂载命令为mount /dev/sda2 /mnt/dos),然后将我们所安装的Ubuntu系统所在的分区(假设为sda3)的第一个扇区的内容保存为一个文件linux.bin(命令为dd if=/dev/sda3 of=/mnt/dos/linux.bin bs=512 count=1)。
4. 进入Win7系统,将linux.bin文件放在c盘根目录下,然后重启系统可以看到Win7和Ubuntu两个系统的启动选项进行选择了。
5 失败
折腾了一天一夜,将Ubuntu装了7、8次,一直出现下面的两个错误,
错误1:无法将Ubuntu系统的引导程序GRUB安装在挂载了”/”目录的ext2分区中。
错误2:将GRUB装在U盘中,按照上面方案制作Ubuntu的引导文件linux.bin,并修改Win7的引导文件,还是无法加载Ubuntu。
最后只好将GRUB引导程序安装到MBR中了。
(注:希望各位大神,多多给点建议,谢谢!)