GRUB介绍 及 自建简版Linux(及 grub 修复)
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 修复)相关推荐
- win7 安装深度linux系统安装教程,深度技术win7旗舰版linux虚拟机安装教程
有用户在问,想在win7系统的用户想在虚拟机中安装linux系统,却不知Win7怎么进行linux虚拟机安装呢?方法其实并不复杂,下面介绍深度技术win7旗舰版linux虚拟机安装教程. 1.想要在w ...
- linux升级grub,如何更新 grub在 Ubuntu 或其他 Linux 发行版上
在这篇文章中,你将学习在 Ubuntu 或任何其它 Linux 发行版上更新 grub .你也将学习一个或两个关于更新这个 grub 过程如何工作的事情. -- Abhishek Prakash 在这 ...
- linux下的grub介绍
grub是linux主流的引导程序统一资源引导器,它的工作是提供一个菜单,允许用户选择要启动的系统或不同的内核版本:把用户选定的内核装载到RAM中的特定空间中,然后解压.展开,而后把系统控制权移交给内 ...
- linux安装到什么硬盘比较好,硬盘安装四大发行版Linux比较
硬盘安装四大发行版Linux比较 发布时间:2007-10-05 00:06:45来源:红联作者:Oracleust 这是我安装 Fedora2 , Mandrake10 , SuSE9pro 和 S ...
- Dockerfile 简版大全,附赠编写实例
基础镜像可以用于创建Docker容器.镜像可以非常基础,仅仅包含操作系统:也可以非常丰富,包含灵巧的应用栈,随时可以发布.当你在使用Docker构建镜像的时候,每一个命令都会在前一个命令的基础上形成一 ...
- 01.基于Irises的springboot项目框架(简版)
01.基于Irises的springboot项目框架(简版) 介绍 基于Irises搭建的springboot单体应用框架(简版),支持Mybatis-plus.sql分析与打印.swagger.kk ...
- wingrub命令行启动深度linux,用GRUB(包括WINGRUB)命令行模式引导安装Linux
作者: 北南南北 来自: LinuxSir.Org 提要: Linux的安装过程的引导有几种方法,一种是在DOS下通过loadlin进行安装:一种是通过lilo系统引导管理器进行引导: 还有一种就是通 ...
- u盘版linux initramfs,探索Linux系统的启动过程
阅读目录 引言 Linux启动过程概述 Grub加载Linux内核和initramfs 探索initramfs文件的方法 基于systemd的init系统 进入图形界面 这篇文章有点长,我花了大约两个 ...
- Atlas 200 DK开发者套件环境部署(1.0.9.alpha)极简版
Atlas 200 DK开发者套件环境部署(1.0.9.alpha)极简版 前言 Atlas 200 DK开发者套件介绍 环境部署介绍 资源要求 开发环境部署 安装Docker 获取镜像(两种方法任选 ...
最新文章
- JAVA 上加密算法的实现用例---转载
- 提高BSEG处理效率
- 用WindowManager实现Android悬浮框以及拖动事件
- php base64安全吗,php base64
- 今晚直播丨用高效的Oracle性能诊断工具,让运维工作轻松起来!
- aftool刷工具提示15天_【15天】【指数600+】关键词百度首页【实战分析】【面授学员】...
- 在C#中判断某个类是否实现了某个接口
- 让IIS支持中文文件名和目录
- 单反相机坏点和噪点测试软件,单反相机测试坏点和噪点的软件
- Git捷径,游戏搞定!
- 个人邮箱怎么申请?个人外贸邮箱推荐
- lattice diamond 安装及获取license方法
- MySQL高级篇——事务
- 计算机软件工程师考试试题,计算机考试软件工程师试题
- 删除oracle所有表外键,Oracle中查询、禁用、起用、删除表外键
- 【MATLAB项目实战】基于RGB特征的火焰检测
- 分享45个android实例源码,很好很强大
- 未来科学技十幻想画计算机,如何指导学生画科幻画
- .net 多线程之线程取消
- 支付项目:4、支付术语初体验