CentOS 7启动流程和启动排错

CentOS 7启动流程和启动排错

文章目录

    • CentOS 7启动流程和启动排错
    • @[toc]
      • CentOS 7启动流程简述
      • CentOS 7破解root口令方法一
      • CentOS 7破解root口令方法二
      • CentOS 7进入救援模式
      • 修复删除GRUB2 stage 1-2导致的系统无法启动
        • 问题现象
        • 修复方法
      • 修复删除/boot/grub2/grub.cfg文件导致的系统无法启动
        • 问题现象
        • 解决方法
      • 修复删除/boot目录导致的系统启动故障
        • 问题现象
        • 解决方法
      • /etc/fstab文件错误导致的系统启动异常
        • 问题原因
        • 修复方法
      • 补充:设置内核参数
        • 调整启动时默认使用的内核
        • 设置CentOS 7系统使用传统网卡名称
      • 参考资料

CentOS 7启动流程简述

  1. UEFi或BIOS执行硬件初始化,运行POST加电自检,获取第一个可启动的设备;

  2. 读取并执行第一个启动设备内MBR中的boot Loader,进行引导装载,通过GRUB 1.5 stage中的内容进入boot分区,读取/boot/grub2/grub.cfg文件;

  3. 通过grub.cfg文件载入kernel和initramfs到内存中,在内存中kernel通过initramfs解压后生成的根目录,加载内核选项,完成内核初始化。启动第一个进程systemd,执行initrd.target下所有单元,启用核心功能,载入所需驱动程序,重新侦测周边硬件。最后,卸载initramfs的小型文件系统,挂载系统真正的根目录,开始后续的开机流程;

  4. 成功切换到根分区后,kernel会调用启动的第一个程序systemd,根据配置文件/etc/systemd/system/default.target,链接到默认运行的操作环境,一般是/usr/lib/systemd/system/目录下,multi-user.target 或 graphical.target 二者之一;

  5. 假定这里选择的默认运行环境是multi-user.target,接着下来systemd会去激活启动multi-usre.target所依赖到的服务;

    • Systemd执行local-fs.target和swap.target,挂载本机/etc/fstab文件中定义的文件系统和相关的内存交换空间;
    • Systemd执行sysinit.target,侦测加载硬件,载入所需核心模块,进行系统环境初始化;
    • Systemd执行basic.target,载入周边硬件驱动程序,设置防火墙和SELinux等相关任务,准备系统环境;
  6. Systemd启动multi-user.target下的服务,主要是启动下面两个目录下的服务;

    • /usr/lib/systemd/system/multi-user.target.wants/
    • /etc/systemd/system/multi-user.target.wants/
  7. Systemd执行multi-user.target下的/etc/rc.d/rc.local

  8. Systemd执行multi-user.target下的getty.target及相关的登陆服务;


CentOS 7破解root口令方法一

  1. 启动时在下图界面按任意键暂停启动,然后按e键进入编辑模式;

  1. 将光标移动到linux16开始的行,在行尾添加内核参数rd.break,然后按Ctrl+x启动系统;

  1. 以读写的方式重新挂载一下根分区,然后切根修改密码,在根目录下创建.autorelabel文件,exit退出后使用reboot重启正常登录。

    Note: 如果系统没有禁用SELinux,touch /.autorelabel这一步是必不可少的,如果缺少了这个文件会导致系统黑屏无法启动。


CentOS 7破解root口令方法二

  1. 启动时在下图界面按任意键暂停启动,然后按e键进入编辑模式;

  1. 将光标移动到linux16开始的行,在行尾添加内核参数rw init=/sysroot/bin/bash,然后按Ctrl+x启动系统;

  1. 启动后会进入一个如下图的字符界面,切根后更改密码,根目录下创建.autorelabel文件,exit退出后使用reboot重启正常登录。


CentOS 7进入救援模式

  1. 选择Troubleshooting排错,进入后选择Rescue救援模式启动。

  1. 输入1选择Continue,两下回车进入救援模式的shell界面;


