SUSE linux的启动过程介绍

引导Linux系统涉及不同的组件和任务。在固件和硬件初始化过程(取决于机器的架构)之后,内核通过引导加载程序GRUB2启动。此后,引导过程完全由操作系统控制并由systemd处理。systemd提供了一组“target”,用于为日常使用、维护或紧急情况启动配置。

1 术语

init

有两种不同的进程会被命名为init:

  • 挂载到根文件系统的initramfs进程
  • 从真正的根文件系统开始执行的所有其他进程的操作系统进程

在这两种情况下,systemd程序都会处理这个任务。它首先从initramfs执行以挂载根文件系统。一旦成功,它将作为初始进程从根文件系统重新执行。为了避免混淆这两个systemd进程,我们在initramfs上将第一个进程称为init,将第二个进程称为systemd。

initrd/initramfs

initrd(初始RAM磁盘)是一个映像文件,其中包含由内核加载并从/dev/ram作为临时根文件系统挂载的根文件系统映像。挂载此文件系统需要文件系统驱动程序。
从内核2.6.13开始,initrd已被initramfs(初始RAM文件系统)取代,它不需要挂载文件系统驱动程序。openSUSELeap专门使用initramfs。但是,由于initramfs被保存为/boot/initrd,因此通常称为“initrd”。

2 系统启动过程

2.1 初始化和引导加载程序阶段

在初始化阶段,设置机器的硬件并准备好设备。 此过程在硬件架构之间存在显着差异。
openSUSE Leap在所有架构上都使用引导加载程序GRUB2。根据架构和固件,启动GRUB2引导加载程序可能是一个多步骤过程。引导加载程序的目的是加载内核和基于RAM的初始文件系统(initramfs)。

AArch64和AMD64/Intel64上的初始化和引导加载程序阶段

电脑启动后,BIOS和UEFI会初始化屏幕和键盘,并测试内存,但是不会访问大容量存储(硬盘)。随后加载CMOS中的日期,时间和外设。识别到启动介质后,系统控制权将会从BIOS/UEFI过度到boot loader。
在具有传统BIOS的机器上,只能加载来自引导盘的第一个物理512字节扇区(主引导记录,MBR)的代码,只有最小的GEUB2适合MBR,它的主要目的是从MBR和第一个分区(MBR分区表)之间的间隙或从BIOS根分区(GPT分区表)加载一个包含文件系统驱动的GRUB2核心镜像。这个景象包含了文件系统的驱动程序,因此能够访问位于根文件系统上的/boot目录。/boot目录包含了用于GRUB2核心一级内核和initramfs景象的附加模块。一旦它可以访问该分区,GRUB2就会将内核和initramfs镜像加载到内存中,并将控制权交给内核。
当从包含一个加密的/boot分区的加密文件系统启动BIOS时,需要输入两次密码,第一次用于GRUB2加密/boot,第二次用于systemd挂载加密卷。
使用UEFI加载就会简单些,固件能够从具有GPT分区表的FAT磁盘分区中读取。这个EFI系统分区(挂载到了/boot/efi)拥有足够的空间来承载由固件直接加载和执行的成熟的GRUB2。
如果BIOS/UEFI支持网络引导,还可以配置一个引导服务器,然后就可以通过PXE引导系统。BIOS/UEFI扮演了boot loader的角色。它从boot server获取boot奖项并启动系统。这是完全独立于本地硬盘的。

2.2 内核阶段

当boot loader通过了系统的控制,所有架构的加载过程就完全相同了。boot loader会加载内核和一个初始化基于RAM的文件系统(initramfs)到内存中,然后内核接管工作。
当内核设置好内存管理并且检测到CPU的类型及特性后,将会初始化硬件并从使用initramfs加载的内存中挂载临时根文件系统。

2.2.1 initramfs文件

