当前位置 : 主页 > 操作系统 > centos >

Linux 云计算集群架构师->第十七章 Linux 系统启动原理及故障排除

来源:互联网 收集:自由互联 发布时间:2022-10-26
第十七章 Linux 系统启动原理及故障排除 (上课时间2021-07-10,笔记整理时间2021-07-22) 本节所讲内容: 17.1 centos6 系统启动过程及相关配置文件 17.2 centos8 系统启动过程及相关配置文件

第十七章 Linux 系统启动原理及故障排除

(上课时间2021-07-10,笔记整理时间2021-07-22)

本节所讲内容:

17.1 centos6 系统启动过程及相关配置文件

17.2 centos8 系统启动过程及相关配置文件

17.3 实战-加密 grub 防止通过 reboot 系统破解 root 密码*

17.4 实战-通过 liveCD 进入救援模式-重装 grub 修复损坏的系统

17.1 centos6 系统启动过程及相关配置文件

17.1.1 centos6 系统启动过程(了解)

  • 加载 BIOS(传统 BIOS) 的硬件信息,根据设定取得第一个可开机引导设置,如:光驱,硬盘,网络,USB。(shift++调整顺序)

  • 如果是硬盘为第一引导设备,读取硬盘中 MBR 主引导扇区中的 boot Loader 就是 grub 引导GRUB(GRand Unified Bootloader 简称“GRUB”)是一个来自 GNU 项目的多操作系统启动程序。

  • MBR 的硬盘的 0 柱面、0 磁头、1 扇区称为主引导扇区(也叫主引导记录 MBR)。

    它由三个部分组成,主引导程序、硬盘分区表 DPT(Disk Partition table)和硬盘有效标志(55AA)。

    为什么 MBR 分区表,只能分 4 个主分区?

    注:磁盘默认一个扇区大小为:512 字节。MBR 由以下 3 部分组成:

    **第一部分是:**主引导程序(boot loader)占 446 个字节。主引导程序,它负责从活动分区中装载,并运行系统引导程序。

    第二部分是: Partition table 区(分区表),即 DPT,占 64 个字节,硬盘中分区有多少以及每一分区的大小都记在其中。每个分区表项长 16 个字节,16 个字节来记录一个分区的信息,164=64 字节。

    为分区项 1、分区项 2、分区项 3、分区项 4。64 个字节,4 个分区表项,每个表项占用 16 个字节,(这就是为什么 MBR 分区体系只能分成 4 个区【我们平时看到的分区一般可以从 26 个字母中选取任意多个当做分区标识(多于 4 个),这是因为那些分区是逻辑分区,这里的 4 个分区指的是主分区和扩展分区的数目,而逻辑分区是在扩展分区中划分出来的,也叫做二级、三级扩展分区。】

    第三部分是: MBR 有效标识位,占 2 个字节,固定为 55AA。如果这个标志位 0x55AA,就认为这个是 MBR。55AA 作为可引导扇区的结束标志位。

    所以:16*4+446+2=512

    [root@centos83 ~]# dd if=/dev/sda of=mbr bs=1 count=512 记录了512+0 的读入 记录了512+0 的写出 512字节(512 B)已复制,0.00440488 秒,116 kB/秒 [root@centos83 ~]# hexdump -C mbr #-C:输出规范的十六进制和 ASCII 码 .............. 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|

    hexdump 主要用来查看二进制文件的 16 进制编码

  • 依据 主引导程序(grub) 的设定加载 Kernel 到内存中运行 ,Kernel 会开始侦测硬件并加载驱动程序; grub 主引导加载 Kernel 后,就会自动退出,把硬件的控制权交给 Kernel

  • 在硬件驱动成功后,Kernel 会主动执行 init 进程,而 init 进程会读取/etc/inittab 配置取得运行级别(runlevel) 信息;

  • init 执行 /etc/rc.d/rc.sysinit 脚本文件来准备软件执行的作业环境 (如网络、时区等、初始化环境);

  • init 执行 run-level 下各个服务并启动 (script 方式);

  • init 执行开机后自动运行脚本 /etc/rc.d/rc.local 文件;

  • init 执行虚拟终端机控制程序 mingetty 来启动 login 程序,最后就等待用户登入啦;

    如图:

  • image-20210720195952252

    17.1.2 Centos 启动相关的配置文件

    (1)/etc/profile 登录时,会执行。

    全局(公有)配置,不管是哪个用户,登录时都会读取该文件。

    (2)/ect/bashrc Ubuntu没有此文件,与之对应的是/ect/bash.bashrc

    bash.bashrc 是交互式shell的初始化文件。

    (3)~/.profile 某个用户读取的配置。

    若bash是以login方式执行时,读取~/.bash_profile,若它不存在,则读取~ /.bash_login,若前两者不存在,读取~ /.profile。

    另外,图形模式登录时,此文件将被读取,即使存在~/.bash_profile和~/.bash_login。

    (4)~/.bash_profile Unbutu默认没有此文件,可新建。

    只有 bash是以login形式执行时,才会读取此文件。通常该配置文件还会配置成去读取~/.bashrc。

    (5)~/.bashrc 该文件包含专用于某个用户的bash shell的bash信息,当该用户登录时以及每次打开新的shell时,该文件被读取.

    当 bash是以non-login形式执行时,读取此文件。若是以login形式执行,则不会读取此文件。

    (6)~/.bash_logout

    注销时,且是longin形式,此文件才会读取。也就是说,在文本模式注销时,此文件会被读取,图形模式注销时,此文件不会被读取。

    补充一点,/etc/rc.local是系统shell会执行的文件,linux启动后会退出的;/etc/profile 或 /etc/bash.bashrc是用户shell会的配置,我们一般的Shell是用户Shell的子进程,而非系统shell的子进程,所以如果在 /etc/rc.local中指定"alias ll='ls -a'"这样的别名,对登录系统后的shell是没用的。

    某网友总结如下:

    /etc/profile,/etc /bashrc 是系统全局环境变量设定

    /etc/profile与/etc/bashrc的区别?

    前一个主要用来设置一些系统变量,比如JAVA_HOME等等,后面一个主要用来保存一些bash的设置.

    ~/.profile,~ /.bashrc用户家目录下的私有环境变量设定

    当登入系统时候获得一个shell进程时,其读取环境设定档有三步

    1 首先读入的是全局环境变量设定档/etc/profile,然后根据其内容读取额外的设定的文档,如/etc/profile.d和 /etc/inputrc

    2 然后根据不同使用者帐号,去其家目录读取~/.bash_profile,如果这读取不了就读取~/.bash_login,这个也读取不了才会读取

    ~/.profile,这三个文档设定基本上是一样的,读取有优先关系

    3 然后在根据用户帐号读取~/.bashrc

    至于~/.profile与~/.bashrc的区别,都具有个性化定制功能

    ~/.profile可以设定本用户专有的路径,环境变量,等,它只能登入的时候执行一次

    ~/.bashrc也是某用户专有设定文档,可以设定路径,命令别名,每次shell script的执行都会使用它一次

    下面是几个例子:

    \1. 图形模式登录时,顺序读取:/etc/profile和~/.profile

    \2. 图形模式登录后,打开终端时,顺序读取:/etc/bash.bashrc和~/.bashrc

    \3. 文本模式登录时,顺序读取:/etc/bash.bashrc,/etc/profile和~/.bash_profile

    \4. 从其它用户su到该用户,则分两种情况:

    (1)如果带-l参数(或-参数,--login参数),如:su -l username,则bash是lonin的,它将顺序读取以下配置文件:/etc/bash.bashrc,/etc/profile和~ /.bash_profile。

    (2)如果没有带-l参数,则bash是non-login的,它将顺序读取:/etc/bash.bashrc和~/.bashrc

    \5. 注销时,或退出su登录的用户,如果是longin方式,那么bash会读取:~/.bash_logout

    \6. 执行自定义的shell文件时,若使用“bash -l a.sh”的方式,则bash会读取行:/etc/profile和~/.bash_profile,若使用其它方式,如:bash a.sh, ./a.sh,sh a.sh(这个不属于bash shell),则不会读取上面的任何文件。

    \7. 上面的例子凡是读取到~/.bash_profile的,若该文件不存在,则读取~/.bash_login,若前两者不存在,读取~ /.profile。

    启动对应级别下的服务如: init 3 级别

    /etc/rc.d/rc3.d/(这里的程序/服务 S 开头的全部开机执行;K 开头的表示开机不执行,表明了关机时顺序)

    rcn.d (n 为 1 到 6) 是对应于不同的 runlevel 下起不同的服务. 这些目录下都是一些符号连接, 连接/etc/rc.d/init.d 下的一些文件.以 S 开头的软连接表示 on 启动, 以 K 开头的表示为 off 关闭.

    第一个字母后面的数值是一个优先级.

    [root@centos83 ~]# ls /etc/rc.d #init.d 里面放的是脚本 init.d rc1.d rc3.d rc5.d rc.local rc0.d rc2.d rc4.d rc6.d [root@centos83 ~]# ls /etc/rc.d/rc5.d/ #rc5.d 图形模式 K50netconsole S10network S64mysqld [root@centos83 ~]# ls /etc/rc.d/rc0.d/ #rc0.d 就是关机模式,里面只启动 2 个软连接 K36mysqld K50netconsole K90network [root@centos83 ~]# ls /etc/rc.d/rc6.d/ #rc6.d 重启模式,只启动 2 个软连接 K36mysqld K50netconsole K90network [root@centos83 ~]# ll /etc/rc.d/rc5.d/ | grep network lrwxrwxrwx. 1 root root 17 8月 17 2020 S10network -> ../init.d/network

    表示network 是第 10 个启动的服务。 所以 init 是顺序启动系统,需要一个一个服务启动成功,再执行下一步操作,启动系统比较慢。而 centos8 中的 systemd 第一个启动,然后 systemd 可以并行启动多个服务,启动比较快。

    [root@centos83 ~]# vim /etc/rc.d/init.d/network #! /bin/bash # # network Bring up/down networking # # chkconfig: 2345 10 90 #看有 chkconfig 的那一行, 2345 表示在 runlevel 2 3 4 5 下被启动, 10 是为此服务的启动顺序, 90 为关机时关闭此服务的顺序。 [root@centos83 ~]# ll /etc/rc.d/rc0.d/ | grep network lrwxrwxrwx. 1 root root 17 8月 17 2020 K90network -> ../init.d/network [root@centos83 ~]# ll /etc/rc.d/rc2.d/ | grep network lrwxrwxrwx. 1 root root 17 8月 17 2020 S10network -> ../init.d/network [root@centos83 ~]# ll /etc/rc.d/rc3.d/ | grep network lrwxrwxrwx. 1 root root 17 8月 17 2020 S10network -> ../init.d/network [root@centos83 ~]# ll /etc/rc.d/rc4.d/ | grep network lrwxrwxrwx. 1 root root 17 8月 17 2020 S10network -> ../init.d/network [root@centos83 ~]# ll /etc/rc.d/rc5.d/ | grep network lrwxrwxrwx. 1 root root 17 8月 17 2020 S10network -> ../init.d/network

    Linux下默认使用 chkconfig 查看服务在那个级别启动

    [root@centos83 ~]# chkconfig --list | grep network network 0:关 1:关 2:开 3:开 4:开 5:开 6:关 [root@centos83 ~]# ll /etc/rc.d/rc3.d | grep network #开机顺序 lrwxrwxrwx. 1 root root 17 8月 17 2020 S10network -> ../init.d/network [root@centos83 ~]# chkconfig network off [root@centos83 ~]# ll /etc/rc.d/rc3.d/ | grep network #只显示 K90 关机顺序了 lrwxrwxrwx 1 root root 17 7月 20 20:34 K90network -> ../init.d/networ [root@centos83 ~]# chkconfig --list | grep network #代表开机也不启动 network 0:关 1:关 2:关 3:关 4:关 5:关 6:关

    所有服务都运行成功后,设置开机自动执行某个命令: /etc/rc.local

    [root@centos83 ~]# vim /etc/rc.local [root@centos83 ~]# ll !$ ll /etc/rc.local lrwxrwxrwx. 1 root root 13 8月 17 2020 /etc/rc.local -> rc.d/rc.local [root@centos83 ~]# ll /etc/rc.d/rc.local

    17.2 centos8 系统启动过程及相关配置文件

    17.2.1 centos8 系统启动过程

    Centos8 启动流程:

    1.在按下电源之后,BIOS 会加载硬件信息并对硬件进行自检。

    2.在自检完成之后,会读取由 BIOS 设置的第一个可启动设备,此时可以读入 MBR 引导记录中的主引导程序(boot loader)。Boot Loader 就是在操作系统内核运行之前运行的一段程序,GRUB 是其中一种的引导程序的名称。

    3.主引导程序可以指定哪个内核(Kernel)文件来进行启动,并将被指定的内核加载到内存当中运行。

    4.在系统启动完成之后 Linux 才会调用外部程序开始准备软件执行的环境。并加载所有操作系统运行所需要的软件程序。

    1.加载 BIOS 或 UEFI 初始化,开机自检

  • 选择启动设备
  • 引导装载程序,centos6 是 grub,centos7 和 8 是 grub2
  • 加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
  • 加载内核选项
  • 加载 initramfs 初始化伪文件系统
  • 内核初始化,centos8 使用 systemd 代替 init
  • 执行 initrd.target 所有单元,包括挂载 /etc/fstab
  • 从 initramfs 根文件系统切换到磁盘根目录
  • systemd 执行默认 target 配置,配置文件/etc/systemd/system/default.target
  • systemd 执行 sysinit.target 初始化系统及 basic.target 准备操作系统
  • systemd 启动 mulit-user.target 下的本机与服务器服务
  • systemd 执行 multi-user.target 下的/etc/rc.d/rc.local
  • systemd 执行 multi-user.target 下的 getty.target 及登录服务
  • systemd 执行 graphical 需要的服务centos7/8 启动过程:
  • image-20210720212634786

    [root@centos83 ~]# ll -h /boot/grub2/i386-pc/core.img -rw-r--r--. 1 root root 27K 8月 17 2020 /boot/grub2/i386-pc/core.img [root@centos83 ~]# find /boot -name *img* /boot/grub2/i386-pc/core.img /boot/grub2/i386-pc/boot.img /boot/initramfs-0-rescue-189de0ebdba34f88b9c36f20a093ae01.img /boot/initramfs-3.10.0-862.el7.x86_64.img

    17.2.2 Systemd 运行原理-了解一下

    Systemd 概述:systemd 即为 system daemon [ˈdi:mən] 守护进程,是 linux 下的一种 init 软件,开发目标是系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低 Shell的系统开销的效果,最终代替现在常用的 System V 与 BSD 风格 init 程序。

    与多数发行版使用的 System V 风格 init 相比,systemd 采用了以下新技术: (1) 采用 Socket 激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能; (2) 用 Cgroups(资源调优和分配后面讲 docker 会讲到)代替 PID 来追踪进程,以此即使是两次 fork(分叉)之后生成的守护进程也不会脱离 systemd 的控制。(fork 进程生成子进程,子进程又生成子进程)

    unit 对象:unit 表示不同类型的 systemd 对象(就是服务器启动脚本),通过配置文件进行标识和配置;文件中主要包含了系统服务、监听 socket(套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象名,一个 ip 和一个端口就是一个套接字)、保存的系统快照以及其它与init 相关的信息。

    Systemd 配置文件:

    •/usr/lib/systemd/system/ #这个目录存储每个服务的启动脚本,类似于之前 6 系统的/etc/init.d/

    ls /usr/lib/systemd/system/Network

    •/run/systemd/system/ #系统执行过程中所产生的服务脚本,比上面目录优先运行

    •/etc/systemd/system/ #管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx 类的功能,比上面目录优先运行

    注意: 对于新创建的 unit 文件,或者修改了的 unit 文件,要通知 systemd 重载此配置文件,而后可以选择重启

    [root@centos83 ~]# systemctl daemon-reload

    重新加载,意为重读,有些服务的配置修改了,但是你不想重启服务,那么用这个就可以。

    总结:centos5-6-7 3 个系统版本启动过程:

    CentOS 5: SysV init ; CentOS 6: Upstart ; CentOS 7/8: Systemd

    image-20210720221133525

    17.2.3 管理系统服务

    命令: systemctl COMMAND name.service

    CentOS7/8

    [root@centos83 ~]# systemctl start name.service #启动某服务 [root@centos83 ~]# systemctl stop name.service #停止某服务 [root@centos83 ~]# systemctl restart name.service #重启某服务 [root@centos83 ~]# systemctl status name.service #查看某服务状态 [root@centos83 ~]# systemctl reload 或 restart name.service #重新加载服务配置文件

    CentOS6

    [root@centos63 ~]# service name start #启动 [root@centos63 ~]# service name stop #停止 [root@centos63 ~]# service name restart #重启 [root@centos63 ~]# service name status #状态

    chkconfig 命令的对应关系

    CentOS7/8

    [root@centos83 ~]# systemctl enable name.service #设定某服务开机自启 [root@centos83 ~]# systemctl disable name.service #设定某服务开机禁止启动 [root@centos83 ~]# systemctl list-unit-files --type service #查看所有服务的开机自启状态 [root@centos83 ~]# systemctl is-enabled name.service #查看服务是否开机自启

    CentOS6

    [root@centos83 ~]# chkconfig name on #设定某服务开机自启 [root@centos83 ~]# chkconfig name off #设定某服务开机禁止启动 [root@centos83 ~]# chkconfig --list #查看所有服务的开机自启状态 [root@centos83 ~]# chkconfig sshd --list #用来列出该服务在哪些运行级别下启用和禁用

    loaded:Unit 配置文件已处理

    active(running):一次或多次持续处理的运行

    active(exited):成功完成一次性的配置

    active(waiting):运行中,等待一个事件

    Inactive:不运行

    • enabled:允许开机启动

    • disabled:禁止开机启动

    • static: 表示该服务与其他服务相关联,不能单独设置该服务的启动状态

    17.2.4 运行级别

    centos6 下 Linux 运行级别 0-6 的各自含义

    0: 关机模式

    1:单用户模式 ,一用于破解 root 密码

    2:无网络,支持的多用户模式

    3:有网络支持的多用户模式(一般叫字符界面,工作中最长使用的模式)

    4:保留,未使用

    5:有网络支持,支持图形界面,支持的多用户模式(图形界面)

    6:重新引导系统,及重启

    可以在不同级别下,设置服务是否随系统启动运行。在 centOS7/8 上运行级别的含义已经和之前不同了,已由.target 来代替运行级别,我们可以称 target 为目标态,我们可以通过 target 定制更符合我们工作的运行环境。

    [root@centos83 ~]# ls /usr/lib/systemd/system/*.target #查看我们的机器上有多少个 target

    image-20210722183913509

    [root@centos83 ~]# ll /usr/lib/systemd/system/*.target | grep runlevel

    image-20210722184104706

    runlevel2-4 都是调用 multi-user.target 这个 unit。所以在 centos7/8 上 runlevel2-4是一个意思。

    [root@Centos83 ~]# systemctl list-unit-files --type target #查看所有 target 的状态 [root@Centos83 ~]# systemctl list-dependencies runlevel3.target #查看 3 级别 Unit 的所有依赖。

    Unit 之间存在依赖关系:A 依赖于 B,就意味着 Systemd 在启动 A 的时候,同时会去启动 B。也可以理解为 3 运行级别下都开启哪些服务,绿色的就是开启的。

    在 centOS7/8 上所谓的目标态,其实就是由各种指定的服务和基础 target 组合而成的。

    6 7 8 init systemd systemd Traditional runlevel New target name Symbolically linked to... Runlevel 0 runlevel0.target poweroff.target Runlevel 1 runlevel1.target rescue.target Runlevel 2 runlevel2.target multi-user.target Runlevel 3 runlevel3.target multi-user.target Runlevel 4 runlevel4.target multi-user.target Runlevel 5 runlevel5.target graphical.target Runlevel 6 runlevel6.target reboot.target

    Init 0 → systemctl poweroff 关机

    Init 1 → systemctl isolate rescue.target 单用户

    Init 3 → systemctl isolate multi-user.target 字符界面

    Init 5 → systemctl isolate graphical.target 图形化

    Init 6 → systemctl reboot 重启

    17.2.5 运行级别的切换

    1、在 centOS6 上,我们切换级别使用 init,在 centOS7 上虽然也能使用,但是调用的不再是原来 的程序了。centos7 使用 systemctl isolate name.target 来切换 target。

    #isolate [ˈaɪsəleɪt] 分离,隔离

    [root@Centos83 ~]# init 3 #切换到字符界面 [root@Centos83 ~]# init 5 #切换到图形界面 [root@Centos83 ~]# systemctl isolate multi-user.target #centos7 切换到字符界面 或: [root@Centos83 ~]# systemctl isolate runlevel3.target #centos7 切换到字符界面

    2、centos7 设置默认系统默认启动级别

    systemctl set-default name.target 来修改我们的目标态。

    [root@Centos83 ~]# ll /etc/systemd/system/default.target lrwxrwxrwx. 1 root root 41 8月 17 2020 /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target #其实就是创建了一个软链接到指定的 target 上去了 systemctl set-default multi-user.target #默认系统启动使用 3 级别字符界面 systemctl set-default graphical.target #默认系统启动使用 5 级别图形界面 systemctl get-default #查看默认启动级别

    17.2.6 grub2 和 grub 区别(了解)

    在 centOS6 上,我们的 grub 文件是/boot/grub/grub.conf

    在 centOS7/8 使用 grub2,配置文件改成/boot/grub2/grub.cfg 了,但是功能还是大致一样的都是用于加载内核的,不过在 centOS7/8 上设置默认启动项发生了一些变化。

    centos8 修改内核启动顺序

    [root@Centos83 ~]# vim /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="rd.lvm.lv=centos_centos64/root rd.lvm.lv=centos_centos64/swap rhgb quiet" GRUB_DISABLE_RECOVERY="true" 改:GRUB_DEFAULT= saved 为:GRUB_DEFAULT= 1 #这里改成 1,0 代表第一个内核,1 代表第二个。 [root@Centos83 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg #修改完成后,并没有立即生效,使用此命令来生成 grub.cfg 文件,我们在下次启动的时候就会默认选择新的默认内核。

    centos6 修改内核启动顺序-了解

    [root@Centos63 ~]# vim /boot/grub/grub.conf 改:10 default=0 为:10 default=1 [root@Centos63 ~]# reboot

    17.3 实战-加密 grub 防止***通过单用户系统破解 root 密码

    实战场景:如何防止别人恶意通过 reboot 系统破解 root 密码,进入系统窃取数据?

    给 grub 加密,不让别人通过 grub 进入单用户。

    17.3.1 基于 centos6 进行 grub 加密(了解)

    [root@Centos63 ~]# grub-md5-crypt Password: 123456 Retype password: 123456 $1$oaqo5$3d/cmTosm68jTw6o1wCu31 [root@Centos63 ~]# vim /boot/grub/grub.conf #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu 此列下进行添加 password --md5 $1$oaqo5$3d/cmTosm68jTw6o1wCu31 title Red Hat Enterprise Linux (2.6.32-220.el6.x86_64) root (hd0,0)

    17.3.2 基于 centos7/8 进行 grub 加密

    生成密码

    [root@Centos83 ~]# grub2-mkpasswd-pbkdf2 输入口令: Reenter password: PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.C7B7E957CF6B12CB769362C5F82398BC9F50E8C00AE8C1056F782D53C72212C25D0D44383555BD0ABF0A17B340E4B59E599E9A1BCB7F258C7DF0F1D68DF9BFD6.A2409EC54CECACD4EDD14C23E88341B977BF67F9261483B80E3D8BB928FD3216915AD10021EA6FCF997FD3C477BDEBBFEB038C6FB25CFF9840ED6C991116A02C

    image-20210722191950003

    password_pbkdf2 root 和 grub.pbkdf2.sha512. ……,不能换行,EOF结尾处不能有空格。

    [root@Centos83 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg #更新 grub 信息

    重启验证一下:

    image-20210722192555354

    输入用户名和密码

    image-20210722192651189

    看到可以进入 GRUB 菜单,就证明你加密成功了

    image-20210722192905089

    按 ctrl-x 开始启动

    17.4 实战-通过 liveCD 进入救模式-重装 grub 修复损坏的系统

    17.4.1 实战-当 MBR 引导记录损坏后-重装 grub 进行修复

    使用场景: 修复 MBR,主要出现在安装双系统时,后安装的系统把原来系统的 MBR 删除了,需要修复。

    第一步:在 centOS8 下破坏硬盘的前 446 字节:

    MBR 的硬盘的 0 柱面、0 磁头、1 扇区称为主引导扇区(也叫主引导记录 MBR)。它由三个部分组成,主引导程序、硬盘分区表 DPT(Disk Partition table)和硬盘有效标志(55AA)。

    注:磁盘默认一个扇区大小为:512 字节。MBR 由以下 3 部分组成:

    第一部分是:主引导程序(boot loader)占 446 个字节。主引导程序,它负责从活动分区中装载,并运行系统引导程序。

    [root@CT731 ~]#dd if=/dev/zero of=/dev/sda bs=1 count=446

    if:输入文件名;of:输出文件名;bs=1 一次一字节;count=446 复制 446 次

    446+0 records in

    446+0 records out

    446 bytes (446 B) copied,0.000758682 s,588 kB/s

    第二步:将 CentOS8 系统光盘挂载到虚拟机光驱上,重启计算机,修改 BIOS 引导顺序,让光盘启动。

    image-20210722195028579

    进入启动的界面 如果直接进入这个页面,说明是 bios 启动顺序是光盘优先,或者本来是硬盘优先,但是因为硬盘 mbr 前 446 个字节 boot loader 主引导程序找不到了,继续顺序启动 bios 设置的下一个设备。

    image-20210722195151941

    上面有三项,我们选择第三项进入 Troubleshooting 故障排除界面 ,进入第三项后,点击第二项,进入救援模式的CentOS 的系统。

    image-20210722195338152

    然后我们进入如下模式,选择 1,继续进行,接下来,我们就会进入到一个 shell 模式中,进行系统修复:

    image-20210722195945644

    使用场景:修复 MBR 主要出现在安装双系统时,后安装的系统把原系统的 MBR 删除了,需要修复

    image-20210722212449633

    SELinux 从禁用状态转变为启用时,重启系统会花费一段时间重新标记文件的上下文。

    17.4.2 实战-在 centOS8 下误删除 grub 文件进行修复

    第一步:删除 grub2

    [root@Centos83 ~]# rm -rf /boot/grub2

    第二步,重启计算机

    [root@Centos83 ~]# reboot

    进入如下界面:

    image-20210722200449611

    现在开始解决 grub -> 关闭客户机 ->重启系统,光盘引导系统,进入光盘救援模式,选择第三项,进入光盘救援(前提是挂载光盘)

    image-20210722213927443

    image-20210722214131261

    使用 live cd 进入救援模式后:1 回车

    image-20210722215117935

    bash-4.4# chroot /mnt/sysimage/ #切换根 bash-4.4# ls /boot/grub2/ #查看/boot/grub2 目录还不存在 bash-4.4# grub2-install /dev/sda #执行 grub2-install /dev/sda bash-4.4# ls /boot/grub2/ #查看,/boot/grub2 已经恢复 ,但是缺少 grub.cfg 文件

    接下来,我们需要生成配置文件:

    bash-4.4# grub2-mkconfig -o /boot/grub2/grub.cfg

    image-20210722220058645

    exit 然后,重启电脑:修改 BIOS 引导,让硬盘做第一引导

    总结:

    17.1 centos6 系统启动过程及相关配置文件

    17.2 centos8 系统启动过程及相关配置文件

    17.3 实战-加密 grub 防止通过 reboot 系统破解 root 密码

    17.4 实战-通过 liveCD 进入救援模式-重装 grub 修复损坏的系统

    网友评论