系统启动过程
系统引导过程概述
传统的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启动过程
- 打开电源后电脑所做的第一件事情就是BIOS初始化。BIOS会读取引导设备设定,定位并传递系统控制权给MBR(假设硬盘是第一引导设备)。
- MBR从Grub或LILO引导程序读取相关信息并初始化内核。接下来将由Grub或LILO继续引导系统。如果你在grub配置文件里指定了systemd作为引导管理程序,之后的引导过程将由systemd完成。Systemd使用“target”来处理引导和服务管理过程。这些systemd里的“target”文件被用于分组不同的引导单元以及启动同步进程。
- 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字节是启动引导
首先,保证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/vda3
grub> 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
重启进入后,成功!