Chinaunix首页 | 论坛 | 博客
  • 博客访问: 216771
  • 博文数量: 60
  • 博客积分: 2440
  • 博客等级: 大尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-12 16:38
文章分类

全部博文(60)

文章存档

2011年(2)

2010年(16)

2009年(42)

我的朋友

分类: LINUX

2010-07-12 22:56:01

Using Ubuntu (3) GRUB、MBR、硬盘分区

http://hi.baidu.com/cassati/blog/item/bf6cae559ea72e54d0090623.html

Using Ubuntu (4) GRUB2基本应用

http://hi.baidu.com/cassati/blog/item/d3777fd615fa50d1a044df53.html


作者:Cassati (cassati@163.com)
时间:2010-05-19

GRUB是应用广泛的多系统启动管理器,使用它,可以在图形化的菜单中选择启动硬盘上的某个操作系统,如Linux、WINDOWS等操作系统。主要有两个版本,也就是GRUB1、GRUB2。所谓GRUB1其实就是GRUB0.97、GRUB0.98之类的,而所谓GRUB2其实就是GRUB1.97、 GRUB1.98之类的版本。此外还有可以在WINDWOS系使用的GRUB版本。
有没有必要升级到GRUB2呢?这个问题仁者见仁吧。其实GRUB1的功能已经足够强悍了,能够引导绝大多数的系统。不过大部分主流的Linux发行版都在新发布的版本中预装GRUB2了,可见新版本还是受到了大多数的肯定。社区软件的发展就是不断地开发,不断地完善的过程。我们可以不断的免费使用功能强大的新软件,何乐而不为呢?在我们看来,引导系统程序这么一个小小的功能都能给整得这么强大,社区的力量实在强大! 充分说明了自由软件精益求精的优越性!

一、GRUB2与GRUB1的区别
GRUB2相对于GRUB1有着许多的新功能,在我看来比较吸引人的新特性有支持国际化语言以及自动生成引导菜单。这样GRUB2就可以支持中文了,而且可以只需一条命令便自动生成新的引导菜单,不用手工修改menu.lst了。尽管我觉得手工修改menu.lst并不是件很困难的事情...太高级的新功能也不一定每个人都用得上,还是来看看版本2相对版本1在使用上比较明显的区别吧。(更详细的不同请参考官方文档)
设备命名:原来表示第一块硬盘的第一分区是(hd0,0),现在则是(hd0,1)。从1开始而非从0开始编号,其实这和Linux系统的分区编号统一起来,有利于使用。
主要命令:原来的kernel命令没有了,取而代之的是linux命令,同样是为了指出系统内核的具体位置以及可选参数。还增加了许多好用的命令比如ls等,但原来的setup命令却没有了,这倒有点遗憾,因为修复MBR只能进入到桌面环境而非在引导时。
设置变量:原来只需`timeout=5`,现在则需要`set timeout=5`。原来指定root只需`root (hd0,5)`,现在则需`set root=(hd0,6)`。不过可以通过使用“${root}”的格式来引用刚才设置的root这个变量。其实也还好,挺容易理解的。
配置文件:原来就一个/boot/grub/menu.lst,只要修改这个文件就可以变更启动菜单项目。而现在的菜单配置文件变成了/boot/grub/grub.cfg,这个文件是依靠脚本自动生成的,依靠的脚本有/etc/default/grub,以及/etc/grub.d/目录下面的几个脚本。
引导文件:原来是stage1想办法去寻找stage2来引导系统,现在则是boot.img想办法去寻找core.img来引导系统,而且比原来的更智能点,比如分区号调整以后不必重新写入MBR,而只要重新运行update-grub来更新grub.cfg就行。
现在我们拿一个最简单的XP+LINUX双系统菜单方案来稍微做个直观对比:
GRUB1版本:
default=0
timeout=5
title Linux
root (hd0,5)
kernel /boot/vmlinuz ro root=/dev/sda6
initrd /boot/initrd.img
title XP
rootnoverify (hd0,0)
chainloader +1
相应的GRUB2版本:
set default=0
set timeout=5
menuentry “Linux”{
set root=(hd0,6)
linux /boot/vmlinuz ro root=/dev/sda6
initrd /boot/initrd.img
}
menuentry “XP”{
set root=(hd0,1)
chainloader +1
}
最明显的变化是title变成了menuentry,还叠加了花括号。kernel被linux取代,设置变量前面要加关键字set等等。并不是很可怕,相信熟悉GRUB1的都能很快的熟悉GRUB2的基本功能。

二、如何使用GRUB2?

和GRUB1一样,需要下载安装软件,然后再安装配置到MBR或者分区的第一扇区。
1、安装GRUB2到系统中,一般新的Linux发行版都已经自带了GRUB2了。如果没有安装的话可以自行安装,通过发行版特有的软件仓库或者去下载源码编译安装都可以,详情请参考Linux软件的安装。

2、安装GRUB配置/boot分区和硬盘MBR。
可以在shell命令行界面下输入以下命令,其中/dev/sda是要写入的目标硬盘,要根据实际情况替换成你具体要写入的硬盘。
sudo fdisk -l #查看实际的硬盘设备标识
sudo grub-install /dev/sda #需指定要安装到的硬盘
sudo grub-install –root-directory=/boot /dev/sda #如果有独立的/boot分区,需附加指出
观察命令执行的输出情况,如果没有出错提示就表示已经成功安装。