initramfs(初始RAM文件系统)是一个小的cpio存档,内核可以将其加载到RAM磁盘中。它位于/boot/initrd。它可以使用名为dracut的工具创建。
initramfs提供了一个最小的Linux环境,可以在安装实际的根文件系统之前执行程序。这个最小的Linux环境由BIOS或UEFI例程加载到内存中,除了足够的内存外,没有特定的硬件要求。initramfs存档必须始终提供一个名为init的可执行文件,该可执行文件在根文件系统上执行systemd守护程序,以便引导过程继续进行。
在挂载根文件系统和启动操作系统之前,内核需要相应的驱动程序来访问根文件系统所在的设备。这些驱动程序可能包括特定类型硬盘的特殊驱动程序,甚至是访问网络文件系统的网络驱动程序。根文件系统所需的模块由initramfs上的init加载。加载模块后,udev为initramfs提供所需的设备。稍后在启动过程中,更改根文件系统后,需要重新生成设备。这是由systemd单元systemd-udev-trigger.service完成的。

重新生成initramfs

由于initramfs包含了驱动,因此在必要时需要进行升级,如果有相关的包,这过程会自动完成,YaST或zypper会提醒你生成新的initramfs,但有些时候需要手工完成这项工作。

  1. 硬件变化时添加驱动

如果变化的硬件需要不同的驱动加载到内核时,必须升级initramfs文件。
打开或创建文件/etc/dracut.conf.d/10-DRIVER.conf,添加如下信息:

force_drivers+="RTL8822BE"		#RTL8822BE为硬件型号,如果有多个硬件,两个硬件型号使用空格隔开
  1. 将系统目录移动到RAID或LVM中

当从一个正在运行的系统中移动交换机文件到RAID或逻辑卷时,需要创建一个包含支持软件RAID或LVM驱动的initramfs。因此需要在/etc/fstab中创建新的挂载条目。

  1. 添加磁盘到包含了根文件系统的LVM组或btrfs RAID

这种情况下需要创建一个包含对扩大卷的支持的initramfs。

  1. 修改内核变量

