1.系统启动流程

开机--->BIOS自检(需要检测的设备是否正常)--->磁盘的MBR分区--->BootLoader(引导加载器)加载内核--->识别各分区的文件系统

2.内核

什么是内核:内核其实也是一个软件(例如Linux内核用C语言开发),存放在磁盘的某个地方(例如sda1分区)。

不同的操作系统(内核不一样),文件系统也不一样。不同的操作系统一般不识别其他的文件系统,只有当内核运行起来后,才能识别分区中的文件系统。也就是说,操作系统是否能识别文件系统是由内核来决定的(例如NTFS的移动硬盘在Linux下可能无法识别)。

悖论:要加载内核,则需要去sda1中读取,要识别sda1的文件系统,则需要先加载内核。那么如何让我们在加载内核之前就能从sda1中读取内核代码呢?

3.如何加载内核

如上图,在https://www.cnblogs.com/leokale-zz/p/12543697.html 中我们知道,所有的分区是从第2048个扇区开始划分的,也就是说前面的2048个扇区是空着的。目前我们只知道第1个扇区有一个MBR,其中包含分区表和Bootloader等东西。

如何在文件系统中找到内核:

1)bootloader实际上是从grub的stage1这段代码反汇编出来的,作用就是用来加载第二个扇区(即MBR后面一个扇区的内容)。

2)第二个扇区里存放着grub的stage1.5反汇编出来的代码,作用是加载第3~n个扇区。

3)第3~n个扇区里存储的是一个极精简的fs,但是可以让我们读懂文件系统了。至于n是多大,要根据我们需要识别的文件系统(例如/boot分区)来决定。

4)内核在什么地方呢?是在/boot/grub2/grub.cfg配置文件中指定的。

4.如何修改grub配置文件(永久修改内核参数)

当我们想要修改内核参数时,我们不能直接对 /boot/grub2/grub.cfg 进行修改。

我们需要先修改 /etc/default/grub ,然后执行一个命令:

grub2-mkconfig -o /boot/grub2/grub.cfg

意思是将/etc/default/grub中我们修改的内容,转移到/boot/grub2/grub.cfg中生效。

例子,修改开机时内核选择的等待时间以及默认选择:

我们在开机时可以看到一个让我们选择内核的界面,倒数5s默认选择第一个内核。当然我们可以通过修改配置让其默认选择第二个:

# /etc/default/grub配置文件

GRUB_TIMEOUT=
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
#GRUB_DEFAULT=saved
GRUB_DEFAULT=
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap net.ifnames=0 biosdevname=0 rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

可以看到,我们将默认等待时间修改为10s,将默认选择修改为1(从0开始算,1表示第2个内核)。然后执行命令让其生效:

[root@centos7-test ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.-1062.18..el7.x86_64
Found initrd image: /boot/initramfs-3.10.-1062.18..el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.-.el7.x86_64
Found initrd image: /boot/initramfs-3.10.-.el7.x86_64.img
Found linux image: /boot/vmlinuz--rescue-f30a982c74c94344b2d0248c84efd1c8
Found initrd image: /boot/initramfs--rescue-f30a982c74c94344b2d0248c84efd1c8.img
done

重启看看:

可以看到,等待时间从5s变成了10s,并且默认选择了第2个内核。

除了以上例子中我们修改的内容,我们还可以修改 GRUB_CMDLINE_LINUX 的内容,为内核指定一些参数,例如aa=100(没有意义的参数)。

5.临时修改内核参数

在第4节中,我们进入系统对配置文件进行修改,修改后重启系统就可以让参数永久生效,直到下次手工修改参数。

如果我们想要临时修改内核参数,则可以在启动界面选择内核的时候按 "e" 进入内核编辑页面:

我们在其中添加一个自定义参数:

然后使用Ctrl+x来保存。

进入系统后,使用命令查看当前内核的参数信息:

[root@centos7-test ~]# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.-1062.18..el7.x86_64 root=/dev/mapper/centos-root ro
crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap net.ifnames= biosdevname= rhgb quiet bb=

可以看到我们添加的参数bb=200。这个参数是临时的,再次重启系统后参数消失。

[root@centos7-test ~]# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.-1062.18..el7.x86_64 root=/dev/mapper/centos-root ro
crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap net.ifnames= biosdevname= rhgb quiet

可以看到,重启后bb=200消失了。

6.rescue救援模式

我们正常启动系统的时候,有一些必须启动的服务,例如有20个。如果有一些服务出问题无法启动,则会导致系统无法正常启动。

这时,我们就可以使用rescue模式,因为rescue模式需要的必须服务比较少,例如10个。当出问题的服务,不在这10个服务当中,系统就可以启动起来。

如何进入rescue模式:

这样表示要进入rescue模式,相当于windows的安全模式。

注意:rescue模式进入系统也是需要root密码的。

可以看到,我们已经进入rescue模式,输入root密码即可进入系统。

6.emergency模式

当rescue模式都无法启动的时候,可以尝试使用emergency模式,这个模式比rescue模式需要的必须服务更少。

注意:emergency模式也相当于windows的安全模式,也是需要root密码的。

7.重置root密码

当我们忘记root密码时,可以对其进行重置。

1)选择内核时按e,进入编辑模式

