当前位置: 代码迷 >> 综合 >> 基于LFS-6.3的 GRUB-0.97 实用教程
  详细解决方案

基于LFS-6.3的 GRUB-0.97 实用教程

热度:98   发布时间:2024-03-08 10:53:59.0
  • 前言
x86机器启动流程一般是BIOS->MBR->BOOTLOADER(LILO/GRUB)->kernel但对于 使用 GRUB-0.97 的 x86机器来说,有点不同GRUB-0.97 的主题有1.安装GRUB-0.972.配置GRUB-0.97配置文件3.GRUB-0.97如何启动

3. 基于GRUB-0.97的x86机器启动流程

  • 第一种启动流程(无stage1.5)
BIOS->MBR位置的stage1(属于GRUB-0.97)->/boot/grub/stage2(属于GRUB-0.97)->kernel
  • 第二种启动流程(有stage1.5)
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

  • 针对第一种启动流程的安装(无stage1.5)
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
  • 针对第二种启动流程的安装(有stage1.5)
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.53. 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.将控制权移交给加载到内存中的内核
  相关解决方案