当前位置: 首页 > 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.dtcms.com/a/337260.html

相关文章:

  • 场外个股期权的行权日是t+多少个交易日?
  • 【牛客刷题】最大公约数与最小公倍数:算法详解与实现
  • linux中的hostpath卷与nfs卷以及静态持久卷的区别
  • JAiRouter 架构揭秘:一个面向 AI 时代的响应式网关设计
  • Flutter 自定义 Switch 切换组件完全指南
  • 技术经典场景之协议转换
  • IR-CUT与CCD CMOS的关系
  • 国标:开展环境卫生满意度调查
  • 【P18 3-10】OpenCV Python—— 鼠标控制,鼠标回调函数(鼠标移动、按下、。。。),鼠标绘制基本图形(直线、圆、矩形)
  • 【笔记】和各大AI大语言模型合作写项目—slirp.go
  • 之前说的要写的TCP高性能服务器,今天来了
  • 算法题打卡力扣第26. 删除有序数组中的重复项(easy))
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(4):31-40语法
  • 在react props中在参数中定义参数类型
  • Leetcode 16 java
  • 发布npmjs组件库
  • 政策技术双轮驱动智慧灯杆市场扩容,塔能科技破解行业痛点
  • 使用AWS S3 + Lambda + MediaConvert 实现上传视频文件并自动转码
  • 像素风球球大作战 HTML 游戏
  • 隐秘参数APP:全面了解手机硬件信息与优化性能
  • 从零开始搭建React+TypeScript+webpack开发环境——多环境配置管理方案
  • WMS仓库管理系统如何远程访问?
  • RAID服务器
  • qsort函数使用及其模拟实现
  • 视觉语言导航(2)——VLN RNN TRANSFORMER 与ATTENTION 2.2+LSTM(单独一节)
  • 分治-归并-493.翻转对-力扣(LeetCode)
  • 艺术品与收藏直播驱动数字化鉴赏与交易
  • 设计模式笔记_行为型_访问者模式
  • 双通道审核智能合约更新路径:基于区块链与AI融合的编程范式分析
  • MATLAB建模与可视化技术文档:从二维到三维