如果通过sysctl接口修改相关联的文件(/etc/sysctl.conf/etc/sysctl.d/*.conf)来修改内核变量的值,下次重启修改将会丢失,即使在运行时使用sysctl --system加载值,更改也不会保存到initramfs文件中。下面的例子是更新方法:


  1. 运行时生成新的initramfs文件
dracut MY_INITRAMFS

Replace MY_INITRAMFS with a file name of your choice. The new initramfs will be created as /boot/MY_INITRAMFS.

或者使用dracut -f命令强制覆盖现有文件

  1. 创建一个执行initramfs文件的软链接。(执行了dracut -f命令不需要这一步)
(cd /boot && ln -sf MY_INITRAMFS initrd)

2.3 initramfs阶段的init

临时根文件系统是从内核挂载,该内核来自包含了可执行的systemd的initramfs。(在下面的initramfs上称为init)。改程序会执行所有的必要操作来挂载正确的根文件系统。它为使用udev的大容量存储控制器所需的文件系统和设备驱动程序提供内核功能。
initramfs上init的主要目的是准备安装和访问真正的根文件系统。根据系统配置,initramfs上的init负责以下任务。


  1. Loading kernel modules
    取决于你的硬件配置,可能需要特殊的驱动程序来访问计算机的硬件组件(最重要的组件是硬盘)。要访问最终的根文件系统,内核需要加载正确的文件系统驱动程序。

  2. Providing block special files
    内核根据加载的模块生成设备事件。udev处理这些事件并在/dev中的RAM文件系统上生成所需的特殊块文件。如果没有这些特殊文件,文件系统和其他设备将无法访问。

  3. Managing RAID and LVM setups
    如果您将系统配置为在RAID或LVM下保存根文件系统,则initramfs上的init会设置LVM或RAID,以便稍后访问根文件系统。

  4. Managing the network configuration
    如果您将系统配置为使用网络安装的根文件系统(通过NFS安装),则init必须确保加载了正确的网络驱动程序,并且将它们设置为允许访问根文件系统。
    如果文件系统位于iSCSI或SAN等网络块设备上,则initramfs上的init也会建立与存储服务器的连接。如果主要目标不可用,openSUSELeap支持从次要iSCSI目标启动。

如果无法从引导环境中挂载根文件系统,则必须先检查并修复根文件系统,然后才能继续引导。对于Ext3和Ext4文件系统,将会自动启动检查器。XFS和Btrfs文件系统的修复过程不是自动化的,用户会看到描述可用于修复文件系统的选项的信息。文件系统修复成功后,退出引导环境会导致系统重新尝试挂载根文件系统。如果成功,引导将继续正常进行。

2.3.1 安装过程中initramfs阶段的init

作为安装过程的一部分,在初始引导期间调用initramfs上的init时,其任务与上述任务不同。请注意,安装系统也不会从initramfs启动systemd——这些任务由linuxrc执行。


  • Finding the installation medium
    当开始安装,机器会加载安装内核和包含YaST安装器的init。YaST安装器运行在RAM文件系统中,他需要安装介质的地址以用于操作系统的安装。

  • Initiating hardware recognition and loading appropriate kernel modules
    引导过程从用于大多数硬件配置的最小驱动程序集开始。在AArch64、POWER和AMD64/Intel64架构的机器上,linuxrc会进行初始硬件扫描,用于寻找适合的硬件驱动。在IBM Z架构机器上,需要提供驱动程序列表和参数。这些驱动用于生成客户自定义的initramfs,它用于启动系统。如果模块不需要用于启动而是用于冷插拔,则可以使用systemd加载模块。

  • Loading the installation system
    硬件被识别后,就会加载适合的驱动。udev程序会创建指定的设备文件,linuxrc会使用YaST安装器开始安装系统的过程。

  • Starting YaST
    最后,linuxrc会启动YaST,然后开始软件包安装和系统配置。

2.4 系统阶段

找到“真正的”根文件系统后,会检查错误并挂载。如果成功,initramfs将被清除并执行根文件系统上的systemd守护进程。systemd是Linux的系统和服务管理器。它是作为PID 1启动的父进程,并充当启动和维护用户空间服务的init系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/36307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信开放平台(第三方平台)

特征: 统一管理: 可以统一管理和操作多个公众号和小程序,提供批量化、集中化的服务。 代开发和运营: 为公众号和小程序提供代开发和运营服务,例如提供自动回复、模板消息、用户管理等功能。 接口调用: 通过…

基于深度学习的模糊图像还原

基于深度学习的模糊图像还原 模糊图像还原(Image Deblurring)是计算机视觉中的一个重要任务,旨在从模糊的图像中恢复出清晰的图像。模糊可以由于多种原因产生,例如相机抖动、运动模糊、焦点失准等。传统的图像去模糊方法通常依赖…

搭建抖音微短剧系统:源码部署与巨量广告回传全解析

在数字化浪潮中,抖音微短剧已成为内容创作的新宠。想要搭建一个高效的抖音微短剧系统,并实现与巨量广告的有效回传吗?本文将为您详细解析源码部署与广告回传的关键步骤。 一、源码部署:构建短剧系统的基石 源码是软件开发的起点…

vscode远程连接Ubantu

一、首先用VM虚拟机打开一个Linux系统 二、打开VScode 在扩展里安装 安装后,打开Linux查看IP地址 在VScode 中新建连接主机 输入linux_nameip地址 -A 然后输入Linux的登录密码 就可以远程操控 Linux了 可以在终端中远程控制Linux 点击左上角的打开文件夹可以很…

什么是 Azure OpenAI?

目录 一、说明 二、什么是 Azure OpenAI 2.1 网络结构 2.2 、为什么使用 Azure OpenAI 2.3 如何使用 Azure OpenAI 三、从哪里开始 Azure OpenAI 之旅 3.1 关于 Azure OpenAI,我还需要了解什么 3.2 RBAC 权限和角色 3.3 演示 1:在公共数据上应用…

【面试题】网络 http、https协议(第一篇)

1.简述HTTP协议 HTTP,全名超文本传输协议,是一个用于客户端与服务器之间进行数据传输的应用层协议,可以传输文本、图片、音视频等超文本内容。 1.HTTP使用TCP作为传输层协议,因此具有可靠性, 2.除此之外&#xff0c…

聚合项目学习

首先建立一个总的工程目录,里边后期会有我们的父工程、基础工程(继承父工程)、业务工程(依赖基础工程)等模块 1、在总工程目录中(open一个空的文件夹),首先建立一个父工程模块(通过spring init…

4面体空间内直链4点结构分布与占比

在30个点的4面体空间内取4个点,有30*29*28*27/2427405种取法,要求得到的4个点必须在直链上。只有144个结构符合要求,在平移操作下不重合的结构有36个。 这36个结构可以按照旋转对称性进一步分成3组0,1,4,每…

Anisble Playbook

文章目录 一、Playbook简介三种常见的数据格式Playbook特点YAML语言介绍 二、Playbook核心组件host组件remote_user组件task列表和action组件gather_factsHandlers notifyignore_errors 三、playbook命令playbook命令tags 标签 四、Playbook中的变量setup模块中的变量Playbook命…

vue3 【提效】自动路由(含自定义路由) unplugin-vue-router 实用教程

不再需要为每一个路由编写冗长的 routes 配置啦,新建文件便可自动生成路由! 使用方法 1. 安装 unplugin-vue-router npm i -D unplugin-vue-router2. 修改 vite 配置 vite.config.ts import VueRouter from unplugin-vue-router/viteplugins 中加入 V…

消费疲软,预期一下债券的平均收益

在预测消费疲软对债券平均收益的影响时,我们需要考虑多个因素,包括宏观经济环境、货币政策、通胀预期以及债券市场的具体表现等。以下是对债券平均收益的预期分析: 宏观经济环境与货币政策: 当前中国经济增速已转向高质量发展阶段…

【Redis一】Redis配置与优化

目录 一.关系型数据库与非关系型数据库 1.关系型数据库 2.非关系型数据库 3.二者区别 4.非关系型数据库产生背景 5.NoSQL与SQL数据记录对比 关系型数据库 非关系型数据库 二.Redis相关概述 1.简介 2.五大数据类型 3.优缺点 3.1.优点 3.2.缺点 4.使用场景 5.采用…

苹果应用Testflight上架完整步聚

1.全部选中下图内容,包含iPhone与iPad屏幕所有旋转方向 2. 准备App图标,一定要有152和167这个尺寸,不然后提交不过 3.1024这个尺寸的的图像不能有透明层,不然提交不通过 4.选中编译设备为Any iOS Device[arm64] 5.选择Product下的Archive进行生成 6.在弹出的窗口中选择Test…

Python之三大基本库——Numpy(2)

接着上次的内容接着讲,连续号都续上哈 七、numpu中random的随机生成函数 以下总结的是比较常用到的函数: 下面分别介绍一下不用的用法: 首先导入创建函数 import numpy as np np.random.seed(666)1、 rand(d0,d1,d2,...,dn):返…

JavaWeb系列三: JavaScript学习 下

文章目录 js数组定义方式数组遍历 js函数函数入门函数使用方式使用方式一使用方式二 函数注意事项函数练习题 定义对象使用object定义使用{}定义 事件onload事件onclick事件失去焦点事件内容发生改变事件表单提交事件静态注册动态注册表单作业 dom对象文档对象模型document对象…

JDK-调度线程池

归档 GitHub: JDK-调度线程池 使用示例 https://github.com/zengxf/small-frame-demo/blob/master/jdk-demo/simple-demo/src/main/java/test/jdkapi/juc/thread_pool/TestSchedule.java JDK 版本 openjdk version "17" 2021-09-14 OpenJDK Runtime Environment…

边缘计算VNC智能盒子如何助力HMI设备实现二次开发?

HMI(Human-Machine Interface)又称人机界面,是用户与机器之间交互和通信的媒介。今天带你了解智能盒子如何助力HMI设备实现二次开发? HMI设备被广泛应用在工业自动化中,具有显示设备信息,实时监测&#xf…

python爬虫--scrapy框架

Scrapy 一 介绍 Scrapy简介 1.Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛2.框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非…

GPT-5对普通人有何影响

这篇文章对ChatGPT的使用方法和提问技巧进行了讨论,重点强调了背景信息和具体提问的重要性。文章清晰地传达了如何提高ChatGPT回答的质量,以及个人在使用ChatGPT时的体会和建议。然而,文章在逻辑组织和表达方面还有一些可以改进的地方&#x…

Spring Boot与分布式事务的最佳实践

Spring Boot与分布式事务的最佳实践 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨在Spring Boot应用中如何实现分布式事务的最佳实践。 什么是…