当前位置: 首页 > 工具软件 > GRUB > 使用案例 >

GRUB介绍 及 自建简版Linux(及 grub 修复)

微生毅
2023-12-01

grub 介绍

grub 含义

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

在 x86 架构的机器中,Linux、BSD 或其它Unix类的操作系统中GRUB、LILO 是大家最为常用,应该说是主流。

grub 版本

grub 现有两个版本,如下:

  • grub 0.x: grub legacy
  • grub 1.x: grub2

grub legacy 介绍

grub legacy 在引导安装系统的时候,一共分为如下阶段,如下:

  • stage 1:自检硬件没有问题后,BIOS将会直接去找硬盘的第一个扇区,找到前446字节,将mbr加载到内存中。
  • stage 1.5:mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统。
  • stage 2:读入/boot/grub/目录下相关的配置文件,开机启动的Grub选项、信息,还有修改GRUB背景等功能都是在相关的配置文件中进行体现的。配置文件路径:/boot/grub/grub.conf ← /etc/grub.conf,注意箭头,前面是真实的路径,后面是链接文件。

stage 2 阶段的功能

stage 2 及内核等通常放置于一个基本磁盘分区(注意是基本磁盘分区,mbr 无法驱动高级软设备LVM或软raid)。

  • 提供菜单、并提供交互式接口(即系统启动时的界面及交互接口)
选择相应编辑键,进入相应的配置模式:
	e: 编辑模式,用于编辑菜单
	c: 命令模式,交互式接口
  • 加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单
  • 为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证

识别硬件设备

在 stage 2 阶段读取相关配置文件的时候,需要指定相应的硬盘和分区去加载内核和ramdisk 文件,格式如下:

