操作系统版本:Ubuntu14.04.1和Windows7 sp1x64版
故障现象:
先安装Windows7 SP1 64位版,后使用U盘安装Ubuntu 14.04.1。Ubuntu安装成功后,可正常启动,而GRUB上选择Windows 7菜单项,无法启动到Win7界面,直接返回GRUB菜单界面。
故障分析:
安装Ubuntu的过程中经历分区步骤,如下图。在指定Boot Loader时并未选择默认的选项/dev/sda,而是选择/dev/sda1。因为硬盘的活动分区是第一个分区sda1。Windows7安装程序默认划分一个100MB的小分区用于存储启动文件。而划分的C盘则是硬盘上的第二个分区即sda2。此时如果将GRUB2的引导程序装在“/”所在分区,会造成Ubuntu无法启动,而本人又不想将GRUB2的引起程序装在硬盘的MBR上。因此选择将GRUB安装windows的启动分区Sda1上。
Ubuntu安装成功,重启选择windows7启动,结果悲剧出现。选择Windows 7启动菜单启动Windows,毫无反映几秒钟后返回GRUB启动菜单。
1.为了分析问题打开 Ubuntu 软件中心 安装软件“Inspect boot environment”也可直接搜索“boot-info-script”
2.打开终端,运行命令
sudo bootinfoscript |
3.默认输出结果到主文件夹中的RESULTS.txt,内容如下:
Boot Info Script 0.61 [1 April 2012] ====================== Boot Info Summary: ========================== => Windows is installed in the MBR of /dev/sda. sda1: __________________________________________________________________________ File system: ntfs Boot sector type: Grub2 (v1.99) Boot sector info: Grub2 (v1.99) is installed in the boot sector of sda1 and looks at sector 1886304656 of the same hard drive for core.img. core.img is at this location and looks in partition 112 for . No errors found in the Boot Parameter Block. Operating System: Boot files: /bootmgr /Boot/BCD sda2: __________________________________________________________________________ File system: ntfs Boot sector type: Windows Vista/7: NTFS Boot sector info: No errors found in the Boot Parameter Block. Operating System: Windows 7 Boot files: /Windows/System32/winload.exe sda3: __________________________________________________________________________ File system: ntfs Boot sector type: Windows Vista/7: NTFS Boot sector info: No errors found in the Boot Parameter Block. Operating System: Boot files: |
启动信息上看Windows的启动器安装在主硬盘MBR上,而启动文件安装在Sda1上。启动器为bootmgr。Boot sector type是GRUB,并不是NTLDR。Boot sectorinfo中也不是Windows启动器信息。由此可确定位于Sda1启动扇区上的Windows启动器已被GRUB所取代。因此,位于Sda1上的Windows启动器被破坏。
4.下面再看看GRUB启动脚本中的问题。进入/boot/grub目录,打开grub.cfg文件查看,下面显示的grub.cfg有关windows 7启动的部分。
323 ### BEGIN /etc/grub.d/30_os-prober ### 324 menuentry ‘Windows 7 (loader) (on /dev/sda1)‘ --class windows --class os $menuentry_id_option ‘osprober-chain-04EC18F4EC18E22A‘ { 325 insmod part_msdos 326 insmod ntfs 327 set root=‘hd0,msdos1‘ 328 if [ x$feature_platform_search_hint = xy ]; then 329 search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 04EC18F4EC18E22A 330 else 331 search --no-floppy --fs-uuid --set=root 04EC18F4EC18E22A 332 fi 333 parttool ${root} hidden- 334 chainloader +1 335 } 336 set timeout_style=menu 337 if [ "${timeout}" = 0 ]; then 338 set timeout=10 339 fi 340 ### END /etc/grub.d/30_os-prober ### |
配置文件中Windows启动部分,没有问题。如果硬盘上的Windows启动器没有被GRUB破坏,那么上面的配置完全可以正常工作。在这里特别要提到Chainloader的含义
chainloader +1 |
chainloader用于切换启动器,+1是指定启动器所在硬盘扇区块位置。334行里的chainloader+1语句的含义是启用在sda1的第一个块的启动器用于引导操作系统。此时sda1的第一个块已经被GRUB所占据,切换启动器的结果就是再启动一遍GRUB。因此当用户在GRUB中选择windows 7 loader后返回GRUB菜单就以为怪了。
处理步骤
Win 7的启动从MBR引导,第二步调用bootmgr,第三步调用winload.exe。最后由winload.exe完成win7系统的启动。Sda1里bootmgr文件保存良好,winload在系统文件夹中也未损坏。因此只要完成MBR到bootmgr的引导即可修复Windows启动。
1.修改grub.cfg配置文件,Ubuntu中需要使用管理员权限。打开终端,输入以下命令编辑配置文件:
sudo gedit /boot/grub/grub.cfg |
2.修改334行的chainloader+1语句,替换成ntldr/bootmgr
........以上省略 331 search --no-floppy --fs-uuid --set=root 04EC18F4EC18E22A 332 fi 333 parttool ${root} hidden- 334 ntldr /bootmgr 335 } .........以下省略 |
由ntldr命令完成MBR到bootmgr的引导。
3.保存配置文件,重新启动计算机。你将会看到熟悉的win7启动画面。