grub2学习和Boot-Repair

(0)grub2基础知识

a,grub2和grub有很多不同的地方:
a)图形接口
b)使用了模块机制,通过动态加载需要的模块来扩展功能
c)支持脚本语言,例如条件判断,循环、变量和函数
d)支持rescue模式,可用于系统无法引导的情况
e)国际化语言。包括支持非ASCII的字符集和类似gettext的消息分类,字体,图形控制台等等
f)有一个灵活的命令行接口。如果没有配置文件存在,GRUB会自动进入命令模式
g)针对文件系统、文件、设备、驱动、终端、命令、分区表、os loder的模块化、层次化、基于对象的框架
h)支持多种文件系统格式
i)可访问已经安装的设备上的数据
j)支持自动解压


b,设备的命名
        grub2同样以fd表示软盘,hd表示硬盘(包含IDE和SCSI硬盘)。设备是从0开始编号,分区则是从1开始,主分区从1-4,逻辑分区从5开始。下面给出几个例子 :
(fd0):表示整个软盘
(hd0,1):表示第一个硬盘的第1个分区
(hd0,5)/boot/vmlinuz:表示第一个硬盘的第一个逻辑分区下的boot目录下的vmlinuz文件

  GRUB的进入方法,开机按shift。参考http://blog.csdn.net/luckywang1103/article/details/43157189

c,grub2启动

       grub2默认安装在第一硬盘(hd0)的mbr,其实就是把引导文件boot.img写入硬盘的mbr,当然,用户也可以选择不写入硬盘mbr而是写入linux分区的引导扇区。启动时根据mbr所提供信息找到启动分区后,加载分区内的grub核心文件core.img和配置文件grub.cfg,进入选择菜单画面。

可以用命令行启动系统,比如启动第二硬盘第一逻辑分区上的ubuntu系统:

    grub>set root=(hd1,5)

    grub>linux /boot/vmlinuz-xxx-xxx root=/dev/sdb5

    grub>initrd /boot/initrd.img-xxx-xxx

    grub>boot

其中内核vmlinuz和initrd.img的版本号可用按Tab键自动查看。

(1)grub.cfg详解

        说明:grub.cfg默认为只读,需要个性化配置文件的,建议不要直接修改grub.cfg,请参考链接的pdf文档和google文档。

set default=0
#默认为0
 insmod jpeg
#添加jpg支持,如要使用png或tga文件做背景,加上 insmod png或insmod tga
 insmod ext2
#除了用作启动的分区外,其他分区格式可在menu底下再添加
set root=(hd0,7)
#设定root分区
search --no-floppy --fs-uuid --set f255285a-5ad4-4eb8-93f5-4f767190d3b3
#设定uuid=****的分区为root,和上句重复,可删除
# 以下为终端配置
if loadfont /usr/share/grub/unicode.pf2 ; then
#设置终端字体,unicode.pf2支持中文显示
set gfxmode=640x480
#设置分辨率,默认为 640x480,可用800x600,1024x768,建议跟你想设定的图片大小一致
insmod gfxterm
#插入模块 gfxterm,支持中文显 示,它还支持 24 位图像
insmod vbe
#插入 vbe 模块,GRUB 2 引入很多模块的东西,要使用它,需要在这里加入
if terminal_output gfxterm ; then true ; else
 # For backward compatibility with versions of terminal.mod that don't
 # understand terminal_output
 terminal gfxterm
#设置 GRUB 2 终端为 gfxterm
 fi
 fi
 set timeout=10

#该延时比较关键,出现grub rescue时时间设置久点就可以进入系统,可能是匹配到UUID的原因
 background_image (hd0,7)/boot/images/1.jpg
#设置背景图片
### END /etc/grub.d/00_header ###

 ### BEGIN /etc/grub.d/05_debian_theme ###
 set menu_color_normal=white/black
 set menu_color_highlight=cyan/black
#这两行为 Debian 下的菜单颜色设置,如果默认的话,你会发现背景完全被蓝色挡住了,你需要修改 blue 为 black,这样背景就会出现
### END /etc/grub.d/05_debian_theme ###

# 10_linux 为自动添加的当前root分区linux引导项
### BEGIN /etc/grub.d/10_linux ###
#菜单项,要包括 menuentry 双引号" " 和大括号 { }才完整,否则不显示菜单
menuentry "Ubuntu, Linux 2.6.31-9-386" {
 insmod ext2
 set root=(hd0,7)
 search --no-floppy --fs-uuid --set f255285a-5ad4-4eb8-93f5-4f767190d3b3
#这句与set root=(hd0,7)重复,可删除
linux /boot/vmlinuz-2.6.31-9-386 root=UUID=f255285a-5ad4-4eb8-93f5-4f767190d3b3 ro quite splash
#不喜欢看到一长串的, roo=UUID=***可用root=/dev/sda7代替
initrd /boot/initrd.img-2.6.31-9-386
 }
 ### END /etc/grub.d/10_linux ###

 ### BEGIN /etc/grub.d/20_memtest86+ ###
 menuentry "Memory test (memtest86+)" {
 linux16 /boot/memtest86+.bin
 }
 ### END /etc/grub.d/20_memtest86+ ###