修复删除GRUB2 stage 1-2导致的系统无法启动

问题现象

//破坏stage 1-2的命令
# dd if=/dev/zero of=/dev/sda bs=1 count=446
# dd if=/dev/zero of=/dev/sda bs=1 count=10240 skip=512 seek=512
# rm -rf /boot/grub*
# reboot

找不到可引导的启动设备,报错如下图:

修复方法

  1. 使用grub2-install重新安装GRUB2 stage 1-2的内容,需要注意这是在没有切根的情况下进行安装的,需要使用--root-directory选项指定根分区路径;grub2-install命令执行过程中会依赖/usr/lib/grub/目录中的文件,若救援的光盘系统中/usr/lib/grub/目录下没有自带,则需要chroot后使用grub2-install /dev/sda进行修复。

    • BIOS环境下修复grub2

      # grub2-install /dev/sda
      
    • UEFI环境下修复grub2

      # grub2-install
      
  2. 使用grub2-mkconfig命令生成grub.cfg配置文件,修复完成退出重启;


修复删除/boot/grub2/grub.cfg文件导致的系统无法启动

问题现象

无法通过grub.cfg文件加载内核进行启动,报错如下图:

解决方法

  1. 加载xfs文件系统模块;

  2. 设置根分区对应磁盘的位置,这里的根分区指的是boot分区,而非真正的根分区,(hd0,1)表示第一块磁盘的第一个分区;

  3. 指明内核文件的路径,指明真正根分区对应的磁盘分区名称,启动时禁用SELinux,防止SELinux打标签影响启动速度;

  4. 指明initramfs文件的路径,输入boot回车启动;

  5. 系统正常启动后,进入系统重新生成grub.cfg文件,否则下次重启还会出现这个故障。

**补充:**grub.cfg文件可以通过命令直接生成,不需要再手工进行编写,grub2-mkconfig命令会利用/etc/grub.d/目录中的模板和/etc/default/grub文件中的设置自动生成。


修复删除/boot目录导致的系统启动故障

问题现象

缺少启动的相关文件,报错见下图;

解决方法

  1. 进入救援模式,chroot切根,挂载光盘强制安装kernel软件包;
  2. 使用grub2-install命令生成grub2目录;
  3. 使用grub2-mkconfig命令生成/boot/grub2/grub.cfg配置文件;


/etc/fstab文件错误导致的系统启动异常

问题原因

在/etc/fstab文件有以下三种情况的错误时,系统会先尝试自动修复,若修复失败则进入emergency shell模式,提示用户修复。

  • 文件中设备的UUID错误或者不存在;

  • 文件中的挂载点不存在(systemd会先尝试创建,不成功则进入emergency shell);

  • 文件中的挂载选项不正确;

emergency shell模式:

修复方法

输入root口令,进入系统修复/etc/fstab文件,此时的系统是没有网络的,修复完成后重启即可;


补充:设置内核参数

调整启动时默认使用的内核

//方法一,根据grub.cfg配置文件中内核的顺序设置默认启动内核
# vim /etc/default/grub  
GRUB_DEFAULT=1	#设置默认的启动内核为第2个内核
# grub2-mkconfig -o /boot/grub2/grub.cfg	#重新生成grub.cfg配置文件
# reboot
//方法二,通过指定title名称的方式设定默认启动内核
# grep "^menuentry" /boot/grub2/grub.cfg	#查看系统内部有多少个内核
# grub2-set-default "CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)"		
# grub2-editenv list 	#验证是否配置成功

设置CentOS 7系统使用传统网卡名称

//Note: 在设置完成网卡名称后,需要修改相应的ifcfg-ens32配置文件中的设备名称,否则网络服务无法正常使用。
# sed -ri '/GRUB_CMDLINE_LINUX=/s/"$/ net.ifnames=0"/' /etc/default/grub
# grub2-mkconfig -o /boot/grub2/grub.cfg
# reboot

参考资料

# man 7 BOOTUP

你可能感兴趣的:(linux,centos)