Centos6/Centos7系统启动流程及启动过程中诸多问题的解决

12节:Centos6/Centos7系统启动流程及GRUB stage三个阶段相关问题的解决

12.0 系统启动流程是怎样的?

Centos6系统

  1. 加电自检加载BIOS阶段:开机按下电源键,计算机加电,开始加载BIOS即基本输入输出系统,其中涉及到诸如CPU,内存,硬盘的硬件信息和设备启动顺序,时钟等信息。

  2. MBR读取阶段:计算机查找硬盘第一个扇区即MBR扇区(BIOS指定),将该扇区前446字节即Bootloader加载到内存,准备进行系统引导。

  3. GRUB引导阶段:三个阶段的文件包括了:stage1,stage1.5,stage2。

    • stage1即Bootloader(MBR扇区的前446字节内容)通过里面文件内容(涵盖指定加载地址)来定位加载stage1.5;
    • stage1.5作为stage1和stage2的过渡,目的是**/boot分区文件系统**,即加载MBR扇区后27个扇区的内容到内存;从此Stage1通过Stage1.5就有了识别文件系统的能力,从而开始加载Stage2;
    • stage2通过读取/boot/grub下(已经在Stage1.5加载了)的grub.conf文件查找并加载内核文件,准备将控制权交给Linux;平时开机启动看到的grub选项信息,grub背景等信息,都是stage2阶段提供的。
  4. 内核引导阶段:对内核文件进行解压,解压到内存中,内核启动;之后内核通过initramfs临时文件系统释放根文件系统,然后切换到/sbin/init程序;

  5. init程序运行阶段:

    • init进程是第一个进程,由于是元进程,首先会读取/etc/inittab文件以谁当系统的运行级别;
    • 然后init程序加载/etc/rc.d/rc.sysinit这一个用户层文件,这个文件涵盖了:设置内核参数/etc/sysctl.conf,启用swap,读写模式挂载root分区,检查并挂载/etc/fstab中其他的文件系统等;
    • 根据设定的系统运行界别,系统运行rc0.d至rc6.0目录下的脚本程序,完成系统初始化所需的服务,目录下的文件如果以K开头,表示停止对应服务,以S开头表示启动对应服务,SK之后的数字表示启动顺序编号,编号越小表示越早执行;
    • 系统启动完相应服务后,执行/etc/rc.d/rc.local文件,系统按照文件内容逐行的执行开机启动任务;
    • 系统执行/bin/lgin程序,用户输入用户名和密码登录系统,登陆成功后系统加载配置文件,进入shell终端

    Linux操作系统启动完毕

12.1 stage1阶段文件损坏修复

Centos6系统

  • 先备份扇区文件,再模拟损坏,删除MBR分区前446字节(如果是虚拟机系统模拟,请你提前拍一下快照),最后init 6 重启系统,系统硬盘不再具有启动功能,直接进入下一引导的启动设备

在这里插入图片描述
在这里插入图片描述

  • 重启系统后进入如下模式
    在这里插入图片描述

  • 选择 Rescue installed system 进入救援模式

    • 选择语言US

    • 选择是否配置网卡,no

    • 切换根目录提示,选择continue,再选择ok,最后选择运行shell,如下
      在这里插入图片描述
      在这里插入图片描述

在这里插入图片描述

  • 输入命令

    1. #chroot /mnt/sysimage/ #改变磁盘根目录

    2. #grub-install /dev/sda #生成grub,此命令可恢复全阶段的grub内容

在这里插入图片描述

  • 执行完grub,sync命令更新磁盘。然后退出shell,重启系统

在这里插入图片描述

Centos7 系统

  • 方法同centos6修复过程一样
  • 需要注意修改的地方
系统启动如何进入救援模式?
界面选择:Troubleshooting,在选择:Rescue a CentOS system,然后执行chroot /mnt/sysimage切跟
安装命令:grub2-inatall /dev/sda   #带个2

12.2 GRUB stage1.5阶段state2扇区(加载的/boot分区文件系统)损坏修复

Centos6系统

  • 模拟破坏

    dd if=/dev/zero of=/dev/sda bs=1 count=10000 skip=512 seek=512   
    #MBR后27个扇区的数据:原则上是512*27=13824字节,我们这里是从/dev/sda 的512字节后开始破坏,将10000个字节存储空间破坏清零
    
  • 参考12.5,方法一样

  • GRUB Stage2阶段文件损坏也采用同样办法

12.3 删除grub.conf , 通过重启系统进行修复

Centos7系统

Centos7系统使用Grub2版本引导系统,引导菜单启动从/boot自动生成,不是menu.lst手工配置。具体内容参照配置文件: /boot/grub2/grub.cfg 该文件每次执行grub2-mkconfig后自动生成,所以修改该文件在内核升级后会失效。

  1. 记录系统相关参数
