GRUB介绍 及 自建简单Linux

  • grub 介绍
    • grub 含义
    • grub 版本
    • grub legacy 介绍
      • stage 2 阶段的功能
      • 识别硬件设备
      • grub 命令行接口
      • grub 配置文件详解
      • 单用户模式
      • grub 安装
  • 自建简版 Liunx
    • 硬盘添加
    • 创建 grub
    • 新建虚机
  • 修复 grub
    • 直接修复
    • 救援模式

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  name8        0   20971520 sda8        1     204800 sda18        2   19741696 sda28        3    1024000 sda38       16   20971520 sdb8       17     112423 sdb18       18    2104515 sdb28       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: 0x000c0f69Device 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 / SolarisDisk /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: 0xf973b675Device 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.confdefault=0timeout=5title CentOS (Express)root (hd0,0)                                                   # 1kernel /vmlinuz ro root=/dev/sda3 selinux=0 init=/bin/bash    # 2initrd /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                                        # 退出此根系统,然后重启

GRUB介绍 及 自建简版Linux(及 grub 修复)相关推荐

  1. win7 安装深度linux系统安装教程,深度技术win7旗舰版linux虚拟机安装教程

    有用户在问,想在win7系统的用户想在虚拟机中安装linux系统,却不知Win7怎么进行linux虚拟机安装呢?方法其实并不复杂,下面介绍深度技术win7旗舰版linux虚拟机安装教程. 1.想要在w ...

  2. linux升级grub,如何更新 grub在 Ubuntu 或其他 Linux 发行版上

    在这篇文章中,你将学习在 Ubuntu 或任何其它 Linux 发行版上更新 grub .你也将学习一个或两个关于更新这个 grub 过程如何工作的事情. -- Abhishek Prakash 在这 ...

  3. linux下的grub介绍

    grub是linux主流的引导程序统一资源引导器,它的工作是提供一个菜单,允许用户选择要启动的系统或不同的内核版本:把用户选定的内核装载到RAM中的特定空间中,然后解压.展开,而后把系统控制权移交给内 ...

  4. linux安装到什么硬盘比较好,硬盘安装四大发行版Linux比较

    硬盘安装四大发行版Linux比较 发布时间:2007-10-05 00:06:45来源:红联作者:Oracleust 这是我安装 Fedora2 , Mandrake10 , SuSE9pro 和 S ...

  5. Dockerfile 简版大全,附赠编写实例

    基础镜像可以用于创建Docker容器.镜像可以非常基础,仅仅包含操作系统:也可以非常丰富,包含灵巧的应用栈,随时可以发布.当你在使用Docker构建镜像的时候,每一个命令都会在前一个命令的基础上形成一 ...

  6. 01.基于Irises的springboot项目框架(简版)

    01.基于Irises的springboot项目框架(简版) 介绍 基于Irises搭建的springboot单体应用框架(简版),支持Mybatis-plus.sql分析与打印.swagger.kk ...

  7. wingrub命令行启动深度linux,用GRUB(包括WINGRUB)命令行模式引导安装Linux

    作者: 北南南北 来自: LinuxSir.Org 提要: Linux的安装过程的引导有几种方法,一种是在DOS下通过loadlin进行安装:一种是通过lilo系统引导管理器进行引导: 还有一种就是通 ...

  8. u盘版linux initramfs,探索Linux系统的启动过程

    阅读目录 引言 Linux启动过程概述 Grub加载Linux内核和initramfs 探索initramfs文件的方法 基于systemd的init系统 进入图形界面 这篇文章有点长,我花了大约两个 ...

  9. Atlas 200 DK开发者套件环境部署(1.0.9.alpha)极简版

    Atlas 200 DK开发者套件环境部署(1.0.9.alpha)极简版 前言 Atlas 200 DK开发者套件介绍 环境部署介绍 资源要求 开发环境部署 安装Docker 获取镜像(两种方法任选 ...

最新文章

  1. JAVA 上加密算法的实现用例---转载
  2. 提高BSEG处理效率
  3. 用WindowManager实现Android悬浮框以及拖动事件
  4. php base64安全吗,php base64
  5. 今晚直播丨用高效的Oracle性能诊断工具,让运维工作轻松起来!
  6. aftool刷工具提示15天_【15天】【指数600+】关键词百度首页【实战分析】【面授学员】...
  7. 在C#中判断某个类是否实现了某个接口
  8. 让IIS支持中文文件名和目录
  9. 单反相机坏点和噪点测试软件,单反相机测试坏点和噪点的软件
  10. Git捷径,游戏搞定!
  11. 个人邮箱怎么申请?个人外贸邮箱推荐
  12. lattice diamond 安装及获取license方法
  13. MySQL高级篇——事务
  14. 计算机软件工程师考试试题,计算机考试软件工程师试题
  15. 删除oracle所有表外键,Oracle中查询、禁用、起用、删除表外键
  16. 【MATLAB项目实战】基于RGB特征的火焰检测
  17. 分享45个android实例源码,很好很强大
  18. 未来科学技十幻想画计算机,如何指导学生画科幻画
  19. .net 多线程之线程取消
  20. 支付项目:4、支付术语初体验

热门文章

  1. Cygwin环境的搭建
  2. 计算机测试杀毒软件的代码,检测你电脑的杀毒软件时候到了 一段代码测试杀毒软件...
  3. shell解析json之jq工具
  4. 大二上学期 自我总结
  5. iOS帐号证书之漫谈(二)—— 申请邓白氏码
  6. 算法复杂度分析(渐近记号)
  7. Mongodb 腾讯云部署
  8. 虽迟但到,我的2022年终总结
  9. 大专出身,28K上岸B站测开岗,光一面就花了我8个小时···
  10. linux tar 命令 解压文件到指定目录