网站首页 > linux / 正文
Linux启动流程中,传统引导方式和UEFI引导方式不同, 传统引导方式(Legacy boot Type)是:开机自检-->grub2-->/boot加载内核和initramfs-$(uname -r)文件系统-->systemd(init)进程初始化-->/boot/grub2/grub2.cfg。
UEFI模式:开机自检--> grub2-->/boot加载内核和ram文件系统-->systend进程初始化-->/boot/efi/EFI/centos/grub.cfg。
传统模式是MBR分区,无法引导2TB以上的磁盘。
UEFI模式采用GPT分区,可以引导2TB以上的磁盘并且向下兼容MBR。
一般启动流程是:bios/uefi-->bootloader-->kernel-->initramfs-->systemd(initramfs)-->switch-root-->systemd(real rootfs)。
内核引导阶段bootloader,是加载内核映像vmlinuz和initramfs到内核,并且将控制权交给内核。
内核引导阶段通过/boot/grub2/grub.cfg找到vmlinuz和initramfs。一般格式是名称-$(uname -r)。
X86的uefi引导方式:
uefi-->shimx64.efi-->/boot/efi/EFI/centos/grubx64.efi-->vmlinuz和initramfs。
内核启动的过程,是比较复杂的。具体过程如下:
①:解压vmlinuz,运行内核镜像。
/boot/vmlinuz-$(uname -r)是内核,/boot/initramfs-$(uname -r).img是initramfs的镜像文件。
②:创建rootfs并且挂载到/,解压initramfs到/
(内存文件系统)。
③:执行init进程,此时的init为initramfs中的init,在内存文件系统的根目录下,指向systemd。
④:initramfs-$(uname -r)可以解压,解压命令为:
/usr/lib/dracut/skipcpio /boot/initramfs-$(uname -r)。
从initramfs解压后的内容可以看出来,这就是一个小型的根文件系统,其中init是指向usr/lib/systemd/systemd的软链接。
内核内核启动到一定阶段,会在内存中创建根文件系统rootfs,并且把rootfs根文件系统挂载到/下面。内核将initramfs解压到/下,内核执行/init即软链接到systemd。
systemd拉起各种初始化文件,完成真实根文件系统的识别与挂载。
切换到真实根文件系统,调用真实根文件系统的systemd,重新启动systemd进程。
systemd继续拉起各用户服务,包括各种用户服务,包括用户服务和终端服务。
init进程是所有系统进程的起点,内核在完成核内引导之后,就在本进程(线程)空间内加载init程序,它的进程号是1。
在centos6.x的系统中,是init进程。在centos7.x/8.x中,是systemd进程。init进程(systemd进程)是所有进程的发起者和控制者。
init进程有两个作用:
①:扮演被终结进程的父进程角色。
②:依据/etc/inittab的规定,进入指定的运行级别RUNLEVEL,并且对各种运行级别runlevel进行管理。
0是关机。
1是单用户。
2是无网络支持的多用户模式。
3是有网络支持的多用户模式。
4是未使用的模式。
5是有网络支持并且有X-Windows支持的多用户模式。
6是重新引导系统,即重启。
systemd的进程号是1。systemd主要分成三个单元:sysinit、multi user、getty。
最后通过graphical启动图形化界面。
一般是init进程依据/etc/inittab设定运行级别,运行级别runlevel是0-6。
init进程执行rc.sysinit,Linux系统运行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序。
Linux systemd的启动流程:
①:内核启动initramfs虚根文件系统systemd。
②:虚根文件系统systemd启动后会挂载sysroot(逻辑根目录),然后切换到根文件系统,再次启动systemd进程。
systemd在initramfs的过程是:
sysinit.target-->basic.target-->default.target-->mount root to sysroot-->exec systemd。接着systemd在操作系统中执行:
执行sysinit.target-->basic.target-->multi user.target或者graphical.target-->login登录到操作系统。
运行systemd进程之后,Linux启动第一个用户层文件就是sysinit.target。设置path变量、设置网络、启动交换分区、设置/proc等。
接着加载内核模块,根据/etc/modules.conf文件或者/etc/modules.d目录下的文件来加载内核模块。
systemd执行runlevel的对应脚本,根据运行级别的不同,系统会运行相应的脚本,来完成相应的初始化工作和启动相应的服务。
systemd执行multi-user.target下面的/etc/rc.local。
systemd执行multi-user.target下的getty.target以及登录服务。
systemd执行graphical图形化需要的服务,这样,Linux操作系统就可以正常使用了。
Linux系统启动流程分成几步:
开机-->硬件自检-->mbr引导-->grub引导-->内核启动-->操作系统启动的流程。
出现选择内核的那个开始菜单界面,表明grub引导正常。
出现welcome to 操作系统名称那步,说明内核启动完成,开始进行Linux操作系统启动了。
根据这两个很明显的界线,可以判断系统出现异常的阶段,进行相对应的阶段处理工作。
了解linux的启动过程,可以定位服务器启动过程中的故障,协助解决服务器故障。
鼓励的话语:经历是一种财富!
Tags:linux 启动级别
- 上一篇:Linux 内核学习1. 编译并启动一个最小化系统
- 下一篇:linux 简单介绍
猜你喜欢
- 2024-11-26 Linux新手入门系列:注册tomcat的systemctl服务,设置开启自启动
- 2024-11-26 万字详文干货:从无盘启动volumio看Linux启动原理
- 2024-11-26 kali linux系统运行级别
- 2024-11-26 2Linux系统管理之Linux系统基础知识
- 2024-11-26 Linux内核打印级别
- 2024-11-26 Linux系统的正确关机方法
- 2024-11-26 开机启动流程
- 2024-11-26 对linux的基础了解
- 2024-11-26 90后程序员小伙分享—Linux内核kernel启动分析(下篇)精品推荐
- 2024-11-26 linux 简单介绍