[root@ ~ 06:12:14]#df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2       10190100 5330036   4319392  56% /     #重点记录根目录路径
...
[root@ ~ 06:08:30]#cat /etc/fstab                     #记录根分区和boot分区的UUID
#
# /etc/fstab
# Created by anaconda on Mon Jun 22 18:51:04 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=ea1d8d1c-3e80-4a6f-98cc-c83d8897ff86 /                       ext4    defaults        1 1
UUID=35521718-2203-497c-b690-d44622dc6704 /boot                   ext4    defaults        1 2
...

  1. 将/boot/grub2/grub.cfg移出此目录,后重启系统,主机进入如下界面
mv /boot/grub2/grub.cfg /root
init 6 #重启

在这里插入图片描述

  1. 查看当下磁盘信息

在这里插入图片描述

  1. 变量设置(通过tab键补全路径)
grub> set root=(hd0,msdos1)  #设置boot分区
grub> linux /vmlinuz-3.10.0-862.e17.x86_64 ro root=/dev/sda2#root=系统根分区路径或UUID=?
grub> initrd /initramfs-3.10.0-862.e17.x86_64.img #内核初始化环境变量设置
grub> boot #启动系统
  1. 成功登陆系统,重新生成grub.cfg文件
grub2-mkconfig -o /boot/grub2/grub.cfg

在这里插入图片描述

如果在grub模式下不知道根分区路径,那么以上方法就无法进行下去,此时就需要进行光盘引导方式来进入:

  1. 开机的时候不断按下键盘左上角的Esc按键,出现菜单选择窗口后,选择3 CD-ROM Driver,再选择rescue installed system即进入拯救/救援模式

  2. 可以选择不允许网络配置

  3. 提示切跟:你选择ok
    chroot /mnt/sysimage #切根:暂时改变系统根目录

  4. grub2-mkconfig -o /boot/grub2/grub.cfg #当前目录已经是系统根目录

  5. exit #退出

  6. reboot重启

Centos6系统

配置文件*:/boot/grub/grub.conf,保证grub和内核等在一个目录;此外它创建了一个链接文件/etc/grub.conf指向配置文件来保证用户使用配置文件一致性*

  1. 记录系统相关参数(重点:根分区挂载点,有些是逻辑卷,我的系统是/dev/sda3)

在这里插入图片描述

  1. 将grub.conf移出目录

在这里插入图片描述

  1. 重启系统init 6,弹出grub启动命令行

在这里插入图片描述

  1. 执行参数配置命令后,执行boot重启

在这里插入图片描述

  1. 重新登陆系统还原grub.conf到 /boot/grub目录下(如果是移动的话那就用mv命令将文件移回去)

在这里插入图片描述

12.4 Linux Login阶段:忘记Linux系统密码,进单用户模式恢复用户密码

Linux系统运行级别由六级,单用户模式为1级;单用户模式登陆系统主要被用来修改系统root密码。并不是谁都可以进入单用户模式,我们只能通过本地电脑前登陆单用户模式系统,而无法进行远程登陆(诸多ssh服务不会提供1运行级别)。

运行级别 说明
0 关机,系统默认运行级别不能设置为0,否则不能正常启动,一开机就自动关机。
1 单用户模式,root权限,用于系统维护,禁止远程登陆。
2 多用户模式,没有NFS网络支持。
3 完整的多用户文本模式,有NFS,登陆后进入控制台命令行模式。平时登陆到系统是这个模式
4 系统未使用,保留一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。
5 图形化模式,登陆后进入图形GUI模式或GNOME、KDE图形化界面,如X Window系统。
6 重启模式,默认运行级别不能设为6,否则不能正常启动,就会一直开机重启开机重启。

Centos7系统

  1. init 6 重启系统,在读秒界面 按字母e键,进入编辑模式

在这里插入图片描述

  1. 找到 ro 字串所在的行,将ro 改为’rw init=/sysroot/bin/sh’,修改后按ctrl+x进入用用户模式

在这里插入图片描述

  1. 进入单用户模式后,输入下面命令修改密码

在这里插入图片描述

  1. 剩余步骤
touch /.autorelabel #修改完密码后要创建的文件以让selinux生效(无创建则无法重启)
exit #退出chroot
reboot #重启系统,生效

Centos6系统

  1. 启动系统,开机引导的时候,按下任意键(e),进入grub菜单界面,如下
    在这里插入图片描述

  2. 根据grub菜单界面底部的帮助提示,按下字母a键进行系统引导前的内核参数修改,在在kernel 一行的最后加上+空格+single,回车

在这里插入图片描述

  1. 启动系统,即进入单用户模式,开始修改密码
    在这里插入图片描述

12.5 给grub加密

Centos7系统

