• 系统启动流程


    一、系统启动流程

    在这里插入图片描述

    启动流程:
        1、BIOS加电自检、检测硬件、决定启动介质、找到引导扇区
        2、读取并且执行第一个开机设备中的MBR的bootloader(grub程序)
        3、依据bootloader设置去加载内核,内核开始侦测硬件并加载驱动程序
        
    如果是sysvinit启动程序
        4、内核启动init进程
        5、系统初始化
        6、init找到/etc/inittab文件,决定系统的运行级别(X)
        7、触发相应的运行级别的事件,运行/etc/rcX.d下的脚本
        8、执行/etc/rc.local文件,来到登录界面
        9、输入用户名密码,进入到系统中
        
    如果是systemd启动程序
        4、在硬件驱动加载成功后,内核会主动呼叫systemd程序,并default.target流程开机
            systemd执行sysinit.target初始化系统及basic.target准备操作系统
            systemd启动multi-user.target下的本机与服务器服务
            systemd执行multi-user.target下的/etc/rc.d/rc.local文件
            systemd执行multi-user.target下的getty.target及登录服务
            systemd执行graphical需要的服务
    
    boot loader主要功能如下:
        提供选单:用户可以选择不同的开机项目
        载入核心文件:直接指向可开机的程序区域来开始操作系统
        转交其他loader:将开机管理功能转交给其他Loader负责
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    内核在Linux中的存放位置为/boot分区下,主要有2个文件要被加载:
    vmlinuz-4.18.0-193.el8.x86_64 内核文件
    initramfs-4.18.0-193.el8.x86_64.img 虚拟文件系统

    查看initramfs文件里的内容:lsinitrd /boot/initramfs-4.18.0-193.el8.x86_64.img
    如果systemd默认的是multi-user.target,下面命令可以列出它加载的服务:systemctl list-dependencies multi-user.target
    在这里插入图片描述

    二、grub配置文件及排错

    从RHEL7用了grub2,而不再是grub了。
    
    MBR分区的前446个字节存放的是系统引导程序grub,中间64字节是分区表,最后2个字节表示结束。
    
    是grub是怎么工作的:
    1、BIOS自检,检查硬件;
    2、激活MBR,MBR上不存在文件系统,可以视作硬件一部分,因此可以被直接读取
    3、grub加载到内存,生成一个微系统,微系统内置了精简版的文件系统
    4、通过这个微系统,他会去引导分区,比如默认一般是sda1上去找内核文件如vmlinuz,然后再调用grub的配置文件。
    grub的主要把他的配置文件放在了3个地方。
    /boot/grub2/grub.cfg (/etc/grub2.cfg是/boot/grub2/grub.cfg文件的符号链接)
    /etc/grub.d/
    /etc/default/grub
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    他们的关系是 grub.cfg里面通过 ####BEGIN ##### 这种格式按照顺序调用/etc/grub.d里面的脚本实现不同的功能。grub.d目录里面有很多数字开头的脚本,按照从小到大的顺序执行。以00__header为例,他又会调用/etc/default/grub 配置文件来实现最基本的开机界面配置,如下所示:
    在这里插入图片描述

    例如:在/etc/grub2.cfg文件里面调用/etc/grub.d/10_linux 来配置不同的内核,这里面有2个menuentry(菜单入口),所以我们开机的时候会看见两个默认选项,一个是普通模式,一个是救援模式
    在这里插入图片描述

    下面是/etc/default/grub 文件。和其他的脚本比起来,非常简单直观了。
    在这里插入图片描述
    需要注意的是,最好不要直接去修改/etc/grub2.cfg文件。这是因为如果后期升级内核,所有的配置都会失效。如果需要自定义这个文件,我们可以修改对应的脚本或者/etc/default/grub文件,然后通过grub2-mkconfig重新生成grub.cfg文件。

    例1:修改启动等待时间
    rhel7默认启动等待时间为5秒,下面将启动时间改为10秒(注:如果改成-1,那么每次启动时需要手动确认才可以)
    在这里插入图片描述
    重新编译生成grub.cfg文件:grub2-mkconfig -o /boot/grub2/grub.cfg
    在这里插入图片描述
    重启测试
    在这里插入图片描述

    例2:开机界面的时候输入“e”,会打开编辑窗口,可以根据需要进入rescue,emergency或者shell模式。如何限制访问:
    /etc/grub.d/00_header文件末尾,添加以下内容:

        cat <<EOF
    set superusers='用户名'
    password 用户名 密码
    EOF
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    重启编译生成grub.cfg文件
    在这里插入图片描述
    重启测试
    在这里插入图片描述
    以上设置的是明文密码,也可以设置成密文口令:
    加密密码有命令grub2-mkpasswd-pbkdf2生成
    在这里插入图片描述
    /etc/grub.d/00_header文件末尾,添加以下内容:

        cat <<EOF
    set superusers='用户名'
    password_pbkdf2 用户名 密文密码
    EOF
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    重新编译后重启测试。

    开机界面按“e”进入编辑窗口,我们可以根据需要进入rescueemergencyshell引导的3种模式。这3种模式对于系统启动排错很有帮助,比如某个服务卡住了无法加载可以通过这3种模式排错。

    rescue模式:在commandline的配置末尾添加s ,类似rhel6之前的单用户模式
    在这里插入图片描述
    ctrl+x启动
    普通模式需要加载的服务很多,但是rescue模式加载的就少很多,输入管理员密码就可以进入了
    在这里插入图片描述

    emergency模式和rescue模式类似,不过加载的服务更少,把s改成emergency就行了
    在这里插入图片描述
    在这里插入图片描述

    如果root密码忘记怎么办(重置root密码
    方法一:
    1、重启系统,按e进行编辑
    2、在linux16那行尾部加上以下信息:rd.break console=tty0
    在这里插入图片描述
    3、按ctrl+x启动
    4、重新挂载文件系统:mount -o remount,rw /sysroot/
    在这里插入图片描述
    5、改变根目录:chroot /sysroot/
    在这里插入图片描述
    6、修改root密码
    在这里插入图片描述
    注:出现方块原因是没有中文环境,可以用LANG=en_us切换成英文环境
    7、在根目录创建相关文件(用于重新标记selinux环境值,如果启动了selinux,不运行此命令将无法正常启动系统):touch /.autorelabel
    在这里插入图片描述
    8、退出重启系统
    在这里插入图片描述

    方法二:
    1、在linux16的最后一行删除rhgb quiet,然后添加init=/bin/sh,它会用shell替代默认daemon进程
    在这里插入图片描述
    2、按crtl+x启动
    在这里插入图片描述
    3、挂载文件系统为可写模式,因为根目录的加载权限是ro,只读,需要重新加载成rw权限:mount -o remount,rw /
    在这里插入图片描述
    4、修改密码:
    在这里插入图片描述
    5、在根目录创建相关文件,如果之前系统启用了selinux,必须运行以下命令,否则将无法正常启动系统:touch /.autorelabel
    在这里插入图片描述
    创建这个文件会自动在开机的时候重新做标签用于重新标记SELINUX的环境值。
    6、启动系统,运行命令exec /sbin/init来正常启动,或者用命令exec /sbin/reboot重启

    三、开机排错

    例1:grub故障:
    1、模拟故障
    在这里插入图片描述
    2、重启后出现以下故障:开机的时候系统会自动尝试从本地、光盘和网络加载引导程序(如果光盘、网络等引导失败则会显示“operating system not fount”)
    在这里插入图片描述
    3、在bios调整引导顺序,使用光盘引导,选择Troubleshooting(排错)
    在这里插入图片描述
    4、选择Rescue a CentOS system
    在这里插入图片描述
    5、选择continue
    在这里插入图片描述
    6、根据提示,进入shell环境
    在这里插入图片描述
    7、fdisk -l看看启动分区是哪个,有星号的就是
    在这里插入图片描述
    8、进入bash环境(系统根目录),重装一下grub2到启动分区:grub2-install /dev/sda
    在这里插入图片描述
    9、退出重启
    在这里插入图片描述

    例2:grub引导程序没有问题,但是内核文件或grub.cfg配置文件损坏的情况下怎么处理:
    1、模拟故障
    在这里插入图片描述
    2、重启之后会进入grub救援模式,这表示引导程序没有问题,但是引导文件找不到了。
    在这里插入图片描述
    3、和例1操做一样,通过光盘引导,进入急救模式

    在这里插入图片描述
    4、检查boot目录,挂载光盘镜像
    在这里插入图片描述
    5、解决方法是重新安装内核,可以用rpm或者yum,用yum需要先卸载当前的再安装,rpm可以强制--force覆盖安装

    使用yum:
    yum remove -y kernel 
    yum install -y /media/Packages/kernel-3.10.0-1160.el7.x86_64.rpm
    
    使用rpm:
    rpm -ivh /media/Packages/kernel-3.10.0-1160.el7.x86_64.rpm --force
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    6、装完内核后,重新安装一次grub2:grub2-install /dev/sda,然后重新编译grub2配置文件:grub2-mkconfig -o /boot/grub2/grub.cfg
    在这里插入图片描述
    7、退出重启
    在这里插入图片描述
    注:如果开机后直接进入命令行模式,即使runlevel显示的是5,手动输入startx一样报错,请尝试重新安装图像化界面yum groupinstall 'Sever with GUI'

  • 相关阅读:
    相机标定 >> 坐标系转换@内参、外参
    001_iBase4J学习之环境搭建
    Llama2模型的优化版本:Llama-2-Onnx
    【南京】最新ChatGPT/GPT4科研技术应用与AI绘图及论文高效写作
    【华为OD机试python】数字涂色【2023 B卷|100分】
    set和map的封装
    深入了解Redis:配置文件、动态修改和安全设置
    Spring--基于注解管理bean
    安装 Visual Studio Code
    lazada、shopee、速卖通、eBay、亚马逊提升排名的关键:掌握自养号测评技巧
  • 原文地址:https://blog.csdn.net/xinxiaoyu_/article/details/115361371