Debian的系统启动过程

1 启动过程概述

1.1 第一阶段:BIOS

BIOS是启动过程的第一阶段,在上电事件后开始。CPU的程序计数器在上电事件后被初始化为一个特定的内存地址,驻留在只读存储器(ROM)中的BIOS就是从这个特定的内存地址开始执行。
BIOS执行硬件的基本初始化(POST:上电自检)并将系统控制权交给你指定的下一步骤。BIOS通常和硬件一同提供。
硬件位置和BIOS启动的代码的优先级可以在BIOS配置界面中选择。通常,在已选择的设备(硬盘、软件、CD-ROM……)中,最先找到的设备的最开始的几个扇区将被加载到内存,并执行其中的初始化代码。初始化代码可以是以下任意一种。

  • 引导加载代码
  • 类似FreeDOS这样的过滤型操作系统的内核代码
  • 能够加载到如此小的空间中的目标操作系统的内核代码
    通常,系统从主硬件的特定分区中引导。传统PC硬盘的最开始两个扇区中包含了主引导记录(MBR)。在MBR的末尾记录了磁盘分区信息及引导选择。BIOS中执行的首段引导加载代码占据了MBR的其余部分。

1.2 第二阶段:引载加载程序

由BIOS启动,将系统内核映像和initrd映像加载到内存并将控制权交给它们。initrd映像是根文件系统映像,其支持程度依赖于所使用的引导加载程序。
当前2.6/3.x版本Linux内核的initrd镜像从技术上说是initramfs(初始化RAM 文件系统)镜像。基本的initrd镜像是root文件系统中各个文件使用cpio压缩得到的。内核可以在启动流程中非常早的阶段,在加载基本的initrd镜像之前即更新微码。以未压缩cpio格式存储微码二进制文件的initrd镜像和基本initrd镜像两部分可以联合组成一个initrd镜像,从而帮助实现上述功能。
Debian系统默认将PC 平台的GRUB引导加载程序的第一阶段代码安装在MBR 中。
传统GRUB的菜单配置文件位于/boot/grub/menu.lst。例如,文件中有如下的配置条目:

title Debian GNU/Linux
root (hd0,2)
kernel /vmlinuz root=/dev/hda3 ro
initrd /initrd.img

在debian10和11中均为找到上述文件。

