grub,mbr的那些事
今天遇到一个问题是:双系统为win10和Ubuntu。启动模式为mbr,当前可以启动win10,但不能启动Ubuntu。先利用easybcd重新添加了一个,想着依旧用win10的启动项,(此处可以参考http://jingyan.baidu.com/article/84b4f565df60ce60f6da32ca.html,写的很全面)但是这个方法失败了,失败原因是:加载分区不对,应该是msdos7,但是无论easybcd如何修改,都不行,始终是msdos6。此处猜测有原因是easybcd修改的是区分表信息,而不是mbr的信息。所以接下来就是另一个思路:利用GRUB RESCUE,进入到ubuntu,然后直接修改grub,然后利用grub方法启动。参考下面两篇文章
第一篇我们主要学习grub rescue下如何进入到ubuntu系统:http://blog.csdn.net/zyf837368104/article/details/7627065
我们遇到引导问题的原因可能有
1. 删除Linux,直接在win下删了该分区
2. 调整磁盘,利用工具合并,删除,分割分区导致磁盘分区数目变化
3. 重新安装系统,把Linux下安到新分区,原分区格式化,但没有重装grub2
……
总归,是由于操作者不知道grub2分为两部分,一部分(一般情况下)写在了mbr上,另一部分写在了某个分区的/boot/grub目录(如果/boot单独分区,则直接写在对应分区的/grub目录)里面。由于上述操作,致使grub2的mbr里面的那一部分找不到/grub目录里面的那一部分了(或者那一部分已经删除了)。
现在我们进不了系统,抱着不重装系统的心理继续。
我们开机可能出现了过
1. grub>
2. grub rescue>
下面分别介绍两种修复方法
1. 如果遇到的是grub>
如果你先装win,然后再装Linux的话,误删了启动文件或者删除了Linux,引导程序就不能读出系统所在的位置,导致出现grub命令提示。这时候可以手动启动比如我的win7在c盘,输入如下3个命令就可以了
1. rootnoverify (hd0,0)
设为根分区/root设备,但不加载文件系统。(hd0,0)表示第几个硬盘的第几个分区
2. chainloader +1
将启动引导权转交给当前分区的首扇区
3. boot
已经成功了一大半,终于可以进去win了! 不过这样的话,但每次开机你都要输入,我们就要修复一下主引导扇区MBR(硬盘的第一个扇区),一个扇区是512个字节,前面446个字节用于引导程序,接下来64个字节用于存放分区信息,最后2个字节为结束标记。修复的方法很多,xp下可以用个工具 clsmbr.exe(CSDN下载有售),运行一下就可以了,win7这个小工具不能用,不兼容,不过不要紧,我们如果有win7的iso的话,可以从安装包中拷贝bootsect.exe(在boot这个文件夹里)这个文件,然后在cmd中输入 bootsect /nt60 SYS /mbr 就可以了。
然后大功告成。
2.如果遇到的是grub rescue>
遇到这种情况的原因可能有
这个情况下命令比上种情况少,不过不要紧
方法如下:
1.grub rescue>ls
//回车,列出本机所有磁盘及分区,如:hd0,(hd0,1),(hd0,7),(hd0,8),(hd0,9)等,我的机器上显示的是(hd0,msdos8)
2.然后查看到底是那个盘是grub的启动盘,做如下测试,若出现该目录下的文件列表,则成;若出现"unknow filesystem"则表示不成功,继续试探!
ls (hd0,X)/boot/grub X代表ls里出现的盘号,如果出现一大堆的文件,拓展名为.mod,.list等,记住这个盘的盘号(这里是/boot适用于木有单独分区,单独分区可以同理)
3)grub rescue>set root=(hd0,msdos8) //括号里为上一步尝试成功的分区,例如msdos8
grubrescue>set prefix=(hd0,msdos8)/boot/grub
grub rescue>insmod normal //每个命令输入后按回车,">"是提示符!!!
然后应该就退出grub rescue模式了
4)) grub> normal //这样就进入到grub界面下了
很好,我们终于回到Linux了
进入Linux系统之后,还没完呢,在命令行输入以下命令即可!
sudo update-grub
然后输入
sudo grub-install /dev/sda //你的启动盘
这样就解决了,Win与Linux都可以启动了
第二篇主要参考点为挂载分区。mount指令。http://blog.chinaunix.net/uid-26696487-id-3546862.html
用Ubuntu的安装CD,也就是Live CD从光驱启动,打开一个终端窗口,在里面输入如下命令:
1、sudo -i (获得超级用户权限)
2、执行fdisk -l,从列表中找到你安装的Ubuntu系统的根目录分区号
我的系统分区是如下面这样的,一般ID为83的即是ubuntu系统的根目录,如果出现两个83的,应该是/boot目录独立分区了,其中,容量较小的为/boot目录,容量较大的为根目录
Device Boot Start End Blocks Id System /dev/sda1 * 2048 206847 102400 7 HPFS/NTFS/exFAT /dev/sda2 206848 116611071 58202112 7 HPFS/NTFS/exFAT /dev/sda3 116611072 431183871 157286400 7 HPFS/NTFS/exFAT /dev/sda4 431185918 976771071 272792577 f W95 Ext'd (LBA) Partition 4 does not start on physical sector boundary. /dev/sda5 431185920 745758719 157286400 7 HPFS/NTFS/exFAT /dev/sda6 745760768 808675327 31457280 b W95 FAT32 /dev/sda7 808677376 812675071 1998848 82 Linux swap / Solaris /dev/sda8 812677120 812967935 145408 83 Linux /dev/sda9 812969984 976771071 81900544 83 Linux
3、mount /dev/sda9 /mnt (也就是你的Ubuntu的“/”的挂接硬盘分区,比如sda9,根据你的具体安装情况确定,/mnt是你建立的一个用来挂接的目录)
4、如果你单独划分了Ubuntu的boot分区,那么还需要做如下操作:
mount /dev/sda8 /mnt/boot (假设你的boot分区是在sda8)
5、重建grub到sda的mbr
grub-install --root-directory=/mnt /dev/sda
6、然后,重启,在终端输入update-grub,更新windows的启动项,就应该可以了 此时我们利用
set root=(hd0,msdos7)
set prefix=(hd0,msdos7)/boot/grub
insmod normal normal
进入到ubuntu当中,执行
mount /dev/sda7 /mnt
grub-install --root-directory=/mnt /dev/sda
update-grub
重启,此时已经用的是grub方式进行启动了。 要修改grub当中的各个选项,参考http://blog.chinaunix.net/uid-26438352-id-3418184.html Grub 2特性
Grub 2(GRand Unified Bootloader, version 2)是Grub的第二版。Grub 2对Grub的接口进行了完整到重写,基于PUPA(详细介绍)项目到研究,Grub 2更模块化并且更方便扩展,Grub 2的一些提升如下:
- 具有图形化界面,支持主题
- 模块化加载
- 夸平台的兼容性
- 支持脚本
- 自定义的启动项目定义
- 修改分区命名
Grub 2结构
Grub 2包含下面几个部分:
- /boot/grub/grub.cfg 文件
- /etc/grub.d/ 文件夹
- /etc/default/grub 文件
下面开始一个个介绍。
grub.cfg类似Grub中的 /boot/grub/menu.lst。里面的格式于menu.lst差不多,但是现在不允许你通过直接修改该文件到方式来修改启动项,因为该文件是在 执行“update-grub”或者update-grub2”之后,根据上面说到2、3两项动态生成到,也就是说,如果你修改了这个文件当下次这两个命 令被执行了,你修改到内容就会背覆盖。我发现这两个命令应该经常会自动执行的,因为上次我修改了启动画面的背景,需要通过这两个命令重新生成 grub.cfg,但是后来我忘了用这两个命令,所以背景一直没有生效,当时还很纳闷,不知道怎么回事,不过今天开机用了会儿,系统又更新,装完之后重启 就 好了,然后我突然想到上次可能忘了执行这命令了,没想到系统更新会自动执行,:)。
grub.cfg文件中主要包含两个部分,一部分是各个启动项的定义,第二部分是启动界面的设置。你可以直接用gedit打开该文件看其中的内 容。既然grub.cfg不能修改,那也没什么好详细说的了,稍微研究下就能看懂里面是怎么写的。下面就介绍一下Grub 2的另外两个部分。
Grub 2的另外两部分内容其实就分别对应于grub.cfg中的两部分内容。首先 2. /etc/grub.d/ 文件夹中定义各个启动项,其中的文件代表了一个或多个启动项,命名规范都是“两个数字_名称”,前面的两位数字确定这个或这多个启动项在启动界面的位置, 默认的 “00_“是预留给“00_header“的,“10_是预留给当前系统内核的,20_是预留给第三方程序的,除了这些你都可以使用,增加自己的,比如 05_ , 15_,数字越小越前面。这里的文件好像是代码,我还没研究透,不会自己写,只会改,:(,要加油学习了。当执行前面说的“update-grub”或者 update-grub2”命令之后,这个文件夹中的文件就是用于生成 grub.cfg 中启动项的定义的。
Grub 2的最后一部分是 3. /etc/default/grub 文件,该文件主要是启动界面的配置,比如默认的启动项,等待用户选择启动项的时间等。文件内容很简单,就是一些键值对,详细的可配置属性可以参考Grub 2的Wiki中“grub (/etc/default/grub)”这一节。当执行前面说的“update-grub”或者update-grub2”命令之后,这个文件的内容就 用于生成 grub.cfg 中启动界面的设置。
总结
好了,通过上面的介绍,应该对Grub 2有些了解了,聪明的你应该想到要怎么修改默认启动项了,有下面三种方法:
根据以前修改 /boot/grub/menu.lst 的方法那样直接修改已经生成好的 /boot/grub/grub.cfg。这个方法的优点是简单,缺点是修改之后会被update-grub命令覆盖掉。
修改 /etc/grub.d/ 中启动项的顺序,将你想要默认启动的项顺序设置为较小的值。优点是修改不会被update-grub命令覆盖掉,好像没啥缺电,只有另外的程序修改为比你的值更小了才会成为默认启动。
修改 /etc/default/grub 中默认的启动项,设置该文件中 GRUB_DEFAULT 为你想要的值,这个值是生成的 grub.cfg 中各个启动项的从0开始的下标。该方法优点是修改不会被update-grub命令覆盖,缺电是当启动项的顺序变化之后,下标也就变了。。。
示例
在写这篇文章的时候,我的环境是这样的:安装了Ubuntu 9.10,内核是Linux 2.6.31-14,后来两次更新之后变成Linux 2.6.31-16,在安装Ubuntu之前是用win7的,现在是双系统,现在的启动项有(根据已经生成的 /boot/grub/grub.cfg得到):
Ubuntu, Linux 2.6.31-16-generic (recovery mode)
Ubuntu, Linux 2.6.31-15-generic
Ubuntu, Linux 2.6.31-15-generic (recovery mode)
Ubuntu, Linux 2.6.31-14-generic
Ubuntu, Linux 2.6.31-14-generic (recovery mode)
Memory test (memtest86+)
Memory test (memtest86+, serial console 115200)
Windows 7 (loader) (on /dev/sda1)
呵呵,好多,我本来想根据第二种方法先删掉几个启动项的,不过想想以后可能还是会用到的,就先留着吧,所以采用第三种方法修改。现在在 /boot/grub/grub.cfg 有这么一行“set default=0”,注意这里的下标是从0开始的,相当于我现在的默认启动项是上面的第一个“Ubuntu, Linux 2.6.31-16-generic”,我要改为默认启动win7,所以应该将默认启动项改为 8,用下面的命令调出gedit。
修改/etc/default/grub中GRUB_DEFAULT=0为GRUB_DEFAULT=8。
用下面的命令重新生成 /boot/grub/grub.cfg:
执行后显示:
Generating grub.cfg ...
Found Debian background: moreblue-orbit-grub.png
Found linux image: /boot/vmlinuz-2.6.31-16-generic
Found initrd image: /boot/initrd.img-2.6.31-16-generic
Found linux image: /boot/vmlinuz-2.6.31-15-generic
Found initrd image: /boot/initrd.img-2.6.31-15-generic
Found linux image: /boot/vmlinuz-2.6.31-14-generic
Found initrd image: /boot/initrd.img-2.6.31-14-generic
Found memtest86+ image: /boot/memtest86+.bin
Found Windows 7 (loader) on /dev/sda1
done
这时候在执行:
可以看到其中的set default=0已经变成set default=8了。大功告成,restart
grub,mbr的那些事的更多相关文章
- GRUB&MBR引导
(ubuntu下搜索gnome-disk可以打开磁盘管理) 简单开机过程 : ①按下电源后,计算机自检(POST),如果硬件设备(CPU.内存.硬盘.光驱.各种卡)都没有问题,BIOS会检查各个硬盘的 ...
- Linux就这个范儿 第10章 生死与共的兄弟
Linux就这个范儿 第10章 生死与共的兄弟 就说Linux系统的开机.必须经过加载BIOS.读取MBR.Boot Loader.加载内核.启动init进程并确定运行等级.执行初始化脚本.启动内核模 ...
- Linux运维工程师面试题整理
1. Nginx 反向代理,负载均衡,动静分离,工作原理及优化nginx配置反向代理. vim Nginx.confServer模块中配置Listen 80Server_name ip;在server ...
- ubuntu全盘备份与恢复
备份: 以下是我用来备份系统的完整命令: tar -jpcvf Ubuntu-12.04-20131018.tar.bz2 --exclude=/proc --exclude=/lost+found ...
- PXE | 开关机
PXE | 开关机流程 linuxPXE 主要阶段 引导的主要6个阶段 从MBR中读取引导加载程序boot loader 加载并初始化内核: 检测和配置设备: 创建内核进程: 系统管理员干预(单用户模 ...
- Linux入门-8 Linux系统启动详解
系统启动流程 BIOS MBR GRUB KERNEL INIT 单用户修改root密码 GRUB加密 系统启动流程 BIOS MBR: Boot Code 执行引导程序 - GRUB 加载内核 执行 ...
- Linux系统如何迁移至LVM磁盘
今天遇到一个问题,算是比较严重的把.就是要把当前系统转移到 LVM 卷里面去,下面有一些发生过程介绍. 不感兴趣可以直接跳过,看实战部分<如何迁移系统至LVM卷> 朋友今天突然找我,说是要 ...
- 13.1 CentOS系统启动流程介绍
CentOS系统启动流程介绍 本章我们将学习 Linux 启动流程和内核模块管理相关的内容.通过本章我们将学习如下内容: Linux 系统的组成及特点 CentOS 系统的启动流程 开机启动成 gru ...
- GRUB、MBR名词解释
GRUB:是一个来自GUN项目的多操作系统启动程序,是多启动规范的实现,他允许用户在计算机内同时拥有多个操作系统,并在计算机启动时选择希望的操作系统.GRUB可用于选择系统分区上的不同内核,也可用于向 ...
随机推荐
- 10款很好用的 jQuery 图片滚动插件
jQuery 作为最流行的 JavaScript 框架,使用简单灵活,同时还有许多优秀的插件可供使用.其中最令人印象深刻的应用之一就是各种很酷的图片效果,它可以让的网站更具吸引力.这里收集了10款很好 ...
- 济南学习 Day 5 T1 pm
欧拉函数(phi)题目描述: 已知(N),求phi(N). 输入说明: 正整数N. 输出说明: 输出phi(N). 样例输入: 8 样例输出: 4 数据范围: 对于20%的数据,N<=10^5 ...
- OpenGL第12-14讲小结
首先要为自己为什么没有写第10讲的控制3D场景和第11讲的红旗飘飘呢?因为没看啊~哈哈哈,而且我尝试着运行红旗飘飘的时候电脑蓝屏了(可能不是它的锅),暂时跳过了. 恩,12到14主要了解了这么些东西, ...
- FPGA使用技巧
1 IOB 为了保证FPGA输入输出接口的时序,一般会要求将输入管脚首先打一拍再使用,输出接口也要打一拍再输出FPGA.将信号打一拍的方法是将信号通过一次寄存器,而且必须在IOB里面的寄存 ...
- MYSQL IN 与 EXISTS 的优化示例
文章转载自:http://www.jb51.net/article/53127.htm 当B表的数据集必须小于A表的数据集时,用in优于exists,当A表的数据集系小于B表的数据集时,用exists ...
- 转:java中volatile关键字的含义
转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...
- 【转】MyEclipse快捷键大全(绝对全)
ref:http://www.douban.com/note/254195820/?type=like# ctrl+w 关闭单个窗口 F3 跳转到类.变量的声明 F11 运行上次程序 Ctrl + F ...
- silverlight视频、音频
几天发现MediaElement播放不了wav格式的音频文件,在网上找到一篇解决的文章: http://www.cnblogs.com/rupeng/archive/2011/02/20/195936 ...
- SQL Server中timestamp(时间戳)
SQL Server timestamp 数据类型与时间和日期无关.SQL Server timestamp 是二进制数字,它表明数据库中数据修改发生的相对顺序.实现 timestamp 数据类型最初 ...
- 安装node和grunt
由于我用的恶事win8的系统,所以在安装nodeJS的时候出现了2503和2502的错误.解决方案: 进入cmd,然后输入msiexec /package [路径:为你将要安装的node所在的位置] ...