Debian的系统启动过程

2024-06-22 17:04
文章标签 过程 系统启动 debian

本文主要是介绍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的内容, 显示当前内核加载了哪些模块。

这篇关于Debian的系统启动过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084886

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

Solr 使用Facet分组过程中与分词的矛盾解决办法

对于一般查询而言  ,  分词和存储都是必要的  .  比如  CPU  类型  ”Intel  酷睿  2  双核  P7570”,  拆分成  ”Intel”,”  酷睿  ”,”P7570”  这样一些关键字并分别索引  ,  可能提供更好的搜索体验  .  但是如果将  CPU  作为 Facet  字段  ,  最好不进行分词  .  这样就造成了矛盾  ,  解决方法

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

ORACLE语法-包(package)、存储过程(procedure)、游标(cursor)以及java对Result结果集的处理

陈科肇 示例: 包规范 CREATE OR REPLACE PACKAGE PACK_WMS_YX IS-- Author : CKZ-- Created : 2015/8/28 9:52:29-- Purpose : 同步数据-- Public type declarations,游标 退休订单TYPE retCursor IS REF CURSOR;-- RETURN vi_co_co

OpenStack创建虚拟机过程

OpenStack创建虚拟机过程 一、在分析OpenStack创建虚拟机的过程之前,先来梳理一下需要用用到哪些组件。 二、每一步都需要去keystone去进行验证,下图有详细的流程。 登录界面或命令行通过RESTful API向keystone获取认证信息。keystone通过用户请求认证信息,并生成auth-token返回给对应的认证请求。界面或命令行通过RESTful API

Maven生命周期:深入理解构建过程

目录 1. Maven生命周期简介 2. 默认生命周期的阶段 3. 清理生命周期 4. 站点生命周期 5. Maven生命周期的灵活性 6. 结论         在Java开发中,Maven是一个不可或缺的工具,它通过自动化项目的构建、依赖管理和文档生成等任务,极大地提高了开发效率。Maven的核心之一是其构建生命周期,它定义了项目构建过程中的一系列阶段。在这篇文章中,我们将深

在Debian 8上安装Node.js的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 Node.js 是一个通用编程的 JavaScript 平台,允许用户快速构建网络应用程序。通过在前端和后端都使用 JavaScript,开发可以更加一致,并且可以在同一个系统中设计。 在本指南中,您将在 Debian 8 服务器上安装 Node.js。Debian 8 包含一个版本的

JVM工作过程

将JVM工作过程粗略分为5个阶段,包括加载阶段、链接阶段、初始化阶段、执行阶段、回收阶段 其中, (1)加载阶段、链接阶段的解析部分主要由类加载器完成 (2)初始化阶段是由JVM的类加载机制在类加载过程的最后阶段自动触发的。 (3)执行阶段主要由执行引擎负责 (4)回收阶段主要是垃圾收集器(Garbage Collector)负责。 所以,在Java虚拟机(JVM)中,读取字节码文件、解析字节码