一次惊险的grub2-svn安装经历

发布: 2008-11-27 00:53

起因:
gentoo linux 根文件系统从reiserfs切换到ext4, grub 0.9x系统不支持从ext4分区启动,只能升级到grub 1.9x才行,而1.9x至今没有一个稳定版本可用,大多数使用这个版本的人都在使用svn中的grub2。

当前分区情况:

hda 第一块硬盘,主硬盘
hda1 主分区,安装有 windows xp (历史遗留问题,还有几个fat32的分区中有许多数据)
hda2 主分区,NTFS格式
hda5-hda7 windows 逻辑分区, fat32类型文件系统,存储数据。
hda8 逻辑分区, ext4文件系统,gentoo linux 根分区
hda9 Linux swap 分区
hdb 第二块硬盘
hdb1 主分区,装有FreeBSD 7.0
hdb2-hdb4 主分区, fat32格式,数据盘。

目的: 在不破坏现在的引导系统的情况下,将grub2引导信息安装到hda8的引导扇区,并使用window的ntldr引导程序引导到grub2,再由grub2引导进入装在ext4文件系统中的linux系统。

1. 首先在hda1的根分区装有grub4dos程序,在hda1/boot/目录装有能引导ext4分区的 gentoo linux 的内核,在未安装grub2之前,使用grub4dos引导这个内核进入到Linux。那么这个Linux怎么安装上的呢?使用的systemrescuecd 1.1.3-beta3, 这个启动盘基于gentoo install cd, 并且升级了其中的内核,支持ext4,reiserfs4这些新文件系统的管理工具。

2. 安装grub2
从svn检出grub2源代码,
svn co http://svn.savannah.gnu.org/svn/grub/trunk/grub2
cd grub2
./configure
make
make install

grub2软件安装完了,接下来第3步把grub2引导信息安装到hda8分区的启动扇区上。

3. 执行命令,将 grub2的启动信息安装到启动扇区。
grub-install /dev/hda8
这一步并没有报错,可是把启动扇区中的数据拷贝出来查看,全是0,也就是并没有启动信息写入到启动扇区
dd if=/dev/hda8 of=grub2.boot ibs=512 count=1

重复试了几次,结果一样(这里可能因为我的分区信息比较乱,使用windows自带工具分区过,使用partition magic分区过,使用diskgen/diskman分区过)。现在怎么办?考虑试试能不能装到MBR中!!!

4. 备份MBR的引导信息。

dd if=/dev/hda of=hda.mbr ibs=512 count=1

在完成下面的grub2安装测试后,可将此信息重新使用 dd命令写入到MBR 中。

再次执行 grub-install 命令:(注意参数有点变化)
grub-install /dev/hda

再将mbr拷贝出来:
dd if=/dev/hda of=grub2.mbr ibs=512 count=1

使用hex模式打开grub2.mbr文件,内容中包含grub字样,并且最后两个字节为55AA,这说明grub2引导信息已经成功安装到了mbr中了,而mbr已经存储到文件grub2.mbr中了,这就是grub2的引导信息,这个文件可用于windows ntldr程序了。

别忘了,现在将原来的mbr恢复回来:
dd if=hda.mbr of=/dev/hda ibs=512 count=1

5. 将grub2.mbr拷贝到hda1/目录下,在hda1/boot.ini中添加一条记录:

C:\grub2.lnx="Grub2 OS Loader menus (For EXT4 )"

重启,出来了菜单 "Grub2 OS Loader menus (For EXT4 )", 回车后,出来了grub控制台,上面显示版本号 1.96 ,这说明 grub2引导信息正确。

6. 在grub2控制台使用命令(或者使用grub4dos)引导进入linux,修改hda8/boot/grub/grub.cfg如下:
# Timeout for menu
set timeout=10

# Set default boot entry as Entry 0
set default=0

# Entry 0 - Load Linux kernel
menuentry "My Linux Kernel 2.6.28 (ext4) on (hd0,8)" {
set root=(hd0,8)
linux /boot/kernel-genkernel-x86-2.6.28-rc6 root=/dev/hda8
initrd /boot/initramfs-genkernel-x86-2.6.28-rc6
}

# Entry 1 - Chainload another bootloader
menuentry "Chainload my OS" {
set root=(hd0,1)
chainloader +1
}

重启,应该能看到 grub2的菜单了。回车后可以直接引导到linux系统。

整个安装过程就成功完成了。

这里的惊险主要是,在此过程可能会修改MBR,造成这几个系统都不能启动了。所以要注意备份mbr,恢复mbr这一步。到最后其实并没有把grub2的引导信息安装到hda8引导扇区中,不过我们的目的已经达到,其实即使将grub2引导信息写入到引导扇区,也还是要拷贝出来保存到一个512字节的文件中。现在如果你想安装,可以使用dd将grub2内容拷贝到hda8的引导扇区,也是没有问题的。

对linux的dd命令,grub引导,ntldr引导,mbr,引导扇区不熟悉的人切勿随便模仿。


原文: http://qtchina.tk/?q=node/258

Powered by zexport