linux-bootloader--grub-leacy

GNU GRUBGRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数

 

对于BIOSMBR而言

grub位于磁盘的0磁头(盘面),0磁道,1扇区位置,该位置共计有512Byte,至于前446个字节是grub的关键程序。后面64字节存放硬盘的分区表DPT(Disk Partition Table),最后2个字节是固定的标志0x55AA。当BIOS把引导程序加载到内存后就把控制权交给grub,而后grub的剩余代码将完成其它代码的加载和搬移以及文件系统初始化查找等工作,最终加载内核映像文件,从而把控制权交给真正的内核运行。

目前,grub现有两个版本,0.x系列被称为是grub1,也被称为grub legacy,CentOS5以及CentOS6上用的是0.x系列;1.x系列被称为是grub2,用于CentOS7及之后版本

Grub的主要功能便是提供选择菜单,加载内核以及转移控制权,但是我们都知道,mbr中仅有446字节共mbr供其使用,想要实现诸多强大的功能这么小的空间是不可能的,所以,grub在实现上主要分为三个步骤,stage1stage1.5stage2,突破了传统446字节的限制。GRUB legacy 不支持 GPT 硬盘,Btrfs 文件系统和 UEFI 固件。

 

grub Stage

 

☆Stage1  由于受MBR的大小限制,步骤一所做的几乎只是装载GRUB的下一步骤(存放在硬盘的其它位置)。步骤1既可以直接装载步骤2,也可以装载步骤1.5然后载入步骤2。(其实在安装grub时,stage1正好是512字节的,和MBR到大小时相同,它就是MBR中bootloader的备份(包含分区信息,标志位等)。GRUB在安装时会把 stage1 拷贝到MBR,并根据 stage2的大小把stage1_5或stage2的磁盘位置信息嵌入 stage1中。

☆Stage1.5 stage1_5并不是一个文件,而是一系列到文件,如e2fs_stage1_5jfs_stage1_5等,它们都是正对不同到文件系统而存在的。Grub将根据/boot分区到文件系统类型(在系统安装的时候就已经确定好文件系统类型)选择对应镜像安装在硬盘最前面的32K(因为紧连着MBR的一段硬盘空间通常是空白无用的,grub就把1.5程序写到这个地方,这个地方没有文件系统,stage1程序可以直接去加载1.5。stage1负责将该区的stage1.5找出来并执行。对于使用 Ext文件系统的Linux都是使用的e2fs_stage1_5

☆Stage2   grub核心部分,运行后,会把系统切入保护模式,设置好C运行环境然后读取配置文件 /boot/grub/grub.conf或menu.lst等(如果没有配置文件则会直接进入命令行模式)。作用:a、提供菜单、并提供交互式接口;b、加载用户选择的内核或操作系统,并允许传递参数给内核;3、提供菜单保护机制

 

GRUB的命名约定

GRUB 所使用的硬盘/分区命名约定与 Linux 使用的命名约定不同。GRUB不区分IDE硬盘和SCSI硬盘,统一使用hdx。在 Linux 中,第一个硬盘的第五个分区称作 “hda5″。而 GRUB 把这个分区称作 “(hd0,4)”。GRUB 对硬盘和分区的编号都是从 0 开始计算。另外,硬盘和分区都用逗号分隔,整个表达式用括号括起。

ud 为 bean 原创的 fbinst 启动方式制作的隐藏分区

pd 为 pxe device ,即pxe设备

nd 为 network device ,网络驱动器,现已不常用

hd 为 hard device ,磁盘类设备,也可以用来指定任何 USB 存储设备

cd 为 cdrom device ,光驱类设备

fd 为 floppy device ,软驱类设备

 

GRUB的安装

grub的安装有两种方式:

grub-install   (直接命令安装)

grub ( grub>setup  |   grub>install)   (进入grub之后逐步安装)

 

使用grub-install:(推荐)

这种方式安装,不需要有boot目录,会自动安装(亦可用于系统盘创建)

使用方法:

SYNOPSIS

  grub-install [OPTION] install_device

 grub-install –root-directory=DIR /dev/DISK

( 如:    grub-install /dev/sda   )

DESCRIPTION

       Install GRUB on your drive.

       -h, –help

              print this message and exit

       -v, –version

              print the version information and exit

       –root-directory=DIR

              install GRUB images under the directory DIR instead of the root directory

       –grub-shell=FILE

              use FILE as the grub shell

       –no-floppy

              do not probe any floppy drive(不要探测任何软盘驱动器)

       –force-lba

              force GRUB to use LBA mode even for a buggy BIOS

       –recheck

              probe a device map even if it already exists

              This option is unreliable and its use is strongly discouraged.

       INSTALL_DEVICE can be a GRUB device name or a system device filename.

       grub-install  copies GRUB images into the DIR/boot directory specfied by –root-directory(所以不需要boot目录), and uses the grub shell to install grub into the boot sector.

 

进入grub模式安装:

命令:

help

blocklist FILE                         boot

cat FILE                               chainloader [–force] FILE

clear                                  color NORMAL [HIGHLIGHT]

configfile FILE                        device DRIVE DEVICE

displayapm                             displaymem

find FILENAME                          geometry DRIVE [CYLINDER HEAD SECTOR [

halt [–no-apm]                        help [–all] [PATTERN …]

hide PARTITION                         initrd FILE [ARG …]

kernel [–no-mem-option] [–type=TYPE] makeactive

map TO_DRIVE FROM_DRIVE                md5crypt

module FILE [ARG …]                  modulenounzip FILE [ARG …]

pager [FLAG]                           partnew PART TYPE START LEN

parttype PART TYPE                     quit

reboot                                 root [DEVICE [HDBIAS]]

rootnoverify [DEVICE [HDBIAS]]         serial [–unit=UNIT] [–port=PORT] [–

setkey [TO_KEY FROM_KEY]               setup [–prefix=DIR] [–stage2=STAGE2_

grub will attempt to avoid printing an terminal [–dumb] [–no-echo] [–no-ed

terminfo [–name=NAME –cursor-address testvbe MODE

unhide PARTITION                       uppermem KBYTES

vbeprobe [MODE]

安装方法:

一:使用setup:(grub模式中推荐的方式

setup: setup [–prefix=DIR] [–stage2=STAGE2_FILE] [–force-lba] INSTALL_DEVICE [IMAGE_DEVICE]

    Set up the installation of GRUB automatically. This command uses

    the more flexible command “install” in the backend and installs

    GRUB into the device INSTALL_DEVICE. If IMAGE_DEVICE is

    specified, then find the GRUB images in the device IMAGE_DEVICE,

    otherwise use the current “root device”, which can be set by the

    command “root”. If you know that your BIOS should support LBA but

    GRUB doesn’t work in LBA mode, specify the option `–force-lba’.

    If you install GRUB under the grub shell and you cannot unmount

    the partition where GRUB images reside, specify the option

    `–stage2′ to tell GRUB the file name under your OS.

root: root [DEVICE [HDBIAS]]

    Set the current “root device” to the device DEVICE, then attempt

    to mount it to get the partition size (for passing the partition

    descriptor in `ES:ESI’, used by some chain-loaded bootloaders),

    the BSD drive-type (for booting BSD kernels using their native

    boot format), and correctly determine  the PC partition where a

    BSD sub-partition is located. The optional HDBIAS parameter is a

    number to tell a BSD kernel how many BIOS drive numbers are on

    controllers before the current one. For example, if there is an

    IDE disk and a SCSI disk, and your FreeBSD root partition is on

    the SCSI disk, then use a `1′ for HDBIAS.

rootnoverify: rootnoverify [DEVICE [HDBIAS]]

    Similar to `root’, but don’t attempt to mount the partition. This

    is useful for when an OS is outside of the area of the disk that

    GRUB can read, but setting the correct root device is still

    desired. Note that the items mentioned in `root’ which derived

    from attempting the mount will NOT work correctly.

 

如果你不能够确定安装GRUB所在的分区号的话,可以通过find指令查找(不一定有效):

  grub> find /boot/grub/stage1

一般步骤:

grub>root (hd#,#)

grub>setup (hd#)  (安装在MBR)

grub>setup (hd#,#)  (安装在分区的引导扇区)

 

二、使用install

install: install [–stage2=STAGE2_FILE] [–force-lba] STAGE1 [d] DEVICE STAGE2 [ADDR] [p] [CONFIG_FILE] [REAL_CONFIG_FILE]

    Install STAGE1 on DEVICE, and install a blocklist for loading

    STAGE2 as a Stage 2. If the option `d’ is present, the Stage 1

    will always look for the disk where STAGE2 was installed, rather

    than using the booting drive. The Stage 2 will be loaded at

    address ADDR, which will be determined automatically if you don’t

    specify it. If the option `p’ or CONFIG_FILE is present, then the

    first block of Stage 2 is patched with new values of the

    partition and name of the configuration file used by the true

    Stage 2 (for a Stage 1.5, this is the name of the true Stage 2)

    at boot time. If STAGE2 is a Stage 1.5 and REAL_CONFIG_FILE is

    present, then the Stage 2 CONFIG_FILE is patched with the

    configuration filename REAL_CONFIG_FILE. If the option

    `–force-lba’ is specified, disable some sanity checks for LBA

    mode. If the option `–stage2′ is specified, rewrite the Stage 2

    via your OS’s filesystem instead of the raw device.

一般步骤:

STAGE1 DEVICE STAGE2是必不可少的,以下为示例:

grub>root (hd0,0)

grub>install (hd0,0)/grub/stage1 (hd0) (hd0,0)/grub/stage2 p (hd0,0)/grub/grub.conf

简写:

grub>root (hd0,0)

grub>install /grub/stage1 (hd0) /grub/stage2 p /grub/grub.conf

不同安装方式的区别:

grub-install 安装grub最常用的方式是在进入系统之后,通过grub-install脚本进行安装,通过这个脚本安装和其他两种方式有何不同呢?

1、grub-install脚本其实是通过grub的非交互模式,调用了setup命令安装grub的。[*]脚本的安装源是/usr/share/grub/x86_64-redhat/下的stage1、2和各种stage1.5,而前两种方式使用的源是/boot/grub/下的相同内容。所以通过grub-instal安装grub时,原先在/boot/grub下的stage文件都删除也没关系,该脚本每次执行都会删除这些文件的。反之,通过前两种方式安装的话,相应的stage文件是不可或缺的,否则会报错,安装失败。

2、[*]通过grub-install安装grub之后,如果我们删除了/boot/grub/下的stage2文件,系统会无法启动,报如下错:                                  GRUB loading stage 1.5

  GRUB loading, please wait…

  Error 15

但是,如果是通过grub>install方式安装的grub,删除/boot/grub/stage2就没有问题。因为通过grub>install安装grub,stage1是直接通过stage2所在的blocklist找stage2,我们删除或者改名stage2文件,文件的存放位置是不变的,因此能找到。而通过grub-install脚本,或者grub>setup,会智能的找到相应的stage1.5,例如:/grub/e2fs_stage1_5,然后通过stage1.5认识文件系统,是通过文件名去找stage2的,所以通过这两种方式安装的grub,不可删除或者改名/boot/grub/stage2。

 

GRUB的配置文件:

 #: 对菜单配置文件进行注释。

    default: 指定默认操作系统。如果为0,则没有用户输入时,自动启动第一段中显示的操作系统。

    timeout: 设置GRUB启动默认之前的时间极限(秒数)。在上图中为30秒。

    splashimage: 指定默认GRUB引导时所使用的背景图像的位置。

    hiddenmenu: 这个命令被使用时,它不显示GRUB菜单接口,在超时时间过期后载入默认项。用户通过按[Esc]键,可以看到标准的GRUB菜单。可以在其前加#或者删除来达到显示菜单借口的目的。

    title: 设置GRUB菜单中显示的选项。

    kernel: 指定Linux内核地址。

    initrd: 指定初始内存盘地址。

    rootnoverify: 对Windows 之类的敏感操作系统指定引导文件所在分区。

    chainloader: +1  表示对指定分区中第一个扇区寻找引导文件。

       password [–md5]: grub菜单 编辑认证(使用grub-md5-crypt之后把得到的字符串复制到此处即可)

 

系统盘制作思路:

新增一块磁盘或者其他,挂载之后,使用grub-install –root-directory=挂载点 /dev/磁盘名称

 

启动单用户模式以及救援模式:

(1) 编辑grub菜单(选定要编辑的title,而后使用e命令);

(2) 在选定的kernel后附加

1, s, S或single都可以;

(3) 在kernel所在行,键入“b”命令

进入单用户之后可以直接使用passwd修改root密码

忘记root密码和grub编辑认证的密码

1)重启按esc键选择光盘启动(要挂在本地镜像光盘)

 2)选择进入救援模式

 3)经过一系列的语言网络选择(网络配置选择no),我们终于来到了救援模式的shell界面,不过此时所在的并不是我们真的rootfs,所以我们需要切换到真正的root,即chroot /mnt/sysimage

 4)然后我们就可以编辑/boot/grub/配置文件,删除password加密的行

 5)exit后重新启动即可,此时grub的密码已经被我们取消了,root密码的问题也迎刃而解,即可以再救援模式修改,也可以在单用户修改密码(也可以直接重新安装grub解决问题。

进入rescue模式之后,自动扫描原系统的文件放置在/mnt/sysimage

chroot /mnt/sysimage    grub—install –root-directory=/ /dev/DISK

手动在grub命令行启动系统:

kernel /PATH 设置本次启动时用到的内核文件,还可以添加额外的许多内核参数,如:init=/path/xx , selinux=0 等

grub>root (hd#,#)

grub>kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE

grub> initrd /initramfs-VERSION-RELEASE.img(注意内核版本号和ramdisk版本号应该一致,否则无法被内核加载,为了省事,可以不使用版本号直接使用名为kernel initrd之类的符号链接)

grub> boot

 

双启动到windows

添加以下内容到你的 /boot/grub/menu.lst(注意此文件跟grub.conf实质上是同一个文件) 末尾 (假设你的 Windows 分区是第一个设备的第一个分区):

/boot/grub/menu.lst

 title Windows
rootnoverify (hd0,0)
makeactive(windows专用的激活分区的指令)
chainloader +1 (同样常用于windows)

注意:

  • 如果你尝试双启动到 Windows 7,你需要注释掉 makeactive 行。
  • Windows 2000 和之后的版本不需要在第一个分区就可以启动(与通常认为的不同)。如果 Windows 分区改变了 (也就是说,如果你在 Windows 分区的前面添加了一个分区),你需要编辑 Windows 的 boot.ini 文件来应对改变。
  • 如果 Windows 位于另一块硬盘,需要使用 map 命令。这会欺骗你的 Windows 安装程序,让它以为自己在主硬盘上。假设你的 Windows 分区是在第二块硬盘上的第一个分区:

/boot/grub/menu.lst

 title Windows
map (hd0) (hd1)
map (hd1) (hd0)
rootnoverify (hd1,0)
makeactive
chainloader +1

注意: 如果你尝试双启动到 Windows 7,你需要注释掉 makeactive 行。

 

 

双启动到 GNU/Linux

例如:

/boot/grub/menu.lst

 title Other Linux
root (hd0,2)
kernel /path/to/kernel root=/dev/sda3 ro
initrd /path/to/initrd

 

 

双启动 GNU/Linux (GRUB2)

如果其他 Linux 发行版用 GRUB2 (如:Ubuntu 9.10或者更高版本),而且你在它的/分区安装了启动装载程序, 你可以添加如下条目到你的 /boot/grub/menu.lst:

/boot/grub/menu.lst

 # other Linux using GRUB2
title Ubuntu
root (hd0,2)
kernel /boot/grub/core.img

在启动时选择这个条目就可以引导其他发行版的 GRUB2 菜单 (假设安装在 /dev/sda3)。

点赞

发表评论

电子邮件地址不会被公开。