3、 GRUB命令行引导Linux系统的步骤:
A、可以通过ls命令来罗列出系统的各个分区设备号。
B、通过set root=(hd0,5)来指定/boot所在的分区。
C、通过linux指令来指定绝对路径的内核和根分区。比如:
linux /boot/vmlinuz-2.6.24-27-generic root=/dev/sda5 ro
这行指出内核是/boot/vmlinuz-2.6.24-27-generic,并且根分区是/dev/sda5
D、通过initrd指令来指定绝对路径的initrd文件。比如:
initrd /boot/initrd.img-2.6.24-27-generic
E、通过boot指令来引导系统。
如果前面没有输入错误且系统文件正常,则这时系统便可以启动起来。这边需要注意的就是B步骤和C步骤都有指定某分区的指令。B步骤中指定的是/boot所在的分区,而C步骤中的root=/dev/sda5则是指定系统根目录坐在的分区。指令的意图是不一样的,不过一般/boot都和根分区属于同一个分区,所以这两指令实际上所指向的分区大部分是一样的,只不过用了两种不同的描述方法罢了。Linux与GRUB的分区描述方法的差异可以参考相关文档。

4、引导windows操作系统。很简单,只需指定windows系统在哪个分区,然后使用链式加载器,就可以了。步骤如下:
A、set root=(hd0,1) 指出windows系统所在分区
B、chainloader +1 执行链式加载
C、boot 开始加载
这样便可以引导windows系统了,如果windows在第2块硬盘怎么办?没问题,可以使用drivemap来映射。

5、生成配置文件grub.cfg。其实在安装GRUB2后会马上自动生成一份引导菜单。如果我们的分区调整引起分区号的变更,这个时候我们可以不用重写MBR,而只需执行update-grub便可以再次自动生成正确的引导菜单。当然,如果你愿意,完全可以手工编写或者修改引导菜单文件grub.cfg。

三、关于配置文件

当我们看到系统自动生成的引导菜单不够个性化的时候,可以手工修改之。可是在系统内核、GRUB升级等情况下,GRUB又会自动执行update-grub,这样我们之前改动的grub.cfg文件就会被覆盖掉。当然我们可以再次改之,但是这样总感觉有点不爽。其实只要你去认真研究一下GRUB的配置文件/etc/default/grub和/etc/grub.d/目录下面,就可以定制个性化的菜单而不用担心被刷掉。
super@super-desktop:~$ cat /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.

GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
GRUB_DISABLE_LINUX_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

其实在/etc/default/grub里面倒是没有多少可以调整的,比较常用的也就是timeout 、 default、关掉自动生成恢复模式、关掉UUID的显示等等。
最厉害的是在/etc/grub.d/目录下面的几个脚本,自动化程度很高,要调整的话比起GRUB1来说还是有点复杂的。如果仅仅是想让系统启动起来,根本就不用来修改这些脚本,直接执行update-grub就能自动生成菜单,其实还是挺方便的。
主要的脚本有00_header、05_debian_theme、10_linux、20_memtest86+、 30_os-prober 、40_custom 。前面的数字表示在执行update-grub时这些脚本执行的先后顺序。如果你有把握完全可以去修改这些脚本里面的内容以达成个性化菜单的目的。在修改的过程中需要注意的是“cat<
四、修复GRUB2

1、分区号变更引起的错误
如果只是由于调整分区而引起的引导菜单错误,不必重写MBR,只需要通过启动盘引导进入系统后,在shell里执行update-grub,这样就可以重新生成正确的引导菜单了。这个应该算是个进步吧。不过当然需要编辑/etc/fstab里面相应的分区号。
当然也可以通过进入LiveCD环境,执行终端命令:
sudo mount /dev/sda6 /mnt #挂载根分区
sudo mount /dev/sda7 /mnt/boot #挂载/boot分区,如果/boot没有单独分区就不用这步
sudo grub-install -root-directory=/mnt /dev/sda #写入硬盘的MBR
当然同样需要编辑/etc/fstab里面相应的分区号,因为你的分区号乱了嘛。这样相当于重新安装GRUB2,将会把你的个性化配置给刷掉。

2、GRUB2的关键文件被破坏
如果GRUB2的关键文件被破坏了,比如/boot/grub目录被删除,或者里面的重要文件被删除,则需要重新安装GRUB2配置,可以通过启动盘引导进入没被完全破坏的系统,然后执行:
sudo grub-install /dev/sda #需指定要安装到的硬盘
sudo grub-install –root-directory=/boot /dev/sda #如果有独立的/boot分区,需附加指出

当然也可以直接在LiveCD环境里面,通过执行终端命令:
sudo mount /dev/sda6 /mnt #挂载根分区
sudo mount /dev/sda7 /mnt/boot #挂载/boot分区,如果/boot没有单独分区就不用这步
sudo grub-install -root-directory=/mnt /dev/sda #写入硬盘的MBR

阅读(951) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~