2)进入命令行后,我们查看磁盘挂在的模式

在readonly模式下,我们是不能修改root密码的,所以我们要重新挂载一下。

3)重新挂载分区

4)重置selinux标签

5)执行命令,重启

8.给grub加密

为了使系统更加安全,我们可以给grub加个密码。也就是我们在选择内核的时候想进入编辑页面,必须要输入一个账户和密码。

使用明文密码:

修改/etc/grub.d/00_header文件:

cat <<EOF
set superusers="leo"
password leo
EOF

在最后加上以上内容,设置用户名为leo,密码为88888888。

然后执行命令生效:

grub2-mkconfig -o /boot/grub2/grub.cfg

重启,尝试进入内核编辑页面:

可以看到,要求我们输入账号和密码,我们输入leo 88888888即可。

使用密文密码:

前面我们在00_header中的密码使用的是明文,我们也可以对其进行加密(hash):

我们先生成密码88888888的hash值:

[root@centos7-test ~]# grub2-mkpasswd-pbkdf2
Enter password:
Reenter password:
PBKDF2 hash of your password is grub.pbkdf2.sha512..D9D6A857A18676310A354A83DFA825E95E9A643D0FC2B41DE60DB3C9D8B8FC958F70F22BF118767320FCD03A6859B7AEA2F2FF3975C1D2BE4569F828B14DE86A.F815B659D965CC890E4891CAF52A6471E4F0B825FFD5E84AAC684D7E799D9D3D430984E443396D191A3E3242E9B5A2ABE3241A1EB3F0C7C2622CF7850ADD591D

然后写入00_header文件:

cat <<EOF
set superusers="leo"
password_pbkdf2 leo grub.pbkdf2.sha512..D9D6A857A18676310A354A83DFA825E95E9A643D0FC2B41DE60DB3C9D8B8FC958F70F22BF118767320FCD03A6859B7AEA2F2FF3975C1D2BE4569F828B14DE86A.F815B659D965CC890E4891CAF52A6471E4F0B825FFD5E84AAC684D7E799D9D3D430984E443396D191A3E3242E9B5A2ABE3241A1EB3F0C7C2622CF7850ADD591D
EOF

然后执行命令让其生效:

grub2-mkconfig -o /boot/grub2/grub.cfg

8.系统超级救援模式

当同时出现以下情况时:

  • grub被加密,不知道账号密码
  • root密码也忘了

这时我们就可以使用以下要描述的救援方式。(以Vmware下的CentOS7为例)

1)使用系统对应版本的光盘

例如在虚拟机的CDROM一定要挂载光盘。

2)在重启显示VMware LOGO的时候,按ESC,选择从光盘启动

3)选择Troubleshooting

4)选择Rescue a CentOS system

注意:这里的rescue和前面第6节中的rescue是不一样的。

5)进入光盘中的系统

这种方式类似于windows下的winPE模式

我们按回车就可以得到一个shell命令行:

6)进入我们要修复的系统

注意:当我们获得sh-4.2#命令行的时候,我们还是在光盘操作系统中的。(这是相当于我们还是神)

待修复的系统目前是挂载到一个子目录下的:

使用命令,切换到被修复的系统根(投胎为人):

7)重置root密码、重置grub密码

当我们使用光盘系统进入待修复系统后,我们无需使用任何密码就可以获得最高权限。

重置root密码:

echo  | passwd --stdin root

重置grub密码:

vi /etc/grub.d/00_header

# 修改grub密码即可

9.重新安装grub

当grub被损坏(磁盘的前446字节,即bootloader被损坏),导致无法引导系统,我们可以重新安装grub引导程序。

参考第8节 超级救援模式,进入系统(这种模式是使用光盘系统帮助引导进入的)。

然后执行以下命令重建grub:

此时,重启即可:

9.boot目录损坏

当我们的/boot目录损坏,例如内核被删除等。我们使用删除/boot下所有文件来模拟故障:

重新启动:

可以看到,提示我们缺少一些文件。

可以通过以下步骤来恢复:

1)通过光盘引导进入系统(参考第8节)

可以看到,/boot下什么都没有。

2)重新安装内核

3)重新生成grub配置文件

因为位于/boot下的grub配置文件被删除了,所以我们要重新生成一份。

4)重新安装grub

不管grub是否损坏,都需要重新安装一下grub,因为/boot/grub2/下存放着grub需要的一些文件。

5)重新启动

发现已经可以启动了:

可以看到,这里显示的内核版本是我们重新安装的内核版本。

===

