LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3975|回复: 13

redhat默认安装的时候,grub的stage2用的是哪个文件

[复制链接]
发表于 2007-1-30 17:15:53 | 显示全部楼层 |阅读模式
我查了很多资料,网上的,redhat手册的,但是对于grub我还是有些不明白。

Linux默认安装下,stage1装到MBR,stage1.5作为grub的文件系统的驱动程序,直接装到stage1的后面,也就是0磁道的第二个,到第64个簇。然后,stage1.5在系统安装的时候通常都做了处理,这样他就直接能找到stage2的文件了。现在的问题是,stage2必定是文件系统里的一个正常文件,也就是说,只要路径对,binary的内容不变,inode什么的不一样,无所谓。好,我现在在系统里找到两个stage2,binary完全相同,分别是/boot/grub/stage2和/usr/share/grub/redhat-i386/stage2。可是不管我怎么处理,删掉其中一个,或者两个都删,系统都能正常启动。

于是,我想问问,redhat的stage2到底装在哪里。或者,我前面的理解是不是有了偏差?

谢谢。
发表于 2007-1-30 18:24:10 | 显示全部楼层
info grub
`stage2'
     This is the core image of GRUB. It does everything but booting up
     itself. Usually, this is put in a filesystem, but that is not
     required.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-30 19:55:30 | 显示全部楼层
Post by kissingwolf
info grub
`stage2'
     This is the core image of GRUB. It does everything but booting up
     itself. Usually, this is put in a filesystem, but that is not
     required.


能不能说明白一点,难道redhat的stage2不是装在文件系统里的?
回复 支持 反对

使用道具 举报

发表于 2007-1-31 11:41:43 | 显示全部楼层
为什么不自己去info一下grub呢? 为什么不自己去找寻答案呢? 发现答案的快乐应该比别人告诉你更强烈吧?

info grub

`stage1'
     This is an essential image used for booting up GRUB. Usually, this
     is embedded in an MBR or the boot sector of a partition. Because a
     PC boot sector is 512 bytes, the size of this image is exactly 512
     bytes.

     All `stage1' must do is to load Stage 2 or Stage 1.5 from a local
     disk. Because of the size restriction, `stage1' encodes the
     location of Stage 2 (or Stage 1.5) in a block list format, so it
     never understand any filesystem structure.

`stage2'
     This is the core image of GRUB. It does everything but booting up
     itself. Usually, this is put in a filesystem, but that is not required.

