系统启动过程

系统引导过程概述

传统的Linux系统启动过程主要由著名的init进程(也被称为SysV init启动系统)处理,而基于init的启动系统被认为有效率不足的问题,systemd是Linux系统机器的另一种启动方式,宣称弥补了以传统Linux SysV init为基础的系统的缺点。

传统的 init启动过程

在我们打开Linux电脑的电源后第一个启动的进程就是init。分配给init进程的PID是1。它是系统其他所有进程的父进程。当一台Linux电脑启动后,处理器会先在系统存储中查找BIOS,之后BIOS会检测系统资源然后找到第一个引导设备,通常为硬盘,然后会查找硬盘的主引导记录(MBR),然后加载到内存中并把控制权交给它,以后的启动过程就由MBR控制。

主引导记录会初始化引导程序(Linux上有两个著名的引导程序,GRUB和LILO,80%的Linux系统在用GRUB引导程序),这个时候GRUB或LILO会加载内核模块。内核会马上查找/sbin下的“init”程序并执行它。从这里开始init成为了Linux系统的父进程。init读取的第一个文件是/etc/inittab,通过它init会确定我们Linux操作系统的运行级别。它会从文件/etc/fstab里查找分区表信息然后做相应的挂载。然后init会启动/etc/init.d里指定的默认启动级别的所有服务/脚本。所有服务在这里通过init一个一个被初始化。在这个过程里,init每次只启动一个服务,所有服务/守护进程都在后台执行并由init来管理。

关机过程差不多是相反的过程,首先init停止所有服务,最后阶段会卸载文件系统。

systemd启动过程
  1. 打开电源后电脑所做的第一件事情就是BIOS初始化。BIOS会读取引导设备设定,定位并传递系统控制权给MBR(假设硬盘是第一引导设备)。
  2. MBR从Grub或LILO引导程序读取相关信息并初始化内核。接下来将由Grub或LILO继续引导系统。如果你在grub配置文件里指定了systemd作为引导管理程序,之后的引导过程将由systemd完成。Systemd使用“target”来处理引导和服务管理过程。这些systemd里的“target”文件被用于分组不同的引导单元以及启动同步进程。
  3. systemd执行的第一个目标是default.target。但实际上default.target是指向graphical.target的软链接。Linux里的软链接用起来和Windows下的快捷方式一样。文件Graphical.target的实际位置是/usr/lib/systemd/system/graphical.target
  • 以流程来看
  • 通电——>进入初始化阶段——>bios 初始化——>grub2 磁盘引导阶段——>grub2 文件引导阶段——> 指定boot所在分区——>启动内核,只读挂在 / 设备启动——>init 程序进入初始化阶段——> 启动 systemd 初始化进程——>读取 /etc/systemd/中的文件——>启动程序——>启动登陆环境
grub文件引导阶段

由文件/boot/grub2/grub.cfg控制流程:
指定/boot分区位置 —–> 加载内核 —–> 启动系统初始化进程 —–> grub2-mkconfig

内核引导阶段

检测硬件设备 —–> 设备驱动初始化 —–> 将/只读挂载 —–> 载入初始进程systemd —–> 内核文件丢失请重新安装内核

systemd初始化

开启selinux和systemd-tools —–> 加载内核参数 —–> 加载系统时钟,键盘,主机名称 —–> 读写挂载/文件系统 —–> 激活raid, lvm设备 —–> 激活系统配额 —–> 启动multi-user.target.wants中的所有服务脚本 —–> 启用虚拟控台 —–> 启动图形

设定启动级别
systemctl set-default + 启动级别
/etc/systemd/system/default.target
启动级别:
runlever0.target -> poweroff.target  //关机'

runlever1.target -> rescue.target   //单用户模式

runlever2.target -> multi-user.target    //多用户模式,不支持NFS

runlever3.target -> multi-user.target   //完整多元化模式

runlever4.target -> multi-user.target   //未定义使用

runlever5.target -> grapical.target    //带有图形界面的多用户使用

runlever6.target -> reboot.target   //重启
tips :

开机自启动是因为添加了链接到脚本上,开机就会自动运行脚本开启,有无图形也是因为链接在有无图形的脚本上

如果出现一开机就关机的现象,是因为将开机的级别指定在了poweroff.target,所以将开机指定到相应的用户模式启动级别就好了


系统启动出错恢复

1.引导程序boot损坏:

这里为了演示,我们将/dev/vda前446字节删除达到相同效果

dd  if=/dev/zero of=/dev/vda bs=446 count=1 ##注意一定是446 ,多了的话,就不只是修复引导了
446字节是启动引导

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_重启

首先,保证selinux是disabled

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_linux使用reboot需要扩展包吗_02

