我在一台主机上前后安装了3各操做系统,Windows 7,以及32位和64位的ubuntu 14.04。安装完64位ubuntu以后发现启动菜单变得很乱,因而进入Windows用一个叫EasyBCD的工具修改启动菜单。结果致使整个MBR里面没有启动项,重启以后任何系统都进不了了。html
个人解决方法是用以前制做的ubuntu系统的USB启动盘进入ubuntu试用系统,以便安装grub2 boot loader。grub boot loader的文档请参考官方资料linux
首先查看各物理硬盘及其分区:git
Shellubuntu
ubuntu@ubuntu:~$ sudo fdisk -l
Shell挂载要安装grub2的分区:windows
ubuntu@ubuntu:~$ sudo mount /dev/sda6 /mnt # /dev/sda6是我安装32位ubuntu的分区,前面fdisk命令的输出结果中能够看到这个分区的信息
Shell安装grub菜单bash
ubuntu@ubuntu:~$ sudo grub-install --boot-dir=/mnt /dev/sda # --boot-dir设置为/mnt/boot,是说将将grub相关的信息如镜像文件存放在这个路径的grub子目录下。效果至关于登陆32位ubuntu系统,而后执行`sudo grub-install /dev/sda` # /dev/sda 指定将grub安装在这个物理硬盘上
接下来我直接重启进入grub boot loader。不过我看到的grub是命令行方式的。接下类能够经过命令来进入安装在硬盘上的各系统:工具
grub> ls -l # 这里会列出各硬盘和分区 grub> set root=(hd0,msdos6) # 输入到hd的时候按tab键,会列出链接的全部硬盘,我列出了hd0和hd1分别是一块硬盘和一个u盘 # 输入到逗号(,)的时候按tab键,会列出硬盘上的全部分区,输出结果和前面的`ls -l`命令一致。网上不少资料这里都是直接用数字表示各分区,但我这边列出的是msdos加数字的形式。msdos6是我安装32位ubuntu系统的分区。 grub> linux /boot/vmlinuz-3.13.0-40-generic root=/dev/sda6 # 输入/boot/vmlinuz以后按tab键,会列出几个版本的文件好比vmlinuz-3.13.0-32-generic,vmlinuz-3.13.0-40-generic。我也不知道有什么区别,选了一个版本号最大的。 # root=/dev/sda6没有tab键自动补全,我是根据32位ubuntu系统在第6分区来填写的 grub> initrd /boot/initrd.img-3.13.0-40-generic # 跟前面linux命令相似这里的initrd.img也会有几个版本,我选择了与前面一致的版本 grub> boot # 执行这条命令开始启动操做系统
64 ubuntuspa
grub> ls -l # 这里会列出各硬盘和分区 grub> set root=(hd0,msdos6) # 输入到hd的时候按tab键,会列出链接的全部硬盘,我列出了hd0和hd1分别是一块硬盘和一个u盘 # 输入到逗号(,)的时候按tab键,会列出硬盘上的全部分区,输出结果和前面的`ls -l`命令一致。网上不少资料这里都是直接用数字表示各分区,但我这边列出的是msdos加数字的形式。msdos6是我安装32位ubuntu系统的分区。 grub> linux /boot/vmlinuz-3.13.0-40-generic root=/dev/sda7 # 输入/boot/vmlinuz以后按tab键,会列出几个版本的文件好比vmlinuz-3.13.0-32-generic,vmlinuz-3.13.0-40-generic。我也不知道有什么区别,选了一个版本号最大的。 # root=/dev/sda6没有tab键自动补全,我是根据32位ubuntu系统在第6分区来填写的 grub> initrd /boot/initrd.img-3.13.0-40-generic # 跟前面linux命令相似这里的initrd.img也会有几个版本,我选择了与前面一致的版本 grub> boot # 执行这条命令开始启动操做系统安装在sda7分区上的64位ubuntu系统也能够经过相似的方式启动
grub> set root=(hd0,msdos1) # 个人硬盘的第一分区在windows系统里面显示的是“系统保留”,大小为100M,安装windows系统的分区是msdos2。注意这里指定的是“系统保留”分区,而不是安装windows的分区 grub> chainloader +1 grub> boot
==============关于BIOS、 boot loader、MBR的知识碎片,待整理=================操作系统
PC开启的时候,先会运行BIOS。BIOS能够根据优先级启动各类设备(U盘,硬盘,光驱)中的一个,优先级能够在BIOS(开机的时候按DEL或者F12键进入)中进行设置。BIOS启动某一个设备的时候,执行该设备MBR(Master Boot Record)里面的boot loader。命令行
MBR是一个512字节的block,位于存储设备的第一个sector,MBR中存储了分区表和boot code(boot loader)。MBR以后,才是该设备的各分区。在MBR的512字节中,boot code占了446字节,4个主分区记录各占16字节,还有两个字节是MBR signature。
boot loader的做用是选择并加载操做系统内核,而后将控制权交给操做系统。每一个操做系统都会带一个能够加载该系统的boot loader,有些boot loader能够启动多种操做系统。
Window系统中,XP及更早的版本使用NTLDR boot loader,Windows Vista及以后的系统使用BOOTMGR。linux系统有更多支持的boot loader,包括ISOLINUX,LILO,GRUB。
前面说过,MBR中只有4个主分区记录,这就是为何存储设备(好比硬盘)分区的时候只能有4个主分区的缘由。若是分区的时候,建立3个主分区和一个扩展分区(extended partition, logitical partition),那么MBR中的最后一个主分区记录其实是一个分区表(扩展分区表)。扩展分区表存储各逻辑分区(logical volumes)的信息。
一个存储设备除了有MBR以外,每一个分区(主分区或者逻辑分区)都有本身的boot sector,叫作volumne boot record(VBR)。因为MBR中的boot loader可能不知道如何加载一个操做系统的内核,所以它须要经过VRB中的boot loader来加载这个操做系统,好比GRUB不懂如何(直接)加载Windows系统,就得先加载Windows自身的boot loader(好比BOOTMGR),而后由BOOTMGR负责加载Windows系统。这个过程就是所谓的chain-loader。
GRUB Boot loader –> Windows Boot loader –> Load Windows Kernel
Windows的boot loader只能加载主分区的Windows操做系统,所以Windows必须得安装在主分区,不然windows boot loader没法启动Windows;GRUB能够加载主分区和逻辑分区的多种操做系统,包括直接加载linux系统,经过chain-loader加载Windows系统。接下来咱们重点说一下GRUB2。
不少linux系统自己集成(安装)了GRUB2,这里说安装是指在操做系统中安装了相关的软件包,但操做系统安装过程当中通常容许你选择是否须要将GRUB写入到MBR中。系统中安装的软件包提供了一系列命令行工具,用于检测硬盘中的各操做系统,生成启动菜单,更新MBR中的boot loader,更新VBR中的boot loader。这些命令会用到的一些相关文件包括:
如下是一些GRUB命令的说明:
mk-config -o /boot/grub/grub.cfg
,也就是说将生成的文件直接存放在/boot/grub文件夹中,下次启动的时候就能看到效果。以上说的是GRUB2,前面说过,GRUB2可以可以加载包括逻辑分区在内的任意分区里的操做系统。不过它chain-loader加载Windows系统的时候可能会出现橙色屏幕的状况。
另外一种选择是在MBR中经过EasyBCD写入Windows boot loader。EasyBCD操做界面以下:
在个人Windows 7系统中,EasyBCD的boot loader会安装在硬盘第一个分区(100M的系统保留分区,应该是安装Windows 7的时候建立的),”Add New Entry”及”Edit Boot Menu”里面所作的改动直接生效(固然,”Edit Boot Menu”里面还得点击”Save Settings”按钮)。若是MBR中是Windows boot loader,那么直接在第一个启动菜单就能看到;若是MBR中是其余boot loader(好比GRUB2),那么选择启动Windows以后,chain-loader会加载EasyBCD在100M系统保留分区的启动boot loader。
若是也须要将boot loader写入到MBR中,只需在”BCD Deployment”中,选择”Install the Windows Vista/7 bootloader to the MBR”并点击”Write MBR”。这一步骤只须要作一次,之后Add New Entry,Edit Boot Menu的修改直接生效。若是使用EasyBCD以前MBR中原本就是Windows bootloader,连这一步骤都不须要作了。
针对EasyBCD,个人理解是,不管是MBR仍是VBR(100M系统保留分区)中的boot loader,都只是boot loader的一小部分,剩下的boot loader代码以及配置就是EasyBCD中”Add New Entry”及”Edit Boot Menu”修改的部分。