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

参考来源:

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.mfbz.cn/a/692166.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】冒泡排序(经典算法,干货满满!!!)

目录 前言1、原理2、冒泡排序的应用3、对冒泡排序的应用的优化4、冒泡排序适用于以下情况 前言 冒泡排序(Bubble Sort)是一种简单直观的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它…

嵌入式学习——4——C++中的动态内存分配和回收(堆区)

1、内存的分配与回收 C语言中使用的是malloc和free函数进行动态内存分配和回收的。 C中依然可以使用上述的两个函数来完成动态内存分配和回收的。 C也给用户提供了两个关键字new、delete来完成动态内存分配和回收的 单个分配、回收 //在堆区申请了int类型的大小空间&#xff0c…

Java面试八股之组合、聚合和关联三者的区别是什么

组合、聚合和关联三者的区别是什么 关联(Association): 最基本的一种关系,表示一个类知道另一个类的存在,或者说是类之间的某种联系。 关联可以是双向的也可以是单向的,且不规定参与关联的对象的生存周期。 实例&a…

MySQL数据库(详解)

目录 前言 一、数据库的基本概念 1.数据(Data) 2.表 3.数据库 4.数据库管理系统(DBMS) 5.数据库系统 二、数据库系统发展史 1.第一代数据库 2.第二代数据库 3.第三代数据库 三、当今主流数据库介绍 1.SQL Server (微软公司产品) 2.Oracle (甲骨文公司产品) 3.DB…

SwiftUI中Mask修饰符的理解与使用

Mask是一种用于控制图形元素可见性的图形技术&#xff0c;使用给定视图的alpha通道掩码该视图。在SwiftUI中&#xff0c;它类似于创建一个只显示视图的特定部分的模板。 Mask修饰符的定义&#xff1a; func mask<Mask>(alignment: Alignment .center,ViewBuilder _ ma…

地图之战争迷雾/地图算法/自动导航(一)

战争迷雾 TiledMap 创建黑色覆盖块&#xff0c;然后使用碰撞组件&#xff0c;控制黑色块的显示和隐藏 地图算法 在有些游戏中&#xff0c;地图需要随机生成&#xff0c;比如游戏中的迷宫等&#xff0c;这就需要地图生成的算法&#xff1b;在角色扮演类游戏中&#xff0c;角色…

「Qt Widget中文示例指南」如何实现一个简单的RHI小部件示例(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文将为大家演示如…

阿里大模型又又又又开源了!这次还是王炸产品!

阿里大模型又双叒叕开源了&#xff1a;刚刚&#xff0c;Qwen2 宣布开源&#xff01; 不到一年时间&#xff0c;阿里云通义千问先后开源近 10 款不同尺寸的大语言模型&#xff0c;之前开源的 Qwen 系列 72B、110B 模型就曾多次登顶 HuggingFace 的 Open LLM Leaderboard 开源模型…

两个不同的TA Instance之间可以共享全局变量吗

答案&#xff1a;不能。 在GP规范里其实是有规定&#xff0c;在不同的TA Instance之间&#xff0c;都是有着各自的physical memory space的&#xff0c;都是相互独立物理地址空间的。 不同的TA instance之间&#xff0c;各自拥有各自的堆空间、可写全局数据段、可写静态数据段。…

Python可视化 | 使用matplotlib绘制面积图示例

面积图是数据可视化中的一个有效工具&#xff0c;用于说明时间上的关系和趋势。它们提供了一种全面的、视觉上迷人的方法&#xff0c;通过熟练地将折线图的可读性与填充区域的吸引力相结合来呈现数值数据。 在本文中&#xff0c;我们将学习更多关于在Python中创建面积折线图的…

前端渲染大量数据思路【虚拟列表】【异步机制】

当浏览器遇到性能瓶颈导致页面卡顿时&#xff0c;你会怎么处理&#xff1f;如何查找问题的原因&#xff1f; 浏览器本身自带性能检测工具&#xff0c;通常我们分析由脚本导致的页面卡顿会选择 性能&#xff08;performance&#xff09; 选项卡&#xff0c;在其中我们可以找到导…

从诺曼底登陆八十周年说起

昨天&#xff08;2024年6月6日&#xff09;是诺曼底登陆&#xff08;Normandy Campaign&#xff09;八十周年纪念日。媒体上有很多对相关纪念活动的报道。 诺曼底登陆战役&#xff0c;是第二次世界大战也是世界战争史上规模最大的登陆战役。敦刻尔克大撤退后&#xff0c;西欧大…

Qt Window Dialog 无标题栏 ,无边框,可拖动

1.效果&#xff1a; 2. 主要实现步骤&#xff1a; 设置窗口 flag&#xff1a; this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); 创建变量存储位置 QPoint m_dragPosition; 对鼠标左键按下和移动事件做处理 void DraggableDialog::mousePre…

【Linux操作系统】Linux中进程的五种状态:R、S、D、T、X以及僵尸进程、孤儿进程

操作系统中有许多同时执行的进程&#xff0c;这些进程都可能处于不同的状态代表着不同的含义。 R运行状态(running) 概念&#xff1a;并不意味着进程一定在运行中&#xff0c;它表明进程要么是在运行中要么在运行队列里。 我们运行可执行程序myproc利用指令 ps ajx可以看到进程…

Java 18 新功能概述

Java 18 在 2022 年 3 月 22 日正式发布&#xff0c;Java 18 不是一个长期支持版本。 包含多项新特性和改进&#xff0c;如文件系统链接、文本块、表达式求值API、ForkJoinPool优化、Optional新方法等。 亮点还包括预览特性&#xff1a;Record Pattern Matching for Switch和增…

Elastic Search(ES)Java 入门实操(3)数据同步

基本概念和数据查询代码&#xff1a; Elastic Search &#xff08;ES&#xff09;Java 入门实操&#xff08;1&#xff09;下载安装、概念-CSDN博客 Elastic Search&#xff08;ES&#xff09;Java 入门实操&#xff08;2&#xff09;搜索代码-CSDN博客 想要使用 ES 来查询数…

为什么会有虚像

本来我就打算写虚像相关的内容&#xff0c;实际上我看不懂光学的内容&#xff0c;我只是发觉书上没有使用变分法来做&#xff0c;而只是解析几何的变换&#xff0c;这个做法完全脱离实际&#xff0c;物理书为什么会这样写不知道原因&#xff0c;但是很明显这样的内容也非常的复…

操作系统复习-存储管理之段页式存储管理

存储管理之段页式存储管理 页式存储管理(等分划分) 字块是相对物理设备的定义页面则是相对逻辑空间的定义指的都是大小一样的一块内存页式存储管理是将进程逻辑空间等分成若干大小的页面相应的把物理内存空间分成与页面大小的物理块以页面为单位把进程空间装进物理内存中分散的…

【MySQL】常见可执行程序

本文使用的版本是MySQL8&#xff0c;5.7可能会有所不同。 MySQL提供了一些重要的程序用来管理和操作数据库。这里会介绍一些常用的程序及其使用。对于MySQL程序的使用&#xff0c;可以查看官方帮助手册来学习。 MySQL :: MySQL 8.0 Reference Manual :: 6 MySQL Programs 程序…

normalizing flows vs 直方图规定化

normalizing flows名字的由来 The base density P ( z ) P(z) P(z) is usually defined as a multivariate standard normal (i.e., with mean zero and identity covariance). Hence, the effect of each subsequent inverse layer is to gradually move or “flow” the da…