[RH134] 12-系统启动的更多相关文章

  1. python 各模块

    01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支 ...

  2. Python Standard Library

    Python Standard Library "We'd like to pretend that 'Fredrik' is a role, but even hundreds of vo ...

  3. 在mybatis中写sql语句的一些体会

    本文会使用一个案例,就mybatis的一些基础语法进行讲解.案例中使用到的数据库表和对象如下: article表:这个表存放的是文章的基础信息 -- ------------------------- ...

  4. 2. Linux-3.14.12内存管理笔记【系统启动阶段的memblock算法(2)】

    memory:表示可用可分配的内存: 结束完memblock算法初始化前的准备工作,回到memblock算法初始化及其算法实现上面.memblock是一个很简单的算法. memblock算法的实现是, ...

  5. 1. Linux-3.14.12内存管理笔记【系统启动阶段的memblock算法(1)】

    memblock算法是linux内核初始化阶段的一个内存分配器(它取代了原来的bootmem算法),实现较为简单.负责page allocator初始化之前的内存管理和分配请求. 分析memblock ...

  6. Jexus Web Server 完全傻瓜化图文配置教程(基于Ubuntu 12.04.3 64位)[内含Hyper-v 2012虚拟机镜像下载地址]

    1. 前言 近日有感许多新朋友想尝试使用Jexus,不过绝大多数都困惑徘徊在Linux如何安装啊,如何编译Mono啊,如何配置Jexus啊...等等基础问题,于是昨日向宇内流云兄提议,不如搞几个配置好 ...

  7. Linux学习之CentOS(二十一)--Linux系统启动详解

      在这篇随笔里面将对Linux系统的启动进行一个详细的解释!我的实验机器是CentOS6.4,当然对于现有的Linux发行版本,其系统的启动基本上都是一样的! 首先我们来看下Linux系统启动的几个 ...

  8. ubuntu14.04+nvidia driver+cuda8+cudnn5+tensorflow0.12

    文章在简书里面编辑的,复制过来貌似不太好看,还是到简书的页面看吧: http://www.jianshu.com/p/c89b97d052b7 1.安装环境简介: 硬件: cpu:i7 6700k g ...

  9. centos 6.5 升级内核 linux 3.12.17 (笔记 实测)

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Linux centos 2.6.32-431.el6.x86_64(Centos-6.5-x86_64-mi ...

  10. Linux系统启动过程分析

    [原创]Linux系统启动过程分析-wjlkoorey258-ChinaUnix博客http://blog.chinaunix.net/uid-23069658-id-3142047.html 经过对 ...

随机推荐

  1. Web_php_unserialize-攻防世界XCTF

    0x00 简介 记录一下,重点是记录一下那篇正则文章. 0x01 题目代码 <?php class Demo { private $file = 'index.php'; public func ...

  2. iOS事件的响应和传递机制

    跟二狗子哥哥交流的时候,他总说我,说的过程太业余.故 好好学习整理一下.努力不那么业余. 一.事件的产生.传递.响应: 1.事件从父控件依次传递到子控件,寻找最合适的子控件View. 2.寻找最合适的 ...

  3. android LoaderManger加载数据Tip

    要查看LoaderManager的具体介绍请看博客: LoaderManager介绍 使用时发现不管怎么调用getLoaderManager().restartLoader(LOADER_TYPE_Q ...

  4. 用一个python文件去调用另一个python文件,关于相对路径的处理?

    比如用a.py调用执行b.py,但是a.py和b.py路径环境不一样,而b.py中有使用相对路径读取文件,这时会报错,怎么在a.py中进行配置,使其调用b.py时路径和其相同,能否做到? 比如目录结构 ...

  5. 黑马程序员_毕向东_Java基础视频教程——逻辑运算符(随笔)

    逻辑运算符 逻辑运算符用于连接 boolean 型的表达式 & : 只要两边都是 boolean 表达结果,有一个为 false ,则结果就是 false 只要两边都为 true 则结果就为 ...

  6. HTML中id与name的通俗区别

    转自:https://blog.csdn.net/qq_35038153/article/details/70215356 https://zhidao.baidu.com/question/7582 ...

  7. 推荐一款复式记账软件——GnuCash

    本文需要搞清楚两个事情,第一,什么是复式记账:第二,GnuCash操作 复式记账,来自百度百科的解释:复式记账法是以资产与权益平衡关系作为记账基础,对于每一笔经济业务,都要以相等的金额在两个或两个以上 ...

  8. springmvc-初次接触

    一,mvc做的事情 1,将url映射到java类或者java的方法. 2,封装用户提交的数据 3,处理请求--调用相关的业务处理--封装想相应的数据 4,将相应数据进行渲染,jsp或者html 二,s ...

  9. python之robotframework+ride测试框架

    一.robotframework简介 Robot Framework是一款python编写的功能自动化测试框架.具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式 ...

  10. 【C++】常见易犯错误之数值类型取值溢出与截断(2)

    本节内容紧接上节,解决红色字体遗留问题.本节所有例子运行环境: win10 + VS2015 + X64 + debug 在上节例子中,查看变量 c .d .d+1 的类型. //// Console ...