当前位置: 首页 > news >正文

Linux系统启动原理及故障排除

一、系统启动过程及相关配置文件

1.启动过程

  1. 加载 BIOS/UEFI 信息,进行硬件检测。
  2. 按照 BIOS 设定找到第一个可以启动的设备。
  3. 读取第一个设备的 MBR(主引导记录),加载 MBR 中的 BootLoader(启动引导程序 grub2)。
  4. 依据 grub2 的设置加载内核,内核再次进行系统检测。
  5. grub2 加载 initramfs 虚拟文件系统,在内存中加载虚拟文件系统/boot/initramfs。
  6. 内核初始化,以加载动态模块的形式加载部分硬件的驱动。并且调用 initrd.target,挂载/etc/fstab 中的文件系统。
  7. 此时可以由虚拟文件系统模拟出的根目录切换回硬盘真实的根目录。
  8. 内核启动的第一个进程,systemd。

2.systemd并行启动程序

  1. 调用默认 default.target 单元组,并按照 default 运行子单元组。
  2. systemd 中将启动程序称为单元 unit,多个单元组成单元组(target)。
  3. 调用 sysinit.target 单元组,初始化系统。检测硬件,加载剩余硬件的驱动模块等。
  4. 调用 basic.target 单元组,准备操作系统。加载外围硬件的驱动模块,加载防火墙,加载 SELinux安全上下文等。
  5. 调用 mutil-user.target 单元组,启动字符界面所需的程序。
  6. 调用 mutil-user.target 单元组中/etc/rc.d/rc.local 文件,执行文件中命令。
  7. 调用 mutil-user.target 单元组中的 getty.target 单元组,初始化本地终端。
  8. Systemd 调用 graphical.target 单元组(字符界面不需要)

3.启动过程名词解释

BIOS/boot loader/kernel 加载:

  • BIOS:无论传统 BIOS 还是 UEFI BIOS 统一简称为 BIOS。
  • MBR:即便是 GPT 分区为了保证兼容性也保存了 MBR 区块。MBR 在当前章节表示为该磁盘的最前面可安装 boot loader 的区块。
  • boot loader:BIOS 在启动过程中会对硬件进行检测,然后定义可启动的设备顺序,之后可以按照启动顺序到指定设备进行数据读取。
  • 按照 BIOS 中启动顺序,找到启动系统磁盘中的操作系统内核文件。但是,不同的操作系统所使用的默认文件系统也并不相同。
  • 以启动引导程序来解决内核文件加载文件,这个启动引导程序被称为 boot loader。boot loader 存在于启动设备的第一个扇区之中。

加载内核检测硬件与 initramfs:

  • 内核通常存在于 boot 分区中,通常名为/boot/vmlinuz*。
  • 经过 boot loader 开始读取内核文件后,接下来 Linux 会将内核解压到内存当中。并且利用内核开始检测硬件设备:CPU、内存、硬盘、网卡等。也就是说内核会重新对硬件进行一次检测。
  • 当前版本 Linux 通常将非必要的内核功能变成模块。比如 USB、SATA、SCSI 等磁盘设备的驱动程序通常是以模块的形式存在。
  • 同时出现的问题在于 SATA 等驱动在非必要模块中,此时内核并不能读取 SATA 等磁盘。

虚拟文件系统:

  • 一般存在于:/boot/initrd*(C6)或/boot/initramfs,此文件也能通过 boot loader 来加载到内存中,然后这个文件会被解压缩并在内存中模拟称为一个根目录。
  • 此模拟在内存中能够提供一个可执行程序,通过该程序来加载启动过程中所需内核模块,通常这些模块就是 USB、SCSI、LVM 等文件系统与磁盘的驱动程序。加载完成后重新调用systemd 来开始后续正常启动流程。

4.Centos5,6,7系统版本启动过程

二、管理系统服务

1.显示服务状态

  • loaded:Unit 配置文件已处理
  • active(running):一次或多次持续处理的运行
  • active(exited):成功完成一次性的配置
  • active(waiting):运行中,等待一个事件
  • inactive:不运行
  • enabled:开机启动
  • disabled:开机不启动

2.运行级别

Centos6和7运行级别的变化

3.设置系统默认启动级别

步骤一:查看系统现在的起启动级别

步骤二:设置系统默认运行级别为图形化

4.mutil-user 和 graphical的关系

5.grub(c6)和grub2(c7)

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

修改内核启动顺序

临时:开机界面上下键选择

永久

步骤一:查看/boot/grub2/grub.cfg配置文件,发现不能随意修改

步骤二:修改/etc/default/grub,将修改内容间接写入到/boot/grub2/grub.cfg文件当中

从0开始代表着内核版本从新到旧;将修改写入到配置文件当中

此时重启虚拟机,系统就会默认启动第二级内核版本

三、加密grub

注:若没有加密grub菜单,任何接触到服务器的人都能够通过单用户系统修改密码