为什么要给grub加密?因为如果不给grub加密,其他用户可以任意进入单用户模式修改系统账号密码,存在安全风险。

  • 查看当前centos版本

在这里插入图片描述

  • 设置密码(保存好)
[root@ ~ 11:13:00]#grub2-mkpasswd-pbkdf2
Enter password: 
Reenter password: 
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.216202CEB237E45256DD02E80D7FAC425A4CAEEEED8850541CAB02D19A138DF224AEB2603A7CE9A7C0BE6C3FA94015AA95091B8DFE67F308AA00972FA43C0EA6.50165007B8DC1514BF95859DD8852B0AF922E0BF60773382D721A33D1A1F6C308B53C81821A850074162A3DAC95A4D087298A2EF1C61B7232E7CC431DF2CBE58
  • 修改配置文件
[root@ ~ 11:13:27]#vim /etc/grub.d/00_header
cat <<EOF
set superusers='root'  #单用户使用的用户名
password_pbkdf2 root grub.pbkdf2.sha512.10000.216202CEB237E45256DD02E80D7F    AC425A4CAEEEED8850541CAB02D19A138DF224AEB2603A7CE9A7C0BE6C3FA94015AA95091B    8DFE67F308AA00972FA43C0EA6.50165007B8DC1514BF95859DD8852B0AF922E0BF6077338    2D721A33D1A1F6C308B53C81821A850074162A3DAC95A4D087298A2EF1C61B7232E7CC431D
F2CBE58   			   #尾部是加密密码,一定要加上,用于输入密码判定
EOF
  • 重新编译grub.cfg文件
[root@ ~ 11:22:38]#grub2-mkconfig -o /boot/grub2/grub.cfg 
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-862.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-862.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-09726f1d0db4408cbc2fe751f0b185ea
Found initrd image: /boot/initramfs-0-rescue-09726f1d0db4408cbc2fe751f0b185ea.img
done
  • init 6重启系统,在读秒界面,按字母e键,弹出grub登陆界面(grub加密生效),输入用户名和密码,按回车键;

在这里插入图片描述
在这里插入图片描述

Centos6系统

  1. 生成基于MD5算法的加密密码
[root@lin ~]# grub-md5-crypt
Password: 
Retype password: 
$1$mgqu/1$5vcAFwFSL4Xtb574S2.U30

2.在/boot/grub/grub.conf文件中添加密码串

[root@lin ~]# vi /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda3
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password --md5 $1$mgqu/1$5vcAFwFSL4Xtb574S2.U30  #添加在这里是对grub菜单整体加密,锁定编辑模式
title CentOS 6 (2.6.32-696.el6.x86_64)
#添加在这里是对某个菜单进行加密,不能锁定编辑模式
        root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=56*****3a-6**4-**4b-adb7-d40********e01 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-696.el6.x86_64.img
~
  1. 按init 6启动系统,按下任意键进入grub菜单界面,下面的提示要求按p键输入密码才能进入grub编辑模式
    在这里插入图片描述
    在这里插入图片描述

12.6 Boot分区下两个内核文件损坏,修复

Cntos6系统

1.参考12.1,进入救援模式;开启shell步骤;
bash-4.1# df
bash-4.1# mkdir /mnt/cdrom    
bash-4.1# mount /dev/sr0 /mnt/cdrom #挂载
bash-4.1# rpm -ivh /mnt/cdrom/Packages/kernel-******.x86_64.rpm --root=/mnt/sysimage --force                 #安装内核文件
bash-4.1# ls /mnt/sysimage/boot   #查看是否有内核文件
bash-4.1# reboot   #重启

Cnetos7系统

同上

12.7 Boot分区下内核文件损坏,且/etc/fstab文件也损坏

Centos6系统

  • 思路:先进入救援模式,通过临时文件系统/mnt/sysimage,寻找根分区
  • 先通过fdisk -l 查看所有分区
  • 创建一个目录文件逐个挂载分区到该目录文件下,直到文件下非空存在根分区文件
  • 修改挂载目录下的/etc/fstab文件,添加相关挂载条目,系统修复后再去完善其他条目木
  • 重启进入救援模式,修复boot内核文件,参考 12.6

12.8 Centos6系统第一个进程init.d文件损坏的修复

Centos6系统

1.进入救援模式
2.安装 rpm -ivh --force --root=/mnt/sysimage /mnt/cdrom/Packages/upstart-****.x86_64.rpm
3.查看安装情况:ls /mnt/sysimage/sbin/init
4.重启

12.9 那么/boot/grub下所有的文件都损坏呢?

1.进入救援模式安装内核文件:参考12.8
2.安装grub引导程序:参考12.1 就是生成grub目录
3.进入grub2目录安装grub.cfg ,参考12.3 第五步
4.重启系统

猜你喜欢

转载自blog.csdn.net/weixin_31789689/article/details/108219309