linux学习之旅(十七)& 系统启动及出错恢复

来源:互联网 发布:网上白家乐有软件分析 编辑:程序博客网 时间:2024/06/02 05:11

系统启动过程

系统引导过程概述

传统的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    //多用户模式,不支持NFSrunlever3.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字节是启动引导

首先,保证selinux是disabled

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

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

顶置以硬盘启动

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

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

进入Rescue模式

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

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

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

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

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

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

完成!!

tips :

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


2.grub修复

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


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

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

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

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

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

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

添加缺失的引导配置文件


3.内核丢失

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

//同样的,删除了这个文件,那么修复也就是要填补这个文件

重启后会显示丢失内核文件

修复:

设置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


重新顶置以虚拟硬盘启动
重新启动,完成


4.初始化文件丢失

这里还是以删除这个文件为例:
rm -fr /boot/initramfs-3.10…x86_64.img

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

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

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

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

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

tips : 若将/boot全部删除了

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

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

5.登陆闪退

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

同样的,进入拯救模式

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

重启进入后,成功!

原创粉丝点击