重启,发现一直在booting,即无法引导系统系统

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_linux_03

关闭虚拟机 ,将virt-manager中添加cdrom,SATA硬盘,选择iso镜像

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_重启_04

顶置以硬盘启动

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_linux_05

启动程序,第一个界面选择修复Troubleshooting

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_linux使用reboot需要扩展包吗_06

第二个界面选择拯救模式Rescue a Res Hat Enterprise Linux system

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_重启_07

进入Rescue模式

第一个选择是环境,默认就是继续,1,选择只读 2,跳过到shell 3,退出,重启 4

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_重启_08


我们选择1 ,提示三遍,你的根现在在/mnt/sysimage 回车继续

chroot  /mnt/sysimage #进入 bash-4.2# grub2-install /dev/vda

反馈 : No error reported,即为安装成功

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_初始化_09


退出bash-4.2,退出sh-4.2关闭虚拟机

重新设置启动,顶置以虚拟硬盘启动,然后重新启动你的虚拟机

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_初始化_10

完成!!

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_加载_11

tips :
  • 在启动选项中选第一个按 e 进入,找到下图所示地方,添加selinux=0 可以实现开机不加载selinux,相应的类似操作还有很多,比如输入rw rd.break进入可以完成之前提到过的忘记密码恢复

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_重启_12


2.grub修复

系统启动关键性文件 /boot/grub2/grub.cfg,记录了grub引导的各个部分

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_linux_13


//这里只显示一部分

其中87,102行会发现很熟悉,因为这就是显示再开机时的名称

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_加载_11

如果将对应的位置修改,则可以变成以下效果

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_初始化_15

grub2-mkconfig ##显示grub.cfg 的文件信息

如果这里的文件缺失,系统将不知道该读哪一个地方,则开机后会进入如下界面

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_linux使用reboot需要扩展包吗_16

grub> set root='hd0,msdos1' ##看你的boot分区就写什么
# hdn 第n-1块硬盘  ,这里要知道自己的根在那里
grub> linux16 /vmlinuz-... ro root=/dev/vda3
grub> initrd16 /initramfs-...
grub> boot ##启动引导

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_linux使用reboot需要扩展包吗_17

配置好输入boot就可以进入系统了,进入后,执行grub2-mkconfig > /boot/grub2/grub.cfg

添加缺失的引导配置文件

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_linux_18


3.内核丢失

这里以删除内核文件为例:

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_初始化_19


//同样的,删除了这个文件,那么修复也就是要填补这个文件重启后会显示丢失内核文件

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_初始化_20

修复:

设置cdrom启动,顶置SATA CDROM1
—>进入拯救模式
—>继续 1 , Enter
—>df,发现/dev/sr0这是光驱里面的,这也是我们内核资源的来源

进入后
rpm2cpio  /run/install/repo/Packages/kernal-....rpm | cpio -id ##提取到当前然后将它复制到/mnt/sysimage/boot下,即添加到配置文件的指定位置,不然系统还是读取不到这个文件
//注意,进入之后,自己现在的根目录是在/mnt/sysimage下,不是真正的根,所以需要将文件移动到真正缺少内核的地方,即/mnt/sysimage/boot 下

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_linux使用reboot需要扩展包吗_21


重新顶置以虚拟硬盘启动

重新启动,完成


4.初始化文件丢失

这里还是以删除这个文件为例:

rm -fr /boot/initramfs-3.10…x86_64.img

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_初始化_22

man mkinitrd 
 mkinitrd [OPTION...] [< initrd-image>] < kernel-version> //这是修复初始化文件的命令用法

关机 —> 设置cdrom启动 —> 进入拯救模式

chroot /mnt/sysimage  ##切换用户
mkinitrd /boot/initramfs-$(uname -r).img &(uname -r)

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_linux使用reboot需要扩展包吗_23

//其中,$()变量的应用 : 
即在命令中,()内部的先执行,然后作为$变量
比如: echo uname is $(uname -r)  //先执行uname -r ,输出作为变量的输入
显示:echo uname is 3.10.0-327.el7.x86_64

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_重启_24

退出关机
重新设置虚拟硬盘启动
成功!

tips : 若将/boot全部删除了

还是以系统的引导过程为本,一步一步的修复:

恢复grub —-> 重新安装内核 —-> 安装grub,恢复自动引导文件 —-> 重启

5.登陆闪退

问题描述: 一登陆输入账户密码后直接弹出

同样的,进入拯救模式

chroot切换环境时,显示丢失了一个文件
所以,将缺失的文件加上去,/bin/bash
--- > 将救援模式下的/bin/bash 复制到 /mnt/sysimage/bin/bash

linux使用reboot需要扩展包吗 linux系统reboot启动不起来_linux_25

重启进入后,成功!