格式:(hd#,#)
字段含义:
	hd# :磁盘编号,用数字表示,从0开始编号
	  # :分区编号,用数字表示,从0开始编号
示例:
	(hd0,0) 代表 第一块硬盘的第一个分区

grub 命令行接口

以 CentOS 6 为例,在系统启动时,按 c 键进行交互接口,可进行如下命令配置。

help:获取帮助列表
help KEYWORD:带关键字,可以获取详细帮助信息
find (hd#,#) /PATH/TO/SOMEFILE:进行查找文件时,要指定硬盘才能生效
root (hd#,#):配置根文件所在位置
kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核文件
	# 额外还可以添加许多内核支持使用的cmdline参数,例如:
	#   init=/path/to/init, selinux=0
initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk
	# ramdisk版本必须要与内核版本完全一致
boot:引导启动选定的内核

也可以在 grub 命令行接口运用命令启动系统,配置如下:

grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE 
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot

grub 配置文件详解

grub 在系统启动时,是通过读取相关配置文件(/boot/grub/grub.conf)来显示启动界面的,如果配置文件丢失或者损坏,可以进行手动配置。

配置项含义如下:

default=#:设定默认启动的菜单项,编号从0开始(从上至下:0、1、2 、...)
timeout=#:指定菜单项等待选项选择的时长,超时后,直接选择默认启动的菜单项启动
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径
hiddenmenu:隐藏菜单
password [--md5] STRING: 菜单编辑认证
title TITLE:定义菜单项“标题”,可出现多次(以实现多个系统的选择)
	root (hd#,#):grub查找 stage 2 及 kernel 文件所在设备分区(此为 grub 的“根”,不是真正 rootfs 的根)
	kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
	initrd /PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件
	password [--md5] STRING:启动选定的内核或操作系统时进行认证

备注:
# STRING:密码字符串,输入相匹配的密码时,才允许编辑菜单或者启动选定的系统
# 使用 grub-md5-crypt 命令  生成密码串,输入上述 STRING 的位置中

单用户模式

可以按照以下操作,进入单用户模式。

(1) 编辑 grub 菜单(选定要编辑的 title,而后使用 e 命令)
(2) 在选定的 kernel 后附加(1, s, S 或 single 都可以)
(3) 在 kernel 所在行,键入“b”命令

grub 安装

可以用 grub-install 重新安装本机的 grub,或者对相应的硬盘安装 grub ,常用于修复 grub 文件。

# 重新安装本机的 grub 
grub-install

# 对相应的硬盘安装 grub
grub-install --root-directory=ROOT /dev/DISK

也可以在 grub 界面安装 grub 文件。

# 在系统启动时,按编辑键 e 进入到 grub 界面
grub> root (hd#,#)
grub> setup (hd#)

自建简版 Liunx

根据 Linux 系统的启动流程,可以自建一个简版的 Liunx ,会加深自己对 CentOS 启动流程的理解。

可以运用 VMware 对指定硬盘进行系统创建,并在新的 Liunx 系统中指定此硬盘,验证简版 Linux 。

硬盘添加

在 VMware 现有的 Linux 系统中,添加新的硬盘(大小20G,验证使用)。

创建 grub

对新增的硬盘创建 grub,操作顺序如下:

fdsik /dev/sdb
n				     # 创建新分区
p                    # 创建主分区
1					 # 创建 boot 分区
default              # 键入 Enter 使用默认值
+100M                # 大小为 100M 
n				     # 创建新分区
p                    # 创建主分区
2                    # 创建 swap 分区
default              # 键入 Enter 使用默认值
+2G                  # 大小为 2G
t                    # 修改分区类型
2                    # 修改第二个分区类型
82                   # 82 代表 swap 类型
n				     # 创建新分区
p                    # 创建主分区
3                    # 创建 root 分区
default              # 键入 Enter 使用默认值
+2G                  # 大小为 2G
w                    # 保存,退出

partx -a /dev/sdb    # 查看磁盘是否分区成功
cat /proc/partitions
[root@LeeMumu ~]# partx -a /dev/sdb
BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2
BLKPG: Device or resource busy
error adding partition 3
cat /proc/partitions

[root@LeeMumu ~]# cat /proc/partitions 
major minor  #blocks  name
	8        0   20971520 sda
	8        1     204800 sda1
	8        2   19741696 sda2
	8        3    1024000 sda3
	8       16   20971520 sdb
	8       17     112423 sdb1
	8       18    2104515 sdb2
	8       19    5253255 sdb3

[root@LeeMumu ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c0f69

	Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        2484    19741696   83  Linux
/dev/sda3            2484        2611     1024000   82  Linux swap / Solaris

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf973b675

	Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          14      112423+  83  Linux
/dev/sdb2              15         276     2104515   82  Linux swap / Solaris
/dev/sdb3             277         930     5253255   83  Linux
mke2fs -t ext4 /dev/sdb1      # 给 grub 分区创建文件系统
mkswap /dev/sdb2              # 给 swap 分区创建文件系统
mke2fs -t ext4 /dev/sdb3      # 给 root 分区创建文件系统
# 把 grub 分区挂载到 boot 目录下(此系统内的 boot 目录再使用,可以创建一个新的 boot 目录)
mkdir /mnt/boot         
mount /dev/sdb1 /mnt/boot/

ls /mnt/boot/                  # 显示挂载成功
lost+found

# 安装 grub ,指定 “根”,不需要指定到 boot 目录下,因为 grub 会主动去找 boot 目录
grub-install --root-directory=/mnt /dev/sdb   
ls /mnt/boot/
# 需要手动写配置文件,并且复制内核文件和ramdisk
ls /mnt/boot/grub/    
cp /boot/vmlinuz-3.10.0-957.el7.x86_64 /mnt/boot/vmlinuz
cp /boot/initramfs-3.10.0-957.el7.x86_64.img /mnt/boot/initramfs.img
vim /mnt/boot/grub/grub.conf
		default=0
		timeout=5
		title CentOS (Express)
			root (hd0,0)                                                   # 1
			kernel /vmlinuz ro root=/dev/sda3 selinux=0 init=/bin/bash    # 2
			initrd /initramfs.img                                          # 3

grub 配置文件,要注意以下几点:

  • # 1:一定要注意区分时几块硬盘,第一块就用0
  • # 2 :根文件系统要指定真正的根分区,虽然配置时是 sdb ,但如果在这块硬盘上单独起一个系统,这块硬盘就是第一块硬盘,所以指定硬盘时要变为 sda ;同时要指定第一个运行的用户空间的程序是 /bin/bash ,因为在新系统里我们只复制了一个 /bin/bash
  • # 3: 一定要和内核文件的版本保持一致,要没有版本号都没有版本号
mkdir /mnt/sysroot               # 挂载根文件系统
mount /dev/sdb3 /mnt/sysroot/
cd /mnt/sysroot/
ls
#创建基本目录
mkdir –pv /mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}  
cp /bin/bash /mnt/sysroot/bin    # 复制bash文件,单是 bash 不能直接使用,还需要把相应的库文件进行复制
ldd /bin/bash                    # 查看 bash 的库文件,复制时,目录路径一定要对应
chroot /mnt/sysroot              # 切换根系统,看根是否可用,除了内建命令其它命令都不能使用
sync                             # 用于强制被改变的内容立刻写入磁盘
# 查看 bash 的依赖库文件,并复制到新的文件系统中的 lib64 目录内
[root@LeeMumu sysroot]# ldd /bin/bash 
	linux-vdso.so.1 =>  (0x00007fffe36d9000)
	libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f5809d6f000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f5809b6b000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f58097d6000)
	/lib64/ld-linux-x86-64.so.2 (0x00005571c8339000)
[root@LeeMumu sysroot]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/
[root@LeeMumu sysroot]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
[root@LeeMumu sysroot]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/
[root@LeeMumu sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/

新建虚机

在 VMware 上新建一个虚机,选择已有磁盘(就是在上述操作中配置的硬盘)作为硬盘进行启动,并保持现有的文件格式,就能启动一个简易的 Linux 。

修复 grub

在系统 grub 文件损坏或缺失的情况下,如何对系统进行修复。
因为是自己演示和验证,所以先对 mbr 文件进行备份。

dd if=/dev/sda of=/root/mbr.bak count=1 ba=512

对现有系统的 grub 文件进行破坏,只需损坏 mbr 前446字节的数据。

dd if=/dev/zero of=/dev/sda count=1 ba=200
sync

直接修复

1.使用 grub-install 命令进行修复。

grub-install --root-directory=/ /dev/sda

2.在 grub 界面进行修复。

grub> root (hd0,0)
grub> setup (hd0)
grub> exit
sync

救援模式

如果系统已经重启,且无法出现 grub 界面,这时候就需要使用救援模式进行修复。
加载启动光盘,重启,进入 Rescue Istalled System 救援模式。

chroot /mnt/sysimage                          # 切换根系统
grub-install --root-directory=/ /dev/sda      # 安装 grub 文件
reboot                                        # 退出此根系统,然后重启
 类似资料: