操作系统的启动过程和初始化

news2024/7/4 5:49:32

参考来源:

Linux的启动过程,作者:阮一峰

在这里插入图片描述

第一步、加载内核

操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。

root@ub1804:/boot# ls -l
总用量 120636
-rw-r--r-- 1 root root   237767 519  2023 config-5.4.0-150-generic
-rw-r--r-- 1 root root   237767 68  2023 config-5.4.0-152-generic
drwxr-xr-x 5 root root     4096 329 16:40 grub
-rw-r--r-- 1 root root 45647993 325 21:30 initrd.img-5.4.0-150-generic
-rw-r--r-- 1 root root 45650233 325 21:36 initrd.img-5.4.0-152-generic
-rw-r--r-- 1 root root   182704 128  2016 memtest86+.bin
-rw-r--r-- 1 root root   184380 128  2016 memtest86+.elf
-rw-r--r-- 1 root root   184840 128  2016 memtest86+_multiboot.bin
-rw------- 1 root root  4587657 519  2023 System.map-5.4.0-150-generic
-rw------- 1 root root  4587726 68  2023 System.map-5.4.0-152-generic
-rw------- 1 root root 10981640 519  2023 vmlinuz-5.4.0-150-generic
-rw------- 1 root root 11006216 68  2023 vmlinuz-5.4.0-152-generic

查看默认启动的内核条目

运行 cat /boot/grub/grub.cfg | grep menuentry 命令会列出所有内核版本及其启动参数,包括常规模式和恢复模式,其中标记为默认启动的内核条目会包含 --class 参数,表示其类型和角色

root@ub1804:/etc/init# cat /boot/grub/grub.cfg | grep menuentry
if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
  menuentry_id_option=""
export menuentry_id_option
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-f767af68-b9f3-4980-9dd4-59e4384a541f' {
submenu 'Ubuntu 的高级选项' $menuentry_id_option 'gnulinux-advanced-f767af68-b9f3-4980-9dd4-59e4384a541f' {
	menuentry 'Ubuntu,Linux 5.4.0-152-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-152-generic-advanced-f767af68-b9f3-4980-9dd4-59e4384a541f' {
	menuentry 'Ubuntu, with Linux 5.4.0-152-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-152-generic-recovery-f767af68-b9f3-4980-9dd4-59e4384a541f' {
	menuentry 'Ubuntu,Linux 5.4.0-150-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-150-generic-advanced-f767af68-b9f3-4980-9dd4-59e4384a541f' {
	menuentry 'Ubuntu, with Linux 5.4.0-150-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-150-generic-recovery-f767af68-b9f3-4980-9dd4-59e4384a541f' {
menuentry 'Memory test (memtest86+)' {
menuentry 'Memory test (memtest86+, serial console 115200)' {
root@ub1804:/etc/init# cat /boot/grub/grub.cfg | grep menuentry
if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
  menuentry_id_option=""
export menuentry_id_option
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-f767af68-b9f3-4980-9dd4-59e4384a541f' {
submenu 'Ubuntu 的高级选项' $menuentry_id_option 'gnulinux-advanced-f767af68-b9f3-4980-9dd4-59e4384a541f' {
	menuentry 'Ubuntu,Linux 5.4.0-152-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-152-generic-advanced-f767af68-b9f3-4980-9dd4-59e4384a541f' {
	menuentry 'Ubuntu, with Linux 5.4.0-152-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-152-generic-recovery-f767af68-b9f3-4980-9dd4-59e4384a541f' {
	menuentry 'Ubuntu,Linux 5.4.0-150-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-150-generic-advanced-f767af68-b9f3-4980-9dd4-59e4384a541f' {
	menuentry 'Ubuntu, with Linux 5.4.0-150-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-150-generic-recovery-f767af68-b9f3-4980-9dd4-59e4384a541f' {
menuentry 'Memory test (memtest86+)' {
menuentry 'Memory test (memtest86+, serial console 115200)' {

第二步、启动初始化进程

内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境

第三步、确定运行级别

许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。
init进程的一大任务,就是去运行这些开机启动的程序。但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。

通过命令runlevel或者who -r查看默认运行级别

在/etc/rc5.d/下存放着运行级别5下的启动服务

root@ub1804:/etc/init.d# cd /etc/
root@ub1804:/etc# cd r
rc0.d/            rc2.d/            rc4.d/            rc6.d/            request-key.conf  resolvconf/       rmt               rsyslog.conf      
rc1.d/            rc3.d/            rc5.d/            rcS.d/            request-key.d/    resolv.conf       rpc               rsyslog.d/        
root@ub1804:/etc# runlevel 
N 5
root@ub1804:/etc# who -r
         运行级别 5 2024-06-07 13:15
root@ub1804:/etc# 
root@ub1804:/etc/rc5.d# ls -l
总用量 0
lrwxrwxrwx 1 root root 15 320 23:40 S01acpid -> ../init.d/acpid
lrwxrwxrwx 1 root root 17 320 23:40 S01anacron -> ../init.d/anacron
lrwxrwxrwx 1 root root 16 320 23:40 S01apport -> ../init.d/apport
lrwxrwxrwx 1 root root 14 518 11:39 S01atop -> ../init.d/atop
lrwxrwxrwx 1 root root 18 518 11:39 S01atopacct -> ../init.d/atopacct
lrwxrwxrwx 1 root root 16 42 21:27 S01autofs -> ../init.d/autofs
lrwxrwxrwx 1 root root 22 320 23:40 S01avahi-daemon -> ../init.d/avahi-daemon
lrwxrwxrwx 1 root root 24 322 17:04 S01binfmt-support -> ../init.d/binfmt-support
lrwxrwxrwx 1 root root 19 320 23:40 S01bluetooth -> ../init.d/bluetooth
lrwxrwxrwx 1 root root 26 320 23:40 S01console-setup.sh -> ../init.d/console-setup.sh
lrwxrwxrwx 1 root root 14 320 23:40 S01cron -> ../init.d/cron
lrwxrwxrwx 1 root root 14 320 23:40 S01cups -> ../init.d/cups
lrwxrwxrwx 1 root root 22 320 23:40 S01cups-browsed -> ../init.d/cups-browsed
lrwxrwxrwx 1 root root 14 320 23:40 S01dbus -> ../init.d/dbus
lrwxrwxrwx 1 root root 14 320 23:40 S01gdm3 -> ../init.d/gdm3
lrwxrwxrwx 1 root root 21 320 23:40 S01grub-common -> ../init.d/grub-common
lrwxrwxrwx 1 root root 20 320 23:40 S01irqbalance -> ../init.d/irqbalance
lrwxrwxrwx 1 root root 20 320 23:40 S01kerneloops -> ../init.d/kerneloops
lrwxrwxrwx 1 root root 22 530 17:30 S01mountdebugfs -> ../init.d/mountdebugfs
lrwxrwxrwx 1 root root 18 320 23:40 S01plymouth -> ../init.d/plymouth
lrwxrwxrwx 1 root root 15 320 23:40 S01rsync -> ../init.d/rsync
lrwxrwxrwx 1 root root 17 320 23:40 S01rsyslog -> ../init.d/rsyslog
lrwxrwxrwx 1 root root 15 320 23:40 S01saned -> ../init.d/saned
lrwxrwxrwx 1 root root 27 320 23:40 S01speech-dispatcher -> ../init.d/speech-dispatcher
lrwxrwxrwx 1 root root 23 320 23:40 S01spice-vdagent -> ../init.d/spice-vdagent
lrwxrwxrwx 1 root root 13 321 00:27 S01ssh -> ../init.d/ssh
lrwxrwxrwx 1 root root 17 321 00:37 S01sysstat -> ../init.d/sysstat
lrwxrwxrwx 1 root root 20 321 00:37 S01ubuntu-fan -> ../init.d/ubuntu-fan
lrwxrwxrwx 1 root root 29 320 23:40 S01unattended-upgrades -> ../init.d/unattended-upgrades
lrwxrwxrwx 1 root root 15 320 23:40 S01uuidd -> ../init.d/uuidd
lrwxrwxrwx 1 root root 18 320 23:40 S01whoopsie -> ../init.d/whoopsie

/etc/rc5.d目录中的脚本命名方式

遵循特定的规则,这些规则对于理解系统启动过程中服务的管理至关重要。以下是具体介绍:

  1. 基本命名结构
    • 启动与关闭指定:在/etc/rc5.d目录下的脚本名称通常以"S"或"K"开头,后跟一个数字和脚本名。其中"S"表示启动(Start),而"K"表示关闭(Kill)。这种命名方式使得在系统启动或关闭时,可以根据需要在相应的运行级别下启动或停止服务
    • 执行顺序确定:紧跟在"S"或"K"后面的数字用于确定脚本的执行顺序。数字越小,该脚本将越早被执行。这一点在管理系统服务时尤为重要,因为某些服务可能需要其他服务先启动才能正常运行[1][2]。
  2. 脚本链接内容
    • 指向实际脚本/etc/rc5.d中的脚本实际上是符号链接,它们指向/etc/init.d/目录下的实际脚本文件。这种设计使得系统维护和升级更加灵活,因为管理员只需要编辑或替换/etc/init.d/中的脚本文件,而不必在每个运行级别的目录下都进行更改[2]。
    • 简化操作流程:通过这种方式,添加或删除服务变得简单。管理员可以通过创建或删除符号链接来轻松地在不同的运行级别中添加或移除服务,而无需复制脚本文件到每个rcX.d目录中[3]。

第四步、加载开机启动程序

Linux的解决办法,就是七个 /etc/rcN.d 目录里列出的程序,都设为链接文件,指向另外一个目录 /etc/init.d ,真正的启动脚本都统一放在这个目录中。init进程逐一加载开机启动程序,其实就是运行这个目录里的启动脚本。

第五步、用户登录

开机启动程序加载完毕以后,就要让用户登录了

一般来说,用户的登录方式有三种:
(1)命令行登录
(2)ssh登录
(3)图形界面登录

这三种情况,都有自己的方式对用户进行认证。

(1)命令行登录:init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码(Debian还会再多运行一个身份核对程序/etc/pam.d/login)。如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell。

root@ub1804:/etc# cat /etc/passwd | grep xiaoyue
xiaoyue:x:1000:1000:xiaoyue,,,:/home/xiaoyue:/bin/bash

(2)ssh登录:这时系统调用sshd程序(Debian还会再运行/etc/pam.d/ssh ),取代getty和login,然后启动shell。

(3)图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果密码正确,就读取/etc/gdm3/Xsession,启动用户的会话。

第六步、进入 login shell

所谓shell,简单说就是命令行界面,让用户可以直接与操作系统对话。用户登录时打开的shell,就叫做login shell。

Debian默认的shell是Bash,它会读入一系列的配置文件。上一步的三种情况,在这一步的处理,也存在差异。

(1)命令行登录:首先读入 /etc/profile,这是对所有用户都有效的配置;然后依次寻找下面三个文件,这是针对当前用户的配置。

 ~/.bash_profile
  ~/.bash_login
 ~/.profile

需要注意的是,这三个文件只要有一个存在,就不再读入后面的文件了。比如,要是 ~/.bash_profile 存在,就不会再读入后面两个文件了。

root@ub1804:/etc/rc5.d# cat /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "${PS1-}" ]; then
  if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

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

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

相关文章

数据结构--实验

话不多说,直接启动!👌🤣 目录 一、线性表😎 1、建立链表 2、插入元素 3、删除特定位置的元素 4、输出特定元素值的位置 5、输出特定位置的元素值 6、输出整个链表 实现 二、栈和队列😘 栈 顺序栈 …

LeetCode | 1470.重新排列数组

class Solution(object):def shuffle(self, nums, n):""":type nums: List[int]:type n: int:rtype: List[int]"""result []for i in range(n):result.append(nums[i])result.append(nums[i n])return result这题很容易想到的就是遍历整个数组…

HQL面试题练习 —— 累加刚好超过各省GDP40%的地市名称

目录 1 题目2 建表语句3 题解 1 题目 现有各省地级市的gdp数据,求从高到底累加刚好超过各省GDP40%的地市名称,临界地市也需要。例如: 浙江省的杭州24% 宁波 20% ,杭州宁波44% 大于40% 取出杭州、宁波 江苏省的苏州19% 南京 14% 无锡 12%&am…

天行健咨询 | 谢宁DOE培训的课程内容有哪些?

谢宁DOE培训的课程内容丰富而深入,旨在帮助学员掌握谢宁问题解决方法在质量管理中的重要作用,并学会如何运用这一方法工具,在不中断生产过程的前提下,找出并解决生产中遇到的复杂而顽固的问题。 首先,课程会详细介绍谢…

国产神器,这个太强悍了 !

自从 ChatGPT 火了以后,国内的 AI 大模型也是越来越多,各家都有不同的侧重点,其中,咱们国家队的代表就是阿里的通义千问了。就在今天,通义千问推出了第二代开源模型系列Qwen2,下面跟大家重点介绍一下这个新…

【面试干货】索引的优缺点

【面试干货】索引的优缺点 1、创建索引可以大大提高系统的性能(**优点**)2、增加索引也有许多不利的方面(**缺点**) 💖The Begin💖点点关注,收藏不迷路💖 1、创建索引可以大大提高系…

mac无法读取windows分区怎么办 苹果硬盘怎么读取

对于Mac电脑用户但有Windows系统使用需求的,我们可以通过Boot Camp启动转换助理安装Windows分区这个方案来解决,不过因为两个系统的磁盘格式不同,相应的也会产生一些问题,例如无法正常读取windows分区。下面本文就详细说明mac无法…

前端三大件速成 05 javascript(1)js组成、引入、基本语法

文章目录 一、js组成二、js的引入三、基本语法1、变量2、基本规范3、关键字4、数据类型(1)基本数据类型(2)引用数据类型(3)数据类型转换(4)typeof运算符 5、运算符6、流程控制&#…

优化扩散模型中的采样计划

在生成模型领域,扩散模型(Diffusion Models, DMs)因其卓越的生成质量而成为最新的技术趋势。但这些模型的一个关键缺点是它们的采样速度较慢,需要通过大型神经网络进行多次顺序函数评估。扩散模型通过一个称为采样计划的离散噪声水…

Elastic Search(ES)Java 入门实操(2)搜索代码

上篇解释了 ES 的基本概念和分词器。Elastic Search (ES)Java 入门实操(1)下载安装、概念-CSDN博客 Elastic Search(ES)Java 入门实操(3)数据同步-CSDN博客 这篇主要演示 Java 整合…

Day 42 LVS四层负载均衡

一:负载均衡简介 1.集群是什么 ​ 集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术 …

PyTorch深度学习实战(44)——基于 DETR 实现目标检测

PyTorch深度学习实战(44)——基于 DETR 实现目标检测 0. 前言1. Transformer1.1 Transformer 基础1.2 Transformer 架构 2. DETR2.1 DETR 架构2.2 实现 DETR 模型 3. 基于 DETR 实现目标检测3.1 数据加载与模型构建3.2 模型训练与测试 小结系列链接 0. 前…

windows安装tensorboard

要在Windows系统上使用TensorBoard来可视化你的TensorFlow模型训练过程,请按照以下步骤进行操作: 安装TensorFlow和TensorBoard 安装Python: 确保你已经安装了Python。你可以从Python官方网站下载并安装最新版本的Python。 安装TensorFlow&…

kafka-重试和死信主题(SpringBoot整合Kafka)

文章目录 1、重试和死信主题2、死信队列3、代码演示3.1、appication.yml3.2、引入spring-kafka依赖3.3、创建SpringBoot启动类3.4、创建生产者发送消息3.5、创建消费者消费消息 1、重试和死信主题 kafka默认支持重试和死信主题 重试主题:当消费者消费消息异常时&…

基于思通数科大模型的设备隐患智能检测:图像处理与声音分析的融合应用

在现代工业生产中,设备的稳定运行对保障生产效率和产品质量至关重要。然而,设备的老化、磨损以及异常状态的检测往往需要大量的人力和物力。思通数科大模型结合图像处理技术和声音分析技术,为设备隐患检测提供了一种自动化、高效的解决方案。…

源码、反码和补码

对于有符号数而言,原码就是一个数的二进制表示。二进制的最高位是符号位,0 表示正数,1 表示负数。 计算机用数的原码进行显示,数的计算和存储是用补码进行的。 正数的原码,反码和补码都一样,即正数三码合…

Matching Anything by Segmenting Anything

摘要 在复杂场景中跨视频帧稳健地关联相同对象是许多应用的关键,特别是多目标跟踪(MOT)。当前方法主要依赖于标注的特定领域视频数据集,这限制了学习到的相似度嵌入的跨域泛化能力。我们提出了MASA,一种新颖的方法用于…

JavaScript 动态网页实例 —— 图像显示

图像是网页设计中必不可少的内容之一,而图像的显示方式更是关系到网站的第一印象。本章介绍图像的显示,主要包括:图片的随机显示、图像的显示和隐藏、图像的滚动显示、图像的探照灯扫描显示、多幅图像的翻页显示、图像的水纹效果显示、全景图效果显示手电照射效果显示以及雷达…

揭秘800G以太网——简介

什么是800G以太网? 800G以太网是一种高带宽以太网标准,每秒可传输800 Gbps(千兆位每秒)的数据速率。它代表了以太网技术的又一进步,旨在满足不断增长的数据传输需求以及处理大量数据的能力。因此,800G以太…

杰理AC632N提升edr的hid传输速率, 安卓绝对坐标触摸点被识别成鼠标的修改方法

第一个问题: 首先修改edr的hid传输速率.修改你的板级配置,里面的一个地方给注释掉了,请打开那个注释就能提升edr的hid传输效率了 第二个问题: 修改632n系别把触摸板的hid报告描述符识别成鼠标点,修改如下: 注释掉上面的pnp,改成下面的