`e2fs_stage1_5'
`fat_stage1_5'
`ffs_stage1_5'
`jfs_stage1_5'
`minix_stage1_5'
`reiserfs_stage1_5'
`vstafs_stage1_5'
`xfs_stage1_5'
     These are called "Stage 1.5", because they serve as a bridge
     between `stage1' and `stage2', that is to say, Stage 1.5 is loaded
     by Stage 1 and Stage 1.5 loads Stage 2. The difference between
     `stage1' and `*_stage1_5' is that the former doesn't understand
     any filesystem while the latter understands one filesystem (e.g.
     `e2fs_stage1_5' understands ext2fs). So you can move the Stage 2
     image to another location safely, even after GRUB has been
     installed.

     While Stage 2 cannot generally be embedded in a fixed area as the
     size is so large, Stage 1.5 can be installed into the area right
     after an MBR, or the boot loader area of a ReiserFS or a FFS.



从这里可以看出stage1 一段嵌入MBR 的迷你代码。stage2 是主要部分,但是不是必须的( 在有stage1_5存在的情况下)!在 stage1 把控制权传递给stage2或stage1_5 后,就由stage2或stage1_5来接管所有事情。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-31 14:27:33 | 显示全部楼层
你好,kissingwolf

首先感谢你花时间解答我的问题。但是我得辩解一下。我是看过info之后,觉得不明白再来提问的。下面是我的疑惑。

`stage1' encodes the location of Stage 2 (or Stage 1.5) in a block list format, so it never understand any filesystem structure.

grub的info是针对所有平台的,这不仅包括Linux,还包括各种BSD,不仅包括i386,还包括ibm 390之类的。这里,按照我的理解,在redhat, i386的平台上,stage1只是将stage1.5的东西encode到了硬盘里,也就是在硬盘的第2到第64个簇,这里总共有31.5K的空间,足够容纳stage1.5了。而stage2仍然留在文件系统里。grub要根据stage1.5的文件系统驱动程序,以及hard code在stage1.5里面的stage2的路径,到文件系统里找stage2。

好,现在,我想知道,这个stage2到底是哪个文件。因为我在文件系统里找到两个stage2,它们完全binary的相同。我换了新名字拷贝了这两个文件(orig.stage2),然后把原先的文件删除了。这样,如果stage1.5真的是通过路径引用stage2的话,系统应该无法启动了。但是我的系统仍然能正常启动。

这使我非常的不解。我怀疑是不是我的理解出了偏差。

如果stage1.5不是引用文件系统里的这两个文件,那么系统上必定还存有一个stage2。请问这个stage2在哪里。如果stage1.5是把stage2 hard code进了硬盘,那么又该存在哪里,因为stage2有大概105K,而硬盘的剩余空间只有31.5K,空间不够了。

最后说说的系统的情况。我的系统是Fedora Core 6,grub装在mbr上,硬盘第一个分区是/boot,其他部分被做成了LVM。grub在LVM之前加载,因此如果stage1.5里面放的是路径的话,应该只能到/boot里面找。现在,我已经彻底查了boot分区。没有隐含文件,唯一的stage2也已经被我删了。但是系统能正常启动。

现在我很怀疑stage2是不是写在硬盘的某个固定的位置上。但是我不能肯定。因为我在网上找不到相关的资料。
回复 支持 反对

使用道具 举报

发表于 2007-1-31 17:08:55 | 显示全部楼层
重要的是“that is not required” ! stage2 不是必须的!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-31 20:18:06 | 显示全部楼层
厥倒。怎么可能是这个意思呢?这个that应该指上面这句,而不是stage2这个单词,也就是说:stage2通常放在文件系统里,但也不一定。

难道没有stage2,就MBR里面的446个字节就直接找到/boot/grub/menu.lst,然后亮出菜单,或者给你一个用户界面?这根本是不可能的。
回复 支持 反对

使用道具 举报

发表于 2007-1-31 21:35:27 | 显示全部楼层
你误解了我的意思,我是说stage2 这个名字不是必须的!
如果你2进制查看MBR(446 ) 你会发现其中明确指定了 menu.lst(grub.conf)的位置
grub shell的 insall命令的完全写法也因该是:
grub>install (hd0,1)/boot/grub/stage1 (hd0) (hd0,1)/boot/grub/stage2 p (hd0,1)/boot/grub/grub.conf
同时info里也提到:Stage 1.5 is loaded by Stage 1 and Stage 1.5 loads Stage 2。So you can move the Stage 2 image to another location safely, even after GRUB has been installed 。另外:
`stage2'
This is the core image of GRUB. It does everything but booting up
itself. Usually, this is put in a filesystem, but that is not required.

那么在这个过程当中,除了menu.lst 这个是通过路径和名字确认的之外,stage2 在grub install的就确认了位置(具体硬盘的扇区和磁道),如果在相应的位置标记的不是stage2 而是*stage1_5,则stage2 可以通过具体路径的方式来得到!
默认情况下不管你是mv 也好,rm也好,除非你覆盖了硬盘上的block , 其它情况下文件的数据还是存在的,也就是说你并没有真的清楚他,依旧可以通过硬件的地址找到它!你可以先删除gurb下stage2 ,然后dd 一个刚好占满你剩余/boot分区的文件,然后重启启试试!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-2-1 07:26:46 | 显示全部楼层
谢谢kissingwolf。果然如如此。stage2的地址是以block list的形式hard code进stage1.5的。

下面,我用shred删除/boot/grub/stage2之后,果然系统就无法启动了。

再次感谢kissingwolf, 你的解答帮我彻底搞懂了grub。谢谢!
回复 支持 反对

使用道具 举报

发表于 2007-3-14 13:00:14 | 显示全部楼层
关于shhgs的当MBR的stage1把stage1.5 载入后,当1.5读取stage2的blocklist把其载入,我认为欠妥。
原因如下:
既然stage1.5可以不被配置,那么stage1读取 stage2的blocklist把其载入,那么都以stage2blocklist形式载入,那要stage1.5干吗?
我认为stage1.5可以认为是grub的文件系统驱动,stage1.5在载入stage2的时候,stage2就应该是以文件名的形式被载入的,这时改动、删除stage2的文件名。那么引导不会成功。
估计shhgs说的现象应该是stage1直接载入stage2.
这是个人的理解,请斧正
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表