原因

1.在开机选择内核版本界面,按e进入编辑模式,随后编辑rd.break2.按ctrl+x,进入命令行窗口,会发现是以root身份运行的

设置grub菜单密码

注:出现user.cfg文件就代表设置成功,如果删除这个文件的话密码就失效了

重启,按e进入grub菜单界面,输入密码之后就可以进入grub界面了

四、重装grub修复损坏系统

1.硬盘主引导程序损坏

步骤一:手动破坏硬盘的主引导程序,即硬盘/boot分区的前446字节

步骤二:重启,顺位找光盘启动,第三个选项后接第二个救援模式,进入修复界面

步骤三:切换硬盘根目录,重装grub,随后退出硬盘根目录,重启系统

2.误删grub2文件修复

步骤一:删除/boot/grub2,然后重启虚拟机(虚拟机会变成这个样子)

步骤二:关闭虚拟机,进入固件,选择光盘优先启动,按照之前步骤,同样进入救援模式

步骤三:切换用户身份,重装grub,重装之后没有grub.cfg,需要额外的命令安装

步骤四:exit退出,然后reboot重启,进入固件改回硬盘优先启动

五、密码找回

1.重启,按e进入编辑模式

2.ctrl+x进入命令行界面

在启动之后会发现我们获取了一个 shell,可以正常使用一部分命令了。但同时我们也会发现,当前系统中的数据和我们之前系统中的数据并不一致(某些之前系统上的文件当前都是见不到的)。现在我们查看一下挂载信息,看是否正常。我们通过挂载信息会发现,实际上我们原有的系统被挂载在了/sysroot 目录下了,并且是不具备 rw 读写权限的。我们重新挂载,使其拥有读写权限chroot 命令用于切换根目录,在切换根目录之前,根分区存在于/sysroot 中,切换之后当前使用的根目录就是我们之前正常登录系统所使用的根目录。

3.正常修改密码

4.开机时关闭SELinux

原因:在修改之后需要 touch 一个隐藏文件.autorelabel,因为在 rd.break 环境下 SELinux 是不生效的。在不生效的情况下我们修改了用户的密码,也就是修改了/etc/shadow 文件,所以密码文件的安全上下文的特性会被取消。如果没有让系统在启动时自动恢复 SELinux 的安全上下文,系统会报错“无法登录”,所以 SELinux 在 Enforcing模式下的时候(如在 disabled 模式下则不用),在根目录下 touch 隐藏文件 autorelabel 会让系统在重启时以SELinux 默认类型重新写入 SELinux 安全上下文。

其他

写入 init=/bin/sh 后使用 ctrl+x,这样不需要切换根目录,在分区重新挂载加入 rw 权限后即可修改密码。在修改密码后同样需要修改 SELinux 设置或创建/.autorelabel 文件,在创建文件之后可以执行 exec /lib/systemd/systemd。

http://www.lryc.cn/news/624738.html

相关文章:

  • GitHub Actions 从核心思想到最佳实践
  • Go语言基础结构全解析
  • 海洋牧场:奏响乡村振兴的蓝色乐章
  • Mysql——前模糊索引失效原因及解决方式
  • Linux软件编程(七)线程间同步与进程间通信
  • Tomcat Wrapper源码解析:深入理解Servlet生命周期与请求分发机制
  • 【81页PPT】国内某知名大型制药企业制药数字化转型项目汇报方案(附下载方式)
  • Leetcode 3650. Minimum Cost Path with Edge Reversals
  • Linux学习:实现简单的共享内存通信
  • 06多段代码复杂度合成规则
  • 学习日志37 python
  • [优选算法专题二滑动窗口——水果成篮]
  • PyTorch数据处理工具箱(数据处理工具箱概述)
  • 【JavaEE】(16) Spring Boot 日志
  • C语言关于函数传参和返回值的一些想法
  • 《亚矩阵云手机重构出租接单:KVM 虚拟化与边缘计算驱动的设备替代技术路径》
  • Highcharts for Flutter 正式发布
  • SQL语法大全指南
  • 【Day 29 】Linux-数据库
  • 设计模式(四)——责任链模式
  • 福彩双色球第2025095期篮球号码分析
  • 19.8 《3步实现OPT-6.7B无损量化:用自定义数据集省70%显存,精度仅跌2.3%》
  • 终极方案!lightRag/graphRag离线使用tiktoken持续报错SSLError,不改源码,彻底解决!
  • 海洋牧场邂逅海洋旅游:碰撞出新业态的璀璨火花
  • 北斗安心联车辆管理系统优势分析
  • 飞机起落架轮轴深孔中间段电解扩孔内轮廓检测 - 激光频率梳 3D 轮廓检测
  • Conda技巧:修改Conda环境目录,节省系统盘空间
  • 【每天学点‘音视频’】前向纠错 和 漏包重传
  • vue从入门到精通:搭建第一个vue项目
  • 表格内容对比及标记