x86机器启动流程一般是BIOS-> MBR-> BOOTLOADER ( LILO/ GRUB) -> kernel但对于 使用 GRUB- 0.97 的 x86机器来说, 有点不同GRUB- 0.97 的主题有1. 安装GRUB- 0.97 2. 配置GRUB- 0.97 配置文件3. GRUB- 0.97 如何启动
3. 基于GRUB-0.97的x86机器启动流程
BIOS-> MBR位置的stage1 ( 属于GRUB- 0.97 ) -> / boot/ grub/ stage2 ( 属于GRUB- 0.97 ) -> kernel
BIOS-> MBR位置的stage1 ( 属于GRUB- 0.97 ) -> MBR后的xxx_stage_1_5 ( GRUB- 0.97 ) -> / boot/ grub/ stage2 ( 属于GRUB- 0.97 ) -> kernel
1. 安装GRUB-0.97
tar xvf $LFS/ grub- 0.97 . tar. gz
cd grub- 0.97
patch - Np1 - i $LFS/ grub- 0.97 - disk_geometry- 1. patch
. / configure -- prefix= / usr
make
make checkmake install
mkdir - v / boot/ grub
cp - v / usr/ lib/ grub/ i386- pc/ stage{
1 , 2 } / boot/ grub
cd . .
rm - rf grub- 0.97
输入grub
grub命令行下输入
root ( hd0, 1 )
setup ( hd0) 实际上执行 install ( hd0, 1 ) / boot/ grub/ stage1 ( hd0) ( hd0, 1 ) / boot/ grub/ stage2 p / boot/ grub/ menu. lst
quit
tar xvf $LFS/ grub- 0.97 . tar. gz
cd grub- 0.97
patch - Np1 - i $LFS/ grub- 0.97 - disk_geometry- 1. patch
. / configure -- prefix= / usr
make
make checkmake install
mkdir - v / boot/ grub
cp - v / usr/ lib/ grub/ i386- pc/ stage{
1 , 2 } / boot/ grub
cp - v / usr/ lib/ grub/ i386- pc/ xfs_stage1_5 / boot/ grub
cd . .
rm - rf grub- 0.97
输入grub
grub命令行下输入
root ( hd0, 1 )
setup ( hd0) 实际上执行install / boot/ grub/ stage1 ( hd0) ( hd0) 1 + 0 p ( hd0, 1 ) / boot/ grub/ stage2 / boot/ grub/ menu. lst
quit
2.配置GRUB-0.97配置文件
cat > / boot/ grub/ menu. lst << "EOF"
# Begin /boot/grub/menu.lst
# By default boot the first menu entry.
default 0
# Allow 30 seconds before booting the default.
timeout 30
# Use prettier colors.
color green/ black light- green/ black
# The first entry is for LFS.
title LFS 6.3
root ( hd0, 1 )
kernel / boot/ lfskernel- 2.6 .22 .5 root= / dev/ hda2
EOF
mkdir - v / etc/ grub
ln - sv / boot/ grub/ menu. lst / etc/ grub
综述
( 只有stage1 和 stage2时) : 其实是包括两个 磁盘 1. 输入磁盘: ( 2 个grub镜像( stage1 stage2) 及menu. lst所在磁盘分区) 2. 输出磁盘: 待写入MBR的磁盘写入过程: 1. 检测输入磁盘是否存在存在则挂载输入磁盘( 通过root 指令指定或者install中直接写入磁盘及分区) 不存在则直接返回Error 17 : Cannot mount selected partition, 并终止写入过程2. 检测输出磁盘是否存在存在则什么都不做不存在则直接返回Error 21 : Selected disk does not exist, 并终止写入过程3. 检测 / boot/ grub/ stage1 / boot/ grub/ stage2 是否存在存在则什么都不做不存在则直接返回Error 15 : File not found, 并终止写入过程4. 检测计算stage2的绝对地址5. 将挂载后的磁盘中的 / boot/ grub/ stage1 ( 512 字节) recipe ( 替换跳转地址为stage2的绝对地址) 写入 磁盘的MBR ( 前512 字节) 启动过程1. BIOS启动, 选择输出磁盘作为启动介质, 将控制权交给输出磁盘的MBR2. 输出磁盘的MBR启动, 并通过 stage2的绝对地址 , 跳转到 stage2 ( / boot/ grub/ stage2) , ( 跳转时打印GRUB Loading stage2. . ) 将控制权交给 stage2 3. stage2 启动, 读取 / boot/ grub/ menu. lst, 根据/ boot/ grub/ menu. lst 中的脚本启动4. 启动脚本4.1 root ( hd0, 1 ) 通过 root 指令指定下面的指令所读取的文件位于hda磁盘的2 分区4.2 kernel / boot/ lfskernel- 2.6 .22 .5 root= / dev/ hda2 通过 kernel 指令1. 加载 / boot/ lfskernel- 2.6 .22 . 5 ( 内核) 到内存2. 设置bootargs为root= / dev/ hda23. 将控制权移交给加载到内存中的内核
综上( 只有stage1 和 stage2 和 xxx_stage_1_5 ( xxx为xfs, xfs为/ boot/ grub/ stage1所在分区的文件系统格式) 时) : 其实是包括两个 磁盘 1. 输入磁盘: ( 2 个grub镜像( stage1 stage2 xxx_stage_1_5) 及menu. lst所在磁盘分区) 2. 输出磁盘: 待写入MBR的磁盘写入过程: 1. 检测输入磁盘是否存在存在则挂载输入磁盘( 通过root 指令指定或者install中直接写入磁盘及分区) 不存在则直接返回Error 17 : Cannot mount selected partition, 并终止写入过程2. 检测输出磁盘是否存在存在则什么都不做不存在则直接返回Error 21 : Selected disk does not exist, 并终止写入过程3. 检测 / boot/ grub/ stage1 / boot/ grub/ stage2 是否存在存在则什么都不做不存在则直接返回Error 15 : File not found, 并终止写入过程4. 计算即将写入的 xxx_stage_1_5 的绝对地址( MBR 后面) , 将挂载后的磁盘中的 / boot/ grub/ xxx_stage_1_5 写到该绝对地址 ( 具体是哪里, TODO) 5. 将挂载后的磁盘中的 / boot/ grub/ stage1 ( 512 字节) recipe ( 替换跳转地址为xxx_stage_1_5的绝对地址) 写入 磁盘的MBR ( 前512 字节) 启动过程1. BIOS启动, 选择输出磁盘作为启动介质, 将控制权交给输出磁盘的MBR2. 输出磁盘的MBR启动, 并通过 stage1_5 的绝对地址 , 跳转到 stage1_5 ( / boot/ grub/ xxx_stage_1_5) , ( 跳转时打印GURB Loading stage1. 5 ) 将控制权交给 stage1. 5 3. stage1. 5 启动1. 挂载 安装grub时写入的( install / boot/ grub/ stage1 ( hd0) ( hd0) 1 + 18 p ( hd0, 1 ) / boot/ grub/ stage2 / boot/ grub/ menu. lst) 中的 ( hd0) , 挂在格式为xfs文件系统2. 读取 / boot/ grub/ stage2到内存, 如果没有stage2, 则会打印 Error 15 , 在grub- 0.97 中 Error 15 : File not found3. 打印GRUB loading, please wait. . . 4. 将控制权交给 / boot/ grub/ stage24. stage2 启动, 读取 / boot/ grub/ menu. lst, 根据/ boot/ grub/ menu. lst 中的脚本启动5. 启动脚本4.1 root ( hd0, 1 ) 通过 root 指令指定下面的指令所读取的文件位于hda磁盘的2 分区4.2 kernel / boot/ lfskernel- 2.6 .22 .5 root= / dev/ hda2 通过 kernel 指令1. 加载 / boot/ lfskernel- 2.6 .22 . 5 ( 内核) 到内存2. 设置bootargs为root= / dev/ hda23. 将控制权移交给加载到内存中的内核