GRUB第2版的菜单配置文件位于/boot/grub/grub.cfg。此文件由/usr/sbin/update-grub根据”/etc/grub.d/*”中的模板及”/etc/default/grub”中的设置自动生成。例如,文件中有如下的配置条目。

软件包initrd引导加载程序说明
grub-legacy支持传统GRUB可智能识别磁盘分区和文件系统(如vfat、ext3……)
grub-pc支持GRUB第2版可智能识别磁盘分区和文件系统(如vfat、ext3……)。默认安装
grub-rescue-pc支持GRUB第2版此为GRUB第2版的可引导修复映像(CD和软盘)(PC/BIOS版本)
lilo支持Lilo依赖于数据在硬盘上的扇区位置。(较老)
syslinux支持Isolinux可识别ISO9660文件系统。引导CD使用此项。
syslinux支持Syslinux可识别MSDOS文件系统(FAT)。引导软盘使用此项。
loadlin支持Loadlin新系统从FreeDOS或MSDOS中启动。
mbr不支持NeilTurton的MBR此为取代MSDOS MBR的自由软件。只可识别硬盘分区。
	menuentry ”Debian GNU/Linux” {set root=(hd0,3)linux /vmlinuz root=/dev/hda3initrd /initrd.img}

条目的含义如下:

GRUB参数说明
root使用主磁盘的第3个分区,在传统GRUB中将此参数设置为”(hd0,2)”,在GRUB第2版中将此参数设置为”(hd0,3)”
kernel使用位于”/vmlinuz”的内核,同时将”root=/dev/hda3ro”作为参数传递给内核
initrd使用位于”/initrd.img”的initrd/initramfs映像

传统GRUB使用的分区号为Linux内核及各种实用工具使用的分区号减1。GRUB第2版修复了这个问题。

在标识一个块设备时,可能需要使用UUID,例如”root=UUID=81b289d5-4341-4003-9602-e254a17ac232 ro”。

1.3 第三阶段:mini-Debian系统

由引导加载程序启动。它会在内存中运行系统内核和根文件系统。这是启动流程的一个可选准备阶段。这个系统通常被称为initrd或initramfs系统。内存中类似的系统在Debian安装程序中使用。
/init程序是内存中的根文件系统上执行的第一个程序。这个程序在用户空间把内核初始化,并把控制权交给下一阶段。迷你Debian系统能够在主引导流程之前添加内核模块或以加密形式挂载根文件系统,使引导流程更加灵活。

  • 如果initramfs 是由initramfs-tools 创建,则”/init” 程序是一个shell 脚本程序。
  • 通过给内核添加“break=init” 等启动参数,实现中断这部分启动流程以获取root shell。这个shell环境已足够成熟,通过它可以很好地检查机器的硬件。
  • 迷你Debian系统中可用的命令是精简过的,且主要由一个称为busybox的GNU工具提供。
  • 如果initramfs 是由dracut 创建,则”/init” 程序是一个二进制systemd 程序。
  • 迷你Debian系统中可用的命令是一个精简过的systemd环境。

1.4 第四阶段:常规Debian系统

由迷你Debian系统启动。迷你Debian系统的内核在此环境下继续运行。根文件系统将由内存切换到实际的硬盘文件系统上。
init程序是系统执行的第一个程序,它启动其它各种程序以完成主引导流程。init程序的默认路径是”/sbin/init“,但可通过内核启动参数修改,例如”init=/path/to/init_program”。
默认的init程序一直在变化中:

  • squeeze之前的Debian(Debian 6.0),使用简单的SysV风格的init。
  • wheezy版本的Debian(Debian 7)对SysV风格的init做了改进:使用LSB头将启动步骤排序,同时并行执行启动脚本。
  • jessie版本的Debian(Debian 8)将默认init切换成systemd,以使用事件驱动和并行初始化。

2 systemd初始化

systemd初始化进程基于单元配置文件来并行派生进程,这些单元配置文件使用声明样式来书写,代替之前的类SysV的过程样式。这些单元配置文件从下面的一系列路径来加载:

  • /lib/systemd/system: OS默认配置文件
  • /etc/systemd/system: 系统管理员的配置文件,它将忽略操作系统默认的配置文件
  • /run/systemd/system: 运行时产生的配置文件,它将忽略安装的配置文件

他们的相互依赖关系通过”Wants=”, ”Requires=”, ”Before=”, ”After=”, …等指示来配置,里的”MAPPING OF UNIT PROPERTIES TO THEIR INVERSES”。资源控制也是被定义。根据单元配置文件的后缀来区分它们的类型:

  • *.service描述由systemd控制和监管的进程.
  • *.device描述在sysfs里面作为udev设备树展示的设备。
  • *.mount描述由systemd控制和监管的文件系统挂载点。
  • *.automount描述由systemd控制和监管的文件系统自动挂载点。
  • *.swap描述由systemd控制和监管的swap文件或设备。
  • *.path描述被systemd监控的路径,用于基于路径的活动。
  • *.socket描述被systemd控制和监管的套接字,用于基于套接字的活动。
  • *.timer描述被systemd控制和监管的计时器,用于基于时间的活动。
  • *.slice管理cgroups的资源。
  • *.scope使用systemd的总线接口来程序化的创建,用以管理一系列系统进程。
  • *.target把其它单元配置文件分组,在启动的时候,来创建同步点。

系统启动时,systemd进程会尝试启动/lib/systemd/system/default.target。首先,一些特殊的target单元,比如”local-fs.target”、”swap.target”和”cryptsetup.target” 会被引入以挂载文件系统。之后,其它target单元也会根据单元依赖关系而被引入。systemd提供向后兼容的功能。在/etc/init.d/rc.d/里面的SysV风格的启动脚本仍然会被分析;telinit会被转换为systemd的单元活动请求。

2.1 主机名

内核维护系统主机名。在启动的时候,通过systemd-hostnamed.service启动的系统单位设置系统的主机名,此主机名保存在/etc/hostname。这个文件应该只包含系统主机名,而不是全称域名。

2.2 文件系统

硬盘和网络文件系统的挂载选项可以在/etc/fstab中设置
加密文件系统的配置设置在/etc/crypttab
软RAID的配置mdadm设置在/etc/mdadm/mdadm.conf

2.3 网络接口初始化

Debian系统中,网络接口通常由两个服务进行初始化:lo接口通常在“networking.service”处理,而其它接口则由“NetworkManager.service”处理。

2.4 内核消息

在控制台上显示的内核错误信息,能够通过设置他们的阈值水平来配置。

root@debian11:~# dmesg -n3
错误级别值错误级别名称说明
0KERN_EMERG系统不可用
1KERN_ALERT行为必须被立即采取
2KERN_CRIT危险条件
3KERN_ERR错误条件
4KERN_WARNING警告条件
5KERN_NOTICE普通但重要的条件
6KERN_INFO信息提示
7KERN_DEBUGdebug

2.5 系统消息

在systemd下, 内核和系统的信息都通过日志服务systemd-journald.service来记录,放在/var/log/journal下的不变的二进制数据,或放在/run/log/journal/下的变化的二进制数据. 这些二进制日志数据,可以通过journalctl命令来访问。
在systemd下, 系统日志工具rsyslogd改变它的行为来读取变化的二进制数据,并能够创建传统的不变的ASCII系统日志数据。
/etc/default/rsyslog/etc/rsyslog.conf能够自定义系统消息的日志文件和屏幕显示

2.6 systemd下的系统管理

systemd不仅仅提供系统初始化,还提供通用的系统管理功能。比如说日志记录,登录管理,时间管理,网络管理等等。
systemd通过几个命令来管理:

  • systemctl命令控制systemd的系统和服务管理器(命令行),
  • systemsdm命令控制systemd的系统和服务管理器(图形界面),
  • journalctl命令查询systemd日志,
  • loginctl命令控制systemd登录管理器,
  • systemd-analyze分析系统启动性能。

$unit可以是一个单元名,也可以匹配的多个单元
系统状态改变命令,通常是通过sudo来处理,用以获得需要的系统管理权限。
systemctl status $unit|$PID|$device的输出使用有颜色的点(●)来概述单元状态:

  • 白色的表示一个”不活动”或”变为不活动中”的状态。
  • 红色的表示“失败”或者“错误”状态。
  • 绿色表示“活动”、“重新加载中”或“激活中”状态。

2.7 定制systemd

使用默认安装,通过systemd启动的过程中,在network.target启动后,很多网络服务作为后台守护进程(daemon)启动。shd也不列外。让我们修改为按需启动sshd作为一个定制化的例子。
首先,禁用系统安装的服务单元。

$ sudo systemctl stop sshd.service
$ sudo systemctl mask sshd.service

传统Unix服务的按需套接字激活(on-demand socket activation)系统由indetd超级服务来提供。在systemd下, 相同功能能够通过增加*.socket*.service单元配置文件来启用。
sshd.socket用来定义一个监听的套接字

[Unit]
Description=SSH Socket for Per-Connection Servers[Socket]
ListenStream=22
Accept=yes[Install]
WantedBy=sockets.target

sshd@.service作为sshd.socket匹配的服务文件

[Unit]
Description=SSH Per-Connection Server[Service]
ExecStart=-/usr/sbin/sshd -i
StandardInput=socket

然后重新加载。

$ sudo systemctl daemon-reload

3 udev系统

对于Linux内核2.6版和更新版本,udev系统提供了自动硬件发现和初始化机制。在内核发现每个设备的基础上,udev系统使用从sysfs文件系统的信息启动一个用户进程,使用modprobe程序加载支持它所要求的内核模块, 创建相应的设备节点。

如果/lib/modules/5.10.0-8-amd64/modules.dep没有正常生成,模块可能不会被udev系统按期望的方式加载。执行depmod -a来修复它(重构modules.dep)。该文件描述了modprobe程序使用的模块依赖性。

设备节点的名字,可以通过/etc/udev/rules.d/里的udev文件来配置。当前默认的规则倾向创建动态生成的名字,除了光驱和网络设备外,会生成非静态的设备名。通过添加和光驱、网络设备类似的个性化规则,你也可以为USB盘之类的其它设备,生成静态设备名。

3.1 内核模块初始化

通过modprobe程序添加和删除内核模块,使我们能够从用户进程来配置正在运行的Linux内核。udev系统自动化它的调用来帮助内核模块初始化。
下面的非硬件模块和特殊的硬件驱动模块,需要被预先加载,把它们在”/etc/modules” 文件里列出

  • TUN/TAP 模块提供虚拟的Point-to-Point 网络设备(TUN) 和虚拟的Ethernet以太网网络设备(TAP),
  • netfilter 模块提供netfilter防火墙能力
  • watchdog timer驱动模块。
    modprobe程序的配置文件是按modprobe.conf的说明放在/etc/modprobes.d/目录下,(如果你想避免自动加载某些内核模块,考虑把它们作为黑名单放在/etc/modprobes.d/blacklist文件里.)

modinfo程序显示Linux内核模块信息。
lsmod程序以好看的格式展示/proc/modules的内容, 显示当前内核加载了哪些模块。

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

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

相关文章

厚膜电阻电路丝网印刷

厚膜丝网印刷 该技术用于需要长寿命、热耐久性、机械强度、导热性、高密度电气互连、低介电损耗等的苛刻应用 特征: 陶瓷标准工艺从前到后的通孔连接 正面和背面的丝网印刷电阻器是标准工艺 金导体可以用金线和/或氧化铝线进行线键合 可焊接金属化,…

Java 将不同的List集合复制到另一个集合

在Java中&#xff0c;你可以使用多种方法将一个或多个List集合的元素复制到另一个List集合中。 以下是一些常见的方法&#xff1a; 使用addAll方法&#xff1a; 如果要将一个List的所有元素添加到另一个List的末尾&#xff0c;可以使用addAll方法。 List<String> list1 …

第三十四章 添加和使用自定义标题元素 - 支持的标头元素

文章目录 第三十四章 添加和使用自定义标题元素 - 支持的标头元素支持的标头元素标头元素和 WSDL必需的标题元素 定义自定义标题元素 第三十四章 添加和使用自定义标题元素 - 支持的标头元素 支持的标头元素 IRIS 网络服务和客户端自动支持 WS-Addressing 和 WS-Security 标头…

oracle 数据库导入dmp文件

荆轲刺秦王 从线上正式环境导出的 dmp 文件&#xff0c;导入到本地 oracle 数据库。 1. 创建用户: CREATE USER hf_chip IDENTIFIED BY hf_chip; 2. 授予 CONNECT 和 RESOURCE 基本权限给新用户。 GRANT CONNECT, RESOURCE TO hf_chip; 3. 创建表空间 CREATE TABLESPACE…

python技术面试题(其三)

二十一&#xff0c; 谈谈正则的贪婪模式和非贪婪模式 在数量级匹配符中使用 默认为贪婪模式&#xff0c;用最多量的方式完成匹配 数量级匹配符后加&#xff1f;即为非贪婪 用最少的方式完成匹配 二十二&#xff0c; a1 aa1 的堆栈内存过程 不可变类型&#xff0c;在调用栈里…

【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;初步了解 二叉搜索树 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀map与set &#x1f4d2;1.…

Scala Iterator(迭代器)

Scala Iterator(迭代器) Scala Iterator(迭代器)是一种用于访问集合元素序列的抽象数据类型。它提供了一种高效的方式来逐个访问集合中的元素,而不需要暴露其底层结构。Scala中的迭代器是不可变的,这意味着它们只能被单向遍历一次。一旦迭代器被消耗完,就不能再重新使用…

C# 实战-Controls属性

在C#窗体应用中&#xff0c;Controls是Control类或其派生类&#xff08;如Form、Panel、GroupBox等&#xff09;的一个属性。它表示控件集合&#xff0c;这个集合包含了控件的所有子控件。通过Controls属性可以访问、添加或删除控件。以下是几个详细的例子来说明如何理解和使用…

开发uniapp插件包aar文件,使uniapp可以调用jar包

背景 使用 uniapp 开发应用时&#xff0c;很多时候都需要调用第三方的sdk&#xff0c;一般以 jar 为主。为了应对这个问题&#xff0c;官方提供了插件方案&#xff0c;可以将第三方 jar 包进行封装为 aar 包后&#xff0c;再集成到 uniapp 中使用。 一、环境安装工具 1、jdk…

AI大模型是真的贵

背景&#xff1a; 微软和谷歌母公司Alphabet最新公布的季度财报均显示&#xff0c;由于企业客户在人工智能服务上的投入增加&#xff0c;其云计算业务实现了显著的收入增长。尽管Meta在将人工智能技术转化为收益方面稍显滞后&#xff0c;但它表示&#xff0c;其相关努力对提高…

C语言练习02-数组

一、求最值 已知数组元素为{33,5,22,44,55}&#xff0c;找出数组中的最大值并打印在控制台 #include<stdio.h> #include<math.h>int main() {int arr[] {33,5,22,44,55};int max arr[0];int len sizeof(arr) / sizeof(int); //注意&#xff1a;sizeof(arr)计算…

力扣(2024.06.20)

1. 48——旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 标签&#xff1a;数组&#xff0c;数学&#xff0c;矩阵 代码…

【无线传感网】分簇路由算法介绍

目录 1、LEACH路由算法 2、PEGASIS 算法 3、TEEN 算法 5、APTEEN 5、LEACH-C 算法 无线传感网中的路由协议就是寻找一条路径让网络中节点沿着这条路径将数据信息传输出去。路由协议的两大关键要点就是路径的优化和数据的分组,在传统计算机网络中,是将网络的拓扑…

Linux系统安装Dify结合内网穿透实现远程访问本地LLM开发平台

文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker快速部署大语言模型应用开发平台Dify,并结合cpolar内网穿透工具实现公网环境远程访问…

【驱动篇】龙芯LS2K0300之驱动示例

实验环境 开发板&#xff1a;龙芯LS2K0300久久派 网络配置&#xff1a;配置好ssh连接&#xff0c;通过网口可以scp文件到开发板&#xff0c;参考前一篇文章 串口配置&#xff1a;通过CH340T模块连接好开发板上的UART0 示例程序 驱动代码 #include <linux/init.h> #…

python数组列表操作简记

python数组列表操作简记 一、python列表、数组增删元素1.1列表增删元素1.2数组增删元素1.2.1array数组1.2.2numpy数组 二、python列表、数组排序2.1列表排序2.1.1数值类型或无数字字符串类型2.1.2数字和字母组成的字符串类型2.1.3多字段类型 2.2数组排序2.2.1array数组2.2.2num…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] API集群访问频次统计(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

thewall-文件包含-CAP_DAC_READ_SEARCH

thewalleasyAkamai 防火墙、绕过wall、fuzz、文件包含利用、exiftool提权、sudo提权、ssh私钥利用 **后续需要虚拟机的私信我&#xff0c;我会打包进行文章发布链接&#xff0c;请持续关注&#xff01;&#xff01;&#xff01;** 服务探测 ┌──(kali㉿kali)-[~] └─$ su…

C#如何把DLL打包进EXE制作单文件绿色程序

在C#中&#xff0c;将DLL打包进EXE通常涉及到一个过程&#xff0c;这个过程会将DLL的内容和EXE文件结合在一起&#xff0c;使得最终的EXE文件在运行时可以不依赖于外部的DLL文件。这个过程可以通过ILMerge工具或者.NET Core的发布功能来实现。 使用ILMerge ILMerge是一个开源…

Python酷库之旅-第三方库openpyxl(01)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…