(2)重新安装、修复grub2

a,先使用ls命令,找到Ubuntu的安装在哪个分区:在 grub rescue>下输入以下命令:ls。会罗列所有的磁盘分区信息,比方说:引用:

(hd0,1),(hd0,5),(hd0,3),(hd0,2)

b,然后依次调用如下命令试探: X表示各个分区号码。如果/boot没有单独分区,用以下命令:代码:

ls (hd0,X)/boot/grub

如果/boot单独分区,则用下列命令:代码:

ls (hd0,X)/grub
正常情况下,会列出来几百个文件,很多文件的扩展名是.mod和.lst和.img,还有一个文件是grub.cfg。假设找到(hd0,5)时,显示了文件夹中的文件,则表示Linux安装在这个分区。

c,如果找到了正确的grub目录,则设法临时性将grub的两部分关联起来,方法如下:
        以下是/boot没有单独分区的命令:引用:

grub rescue>set root=(hd0,5)
grub rescue>set prefix=(hd0,5)/boot/grub
grub rescue>insmod /boot/grub/normal.mod
        以下是/boot 单独分区的命令:(这几句有待验证)引用:
grub rescue>set root=(hd0,5)
grub rescue>set prefix=(hd0,5)/grub
grub rescue>insmod /grub/normal.mod
然后调用如下命令,就可以显示出丢失的grub菜单了。
grub rescue>normal

不过不要高兴,如果这时重启,问题依旧存在,我们需要进入Linux中,对grub进行修复。启动起来,进入ubuntu之后,在终端执行:

sudo update-grub sudo grub-install /dev/sda

sda是你的硬盘号码,千万不要指定分区号码,例如sda1,sda5等都不对。

d,如果找不到正确的/grub目录,则尝试寻找是否有linux核心文件,则依次调用如下命令: X表示各个分区号码:grub rescue>下,输入:

如果/boot没有单独分区:代码:

ls (hd0,X)/boot
如果/boot单独分区,则:代码:
ls (hd0,X)
找名字类似与vmlinuz-3.0.0-12-generic这样的文件,这是linux核心文件,如果找到,记下(hd0,X)中的X值。假设找到(hd0,5)时,显示了文件夹中的文件。然后用live cd 或者 live usb启动,在live cd的ubuntu的终端中依次输入以下命令(sda5中的“5”必须改成上面记录下来数值)

        如果/boot没有单独分区:代码:

sudo mount /dev/sda5 /mnt
sudo grub-install --boot-directory=/mnt/boot /dev/sda
        如果/boot单独分区,则:代码:
sudo mount /dev/sda5 /mnt
sudo grub-install --boot-directory=/mnt /dev/sda

然后重新启动即可。
e,如果连linux核心文件都没有,那么重新安装吧。

         在安装ubuntu时发现一个现象:在ubuntu10.04的机子上装了12.04之后,无法开机,提示grub rescure,且16g的引导盘也不识别了,一开始怀疑是系统安装错误导致硬盘引导区有问题。后来用8g的U盘替代16G的U盘重新制作12.04的安装盘之后,就可以识别并安装了。

         最直接有效的解决grub2的方法,就是使用boot-repair-disk-64bit.iso的安装盘,从U盘引导修复,稍等会就行了
(3)其他grub2常见错误

        很多出错的原因是用户不知道grub2分为两部分,一部分(一般情况下)写在了mbr上,另一部分写在了某个分区的/boot/grub目录(如果/boot单独分区,则直接写在对应分区的/grub目录)里面。很多错误操作,致使grub2的mbr里面的那一部分找不到/grub目录里面的那一部分了(或者那一部分已经删除了)。

        各种错误原因,可参见http://blog.sina.com.cn/s/blog_80b4fe5c0101868b.html,讲述的比较清楚

(4)INSTALL GRUB2 FROM LIVE CD

Firstly, boot from your Linux or Ubuntu CD, and choose the option of trying Ubuntu without installation.After Ubuntu gets loaded from the Live CD, you have to find out that which of the drive or partition was the one, containing your previously installed Linux.

      For checking out the partitions,use: sudo fdisk -l.This will show you the list of partitions you have in your system.After you get to know the partition where your Ubuntu was installed, write the following commands.For example, if the partition is /dev/sda1, you have to write the following commands (you have to replace the sda1 from your partition name):

sudo mount /dev/sda1 /mnt
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo chroot /mnt
and then install Grub by the following command:
grub-install /dev/sda
If any errors found after entering the above line, then try this one:
grub-install --recheck /dev/sda
This is it.un-mounting the system by:
sudo umount /mnt/dev
sudo umount /mnt/proc
sudo umount /mnt
Now you can reboot your system, and enjoy using your previously installed Ubuntu.and simply reboot:
sudo reboot


参考原文:http://blog.sina.com.cn/s/blog_80b4fe5c0101868b.html
参考原文:http://www.queryinn.com/index.php/2010/04/install-grub2-from-live-cd/
参考原文:http://blog.csdn.net/fengyu0556/article/details/6865532

参考原文:http://www.cppblog.com/zjl-1026-2001/archive/2010/03/18/109959.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值