修复grub2

insularisland 2010-12-21

关于grub2

由于做windows把mbr覆盖了,所以在修复时学习一下grub2的知识

一、设备的命名

grub2同样是以fd表示软盘,hd表示硬盘(包含IDE和SCSI硬盘)。设备从0开始编号的,分区则是从1开始编号的,主分区是1-4,逻辑分区从5开始。

(fd0):表示整个软件盘

(hd0,1):表示biso中第一个硬盘的第一个分区。

(hd0,5)/boot/vmlinuz:表示bios中第一个硬盘的第一个逻辑分区的boot目录下的vmlinuz文件。

二、grub2的安装与启动

安装ubuntu9.10时,grub默认安装在第一个硬盘(hdo)的mbr上,其实就是把引导文件boot.img写入硬盘的mbr。当然也可以选择不写入mbr,而写入linux分区的引导扇区中。

启动时根据mbr所提供的信息找到启动分区,加载分区的grub核心文件core.img和配置文件grub.cfg,进入选择菜单。

启动出现菜单时,按e键进入编辑状态,按c键进入命令行模式。control+x以编辑的内容启动,control+c进入命令状态,按esc返回菜单项。

按c键进入命令行模式后,可以按tab查看命令,根据需要进行加载或移除相应的模块。

实验(1)

第一个硬盘第一个分区上有windowsxp系统,我们可以这样引导。

grub>setroot=(hd0,1)

grub>chainloader+1

grub>boot

//我的第一个分区装的是msdos系统,测试成功。

ls命令:

ls//显示出磁盘设备

ls-l//能显示出分区及文件类型,uuid等信息

ls///列出当前设置的root分区下的文件

ls(hd0,1)///列出(hd0,1)分区下的文件

实验(2)

1、第一个分区是msdos系统,看看里面有什么文件

ls(hd0,1)/

显示出:io.sysmsdos.syscommand.combootlog.prvbootlog.txt

我们在用到磁盘里的某个文件或目录时,可以按tab键进行列出,和linux命令的tab相似

2、显示linux分区里的文件

我的linux分区是(hd0,3)//dev/sda3

ls(hd0,3)/[按tab显示当前文件,他还有补全的功能]

引导linux

我们首先知道内核文件vmlinuz-xxxx...和initrd.img-xxxx(bootloader初始化内存盘)在boot目录里,而我的linux系统在(hd0,3)分区中

#指定用于启动的分区

grub>setroot=(hd0,3)

#指定内核文件,linux的意思是用linux取代grub中的kernel命令

grub>linux/boot/vmlinuz-xxx-xxxroot=/dev/sda3[里面的文件名可以按tab查看]

#指定initrd文件

grub>initrd/boot/initrd.img-xxx-xxx[文件名可以按tab查看]

#引导

grub>boot

我试着把这两个文件复制到dos分区,也可以出现一个linux界面,里面有也linux常用的目录结构(我对这东西不了解,就想像成一个最简单的linux吧)

常用的功能:

set:

设置变量

如:

setdefault=0

settimeout=5

setroot=(hd0,3)

等等

default:

默认引导的操作系统,0表示第一个,1表示第二个...

timeout:

定义在指定时间内没有按键盘上的某个键,自动引导default指定的操作系统

root:

指定用于启动的分区

insmod和rmmod:

加载和移除模块

如:

insmodjpeg

insmodpng

insmodntfs

rmmodpng

drivemap

他是兼容grub的map,主要用于只能从第一硬盘(hd0)引导启动的系统,如win2000,xp,2003等。如:要添加第二硬盘第一分区上的xp系统

menuentry"windowsxp"{

setroot=(hd1,1)

drivemap-s(hd0)${root}//访问变量"${变量名}"

chainloader+1//此处'+1'是指示GRUB读入分区的第一个扇区的引导记录。即调用另一个启动器,如:chainloader(hd0,1)+1

}

实验(3):修复grub:livecd

1、先把/boot/grub/grub.cfg删除sudorm/boot/grub/grub.cfg

2、从dos启动计算机把mbr清空,fdisk/mbr,我用的是sfdisk也可以的

3、用livecd引导计算机

ctrl+alt+1//进入到控制台

sudo-i//进入超级用户

fdisk-l//查看分区情况

发现

/dev/sda330526101852294583Linux

这个是我的硬盘linux所在的分区

挂载这个分区

mkdir/mnt/mylinux

mount/dev/sda3/mnt/mylinux

安装grub

grub-install--root-directory=/mnt/mylinux/dev/sda

///dev/sda指定要安装到哪个设备上

//--root-directory是挂载的原先系统的/

生成grub.cfg

我按教程做的,没有成功,我也不知道为什么。但我直接运行

update-grub就自动建立菜单了,但默认的没有我的msdos分区的引导

menuentry"runmsdos..."{

setroot=(hd0,1)

chainloader+1

}

把timeout设置>0这样就能看到启动菜单多一项了,选择进入成功。

相关推荐