Linux系统启动相关:vmlinux、vmlinuz、zImage,和initrd 、 initramfs,以及SystemV 和 SystemD
目录
一、vmlinux、vmlinuz、zImage、bzImage、uImage
二、initrd 和 initramfs
1、initrd(Initial RAM Disk)
2、initramfs(Initial RAM Filesystem)
3、initrd vs. initramfs 对比
4. 如何查看和生成 initramfs
三、SystemV 和 SystemD 的区别
一、vmlinux、vmlinuz、zImage、bzImage、uImage
vmlinux
是编译出来的最原始的内核文件,未经压缩的原始Linux内核可执行文件(ELF格式),包含调试符号,体积非常大。
主要用于内核调试(如用GDB分析崩溃),不直接用于启动系统。
vmlinuz
vmlinux
的压缩版本(名称中的 z
表示压缩),去除了调试符号,体积更小,是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接
实际用于系统启动的通用内核文件名称(如 /boot/vmlinuz-<version>
)
zImage
使用gzip压缩的小型内核镜像(适用于老式引导器),大小限制在约512KB
bzImage
Big zImage
,同样压缩但支持更大内核(现代x86系统的标准格式)
大多数x86架构系统的标准启动文件(如 /boot/bzImage-<version>
)
uImage
uboot
专用的内核镜像格式,在zImage/bzImage
前添加U-Boot头(包含加载地址等信息)
嵌入式系统中使用U-Boot引导时必需的文件(如ARM开发板)
二、initrd 和 initramfs
initrd
(Initial RAM Disk)和 initramfs
(Initial RAM Filesystem)都是 Linux 内核在启动过程中使用的临时根文件系统,用于在挂载真正的根文件系统之前提供必要的驱动、工具和脚本。尽管它们的目的一致,但实现方式不同。以下是它们的区别、工作原理及使用场景:
1、initrd(Initial RAM Disk)
-
基于块设备:
initrd
是一个压缩的磁盘映像(通常是gzip
压缩的ext2
或cramfs
文件系统),由引导加载器(如 GRUB)加载到内存。 -
需要挂载:内核将其视为一个块设备(如
/dev/ram0
),并挂载为临时根文件系统(/
)。 -
固定大小:需要预先分配固定大小的内存,可能导致资源浪费或空间不足。
工作流程
(1)引导加载器(如 GRUB)加载内核(vmlinuz
)和 initrd
到内存。
(2)内核解压 initrd
并挂载为临时根文件系统(/
)。
(3)initrd
中的 /linuxrc
或 /init
脚本执行,加载必要的模块(如磁盘驱动、LVM、加密等)。
(4)脚本挂载真正的根文件系统(如 /dev/sda1
),并切换根目录(pivot_root
或 chroot
)。
(5)真正的 init
进程(如 systemd
或 SysVinit
)接管,initrd
被卸载。
由于其基于块设备,效率较低。且大小固定不够灵活,因此现代 Linux 系统已逐渐淘汰initrd,改用initramfs。
2、initramfs(Initial RAM Filesystem)
-
基于 tmpfs(内存文件系统):initramfs是一个
cpio
归档文件(通常用gzip
压缩),直接解压到内核的内存文件系统(tmpfs
)。 -
无需挂载:内核直接将其解压到根文件系统,无需额外的块设备驱动。
-
动态大小:按需使用内存,更高效灵活。
-
现代标准:从 Linux 2.6 开始成为默认机制。
工作流程
-
引导加载器 加载内核(
vmlinuz
)和initramfs
到内存。 -
内核将
initramfs
解压到tmpfs
并作为初始根文件系统(/
)。 -
/init
(通常是 shell 脚本或systemd
)执行,加载必要的驱动和工具。 -
挂载真正的根文件系统,并切换根目录(
pivot_root
)。 -
真正的
init
进程接管,initramfs
被释放。
更快的启动速度(无需挂载块设备)。动态调整大小,节省内存。支持更复杂的早期用户空间(如
systemd
在 initramfs 中运行)。
3、initrd vs. initramfs 对比
特性 | initrd | initramfs |
---|---|---|
存储方式 | 块设备(如 /dev/ram0 ) | tmpfs (内存文件系统) |
格式 | 磁盘映像(ext2 +gzip ) | cpio 归档(gzip 压缩) |
挂载方式 | 需要挂载为块设备 | 直接解压到内存 |
大小 | 固定大小 | 动态调整 |
性能 | 较慢(需块设备访问) | 更快(直接内存访问) |
现代使用 | 已淘汰(旧系统可能使用) | 现代 Linux 默认机制 |
4. 如何查看和生成 initramfs
(1)查看 initramfs 内容
lsinitramfs /boot/initramfs-$(uname -r).img
# 或
unmkinitramfs /boot/initramfs-$(uname -r).img /tmp/initramfs
(2)生成initramfs
# Debian/Ubuntu(使用 update-initramfs)
update-initramfs -u -k $(uname -r)# RHEL/CentOS(使用 dracut)
dracut --force /boot/initramfs-$(uname -r).img $(uname -r)
(3)手动创建 initramfs
# 1. 创建一个简单的 initramfs 目录结构
mkdir -p initramfs/{bin,dev,proc,sys}
# 2. 复制必要的工具(如 busybox)
cp /bin/busybox initramfs/bin/
# 3. 创建 init 脚本(必须是可执行的)
echo -e '#!/bin/sh\nmount -t proc proc /proc\nexec /bin/sh' > initramfs/init
chmod +x initramfs/init
# 4. 打包成 cpio.gz
(cd initramfs && find . | cpio -H newc -o | gzip > ../initramfs.cpio.gz)
三、SystemV 和 SystemD 的区别
SystemV 和 SystemD 是 Linux 系统中两种不同的初始化(init)系统,用于管理系统的启动和服务。
特性 | SystemV (SysV) | SystemD |
---|---|---|
启动方式 | 顺序执行脚本(串行) | 并行启动服务 |
运行级别 | 0-6(如 runlevel3=多用户模式) | 使用 target (如 multi-user.target ) |
服务管理 | /etc/init.d/ 脚本 + service /chkconfig | systemctl + .service 单元文件 |
日志管理 | 依赖 syslog | 内置 journalctl |
依赖管理 | 手动定义启动顺序 | 自动依赖解析 |
默认配置文件 | /etc/inittab | /etc/systemd/system/default.target |
根据Linux内核驱动流程,在架构有关的汇编代码完成特定初始化后,会调用start_kernel开始内核的初始化工作;
- start_kernel函数中有关根文件系统挂载的简要执行流程概述如下:
start_kernel→ vfs_caches_init()→ mnt_init()→ init_rootfs() // 注册rootfs→ init_mount_tree() // 挂载rootfs到/→ rest_init()→ kernel_init()→ do_basic_setup()→ populate_rootfs() // 处理initramfs/initrd→ 检查/init是否存在?→ 是:执行init_post() // 用户空间接管→ 否:prepare_namespace()→ mount_root() // 挂载真实根文件系统→ sys_mount(".", "/", MS_MOVE) // 切换根目录
- 其中,rest_init函数中依次创建了三个进程,idle进程,init进程以及kthreadd进程;
- kernel_init函数中调用do_basic_setup函数,解压释放initramfs类型文件系统到rootfs的根目录,其中就必须包括
/init
可执行文件;
对于采用SystemV管理的系统
在系统启动过程中,/init可执行文件通常是init程序本身,在制作initramfs根文件系统时,需要将init程序打包进去,并确保/init指向这个init程序。init程序启动后,会读取/etc/inittab文件来确定系统的默认运行级别,并执行相应的脚本。
具体步骤如下:
- 制作initramfs根文件系统时,将init程序打包进去。
- 创建/init到init程序的软链接。
- init程序启动后,读取/etc/inittab文件,确定系统的默认运行级别。
- 根据运行级别,init程序会执行/etc/rc.d/rc script,该脚本会进一步调用/etc/rc.d/rc<number>脚本(其中<number>是运行级别)。
- /etc/rc.d/rc<number>脚本会启动或停止相应的服务,以完成系统的初始化过程。
对于采用SystemD管理的系统,
- 实际上
/init
可执行文件是systemd的符号链接,所以在init_post函数中执行的用户进程即为systemd; - 在制作initramfs根文件系统时,将systemd程序也打包进去,创建
/init
到systemd的软链接,即可启动systemd; - systemd启动后,完成后续的linux操作系统加载过程。
相关文章:
Linux系统启动相关:vmlinux、vmlinuz、zImage,和initrd 、 initramfs,以及SystemV 和 SystemD
目录 一、vmlinux、vmlinuz、zImage、bzImage、uImage 二、initrd 和 initramfs 1、initrd(Initial RAM Disk) 2、initramfs(Initial RAM Filesystem) 3、initrd vs. initramfs 对比 4. 如何查看和生成 initramfs 三、Syste…...

JSP链接MySQL8.0(Eclipse+Tomcat9.0+MySQL8.0)
所用环境 Eclipse Tomcat9.0 MySQL8.0.21(下载:MySQL Community Server 8.0.21 官方镜像源下载 | Renwole) mysql-connector-java-8.0.21(下载:MySQL :: Begin Your Download) .NET Framework 4.5.2(下…...
Python爬虫-爬取百度指数之人群兴趣分布数据,进行数据分析
前言 本文是该专栏的第56篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前的文章《Python爬虫-爬取百度指数之需求图谱近一年数据》中,笔者有详细介绍过爬取需求图谱的数据教程。 而本文,笔者将再以百度指数为例子,基于Python爬虫获取指定关键词的人群“兴…...

SEO长尾词与关键词优化实战
内容概要 在SEO优化体系中,长尾关键词与核心关键词的协同作用直接影响流量获取效率与用户转化路径。长尾词通常由3-5个词组构成,搜索量较低但意图明确,能精准触达细分需求用户;核心关键词则具备高搜索量与广泛覆盖能力࿰…...

机器学习-人与机器生数据的区分模型测试-数据处理1
附件为训练数据,总体的流程可以作为参考。 导入依赖 import pandas as pd import os import numpy as np from sklearn.model_selection import train_test_split,GridSearchCV from sklearn.ensemble import RandomForestClassifier,VotingClassifier from skle…...

HelloWorld
HelloWorld 新建一个java文件 文件后缀名为 .javahello.java【注意】系统可能没有显示文件后缀名,我们需要手动打开 编写代码 public class hello {public static void main(String[] args) {System.out.print(Hello,World)} }编译 javac java文件,会生…...
令牌桶和漏桶算法使用场景解析
文章目录 什么时候用令牌桶,什么时候用漏桶算法??先放结论 两个算法一眼看懂什么时候选令牌桶?什么时候选漏桶?组合用法(90% 的真实系统都会这么干)小结记忆 对令牌桶和漏桶组合用法再次详细叙述…...
轻量、优雅、高扩展的事件驱动框架——Hibiscus-Signal
在现代企业级应用中,事件驱动架构(EDA)已成为解耦系统、提升扩展性的利器。今天给大家推荐一个非常优秀的国产轻量级事件驱动框架 —— Hibiscus Signal,它不仅天然整合 Spring Boot,还提供完整的事件生命周期支持&…...

SEO 优化实战:ZKmall模板商城的 B2C商城的 URL 重构与结构化数据
在搜索引擎算法日益复杂的今天,B2C商城想要在海量信息中脱颖而出,仅靠优质商品和营销活动远远不够。ZKmall模板商城以实战为导向,通过URL 重构与结构化数据优化两大核心策略,帮助 B2C 商城实现从底层架构到搜索展示的全面升级&…...
2020CCPC河南省赛题解
A. 班委竞选 签到题,模拟。 #include <bits/stdc.h> #define x first #define y second #define int long long //#define double long doubleusing namespace std; typedef unsigned long long ULL ; typedef pair<int,int> PII ; typedef pair<d…...

数字万用表与指针万用表使用方法及注意事项
在电子测量领域,万用表是极为常用的工具,数字万用表和指针万用表各具特点。熟练掌握它们的使用方法与注意事项,能确保测量的准确性与安全性。下面为您详细介绍: 一 、数字万用表按钮功能 > 进入及退出手动量程模式 每 按 […...
虚拟主播肖像权保护,数字时代的法律博弈
首席数据官高鹏律师团队 在虚拟主播行业蓬勃发展的表象之下,潜藏着一场关乎法律边界的隐形战争。当一位虚拟偶像的3D模型被非法拆解、面部数据被批量复制,运营方惊讶地发现——传统的肖像权保护体系,竟难以完全覆盖这具由代码与数据构成的“…...

【读代码】端到端多模态语言模型Ultravox深度解析
一、项目基本介绍 Ultravox是由Fixie AI团队开发的开源多模态大语言模型,专注于实现音频-文本的端到端实时交互。项目基于Llama 3、Mistral等开源模型,通过创新的跨模态投影架构,绕过了传统语音识别(ASR)的中间步骤,可直接将音频特征映射到语言模型的高维空间。 核心优…...

RabbitMQ工作流程及使用方法
一、什么是RabbitMQ RabbitMQ 是一款基于 AMQP(高级,消息队列协议) 的开源消息中间件,专为分布式系统设计,用于实现应用程序间的异步通信,其核心功能是通过 消息代理(Message Broker&…...
Java 面向对象进阶:解锁多态、内部类与包管理
Java 面向对象进阶:解锁多态、内部类与包管理 🔑 在 Java 的面向对象编程中,多态赋予了对象“多种形态”的能力,内部类提供了更精细的代码组织方式,而包则帮助我们管理和组织大量的类。今天,我们将深入探讨…...

算法:分治法
实验内容 在一个2kⅹ2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为特殊方格,且称该棋盘为一特殊棋盘。 显然,特殊方格出现的位置有4k 种情况,即k>0,有4k 种不同的特殊棋盘 棋盘覆盖:…...

MySQL初阶:sql事务和索引
索引(index) 可以类似理解为一本书的目录,一个表可以有多个索引。 索引的意义和代价 在MySQL中使用select进行查询时会经过: 1.先遍历表 2.将条件带入每行记录中进行判断,看是否符合 3.不符合就跳过 但当表中的…...

docker部署第一个Go项目
1.前期准备 目录结构 main.go package mainimport ("fmt""github.com/gin-gonic/gin""net/http" )func main() {fmt.Println("\n .::::.\n .::::::::.\n :::::::::::\n …...
day27 python 装饰器
目录 一、装饰器的基本概念 示例:用装饰器优化质数查找函数 二、装饰器的高级用法 1. 支持任意参数的装饰器 2. 装饰器的返回值处理 在 Python 编程中,装饰器是一个非常强大的功能,它可以让其他函数或方法在不需要做任何代码修改的前提下…...

Visual Studio2022跨平台Avalonia开发搭建
由于我已经下载并安装了 VS2022版本,这里就跳过不做阐述。 1.安装 Visual Studio 2022 安装时工作负荷Tab页勾选 “.NET 桌面开发” 和“Visual Studio扩展开发” ,这里由于不是用的微软的MAUI,所以不用选择其他的来支持跨平台开发&a…...

css iconfont图标样式修改,js 点击后更改样式
背景: 在vue项目中,通过点击/鼠标覆盖,更改选中元素的样式,可以通过js逻辑,也可以根据css样式修改。包括以下内容:iconfont图标的引入以及使用,iconfont图标样式修改【导入文件是纯白࿰…...

开源项目实战学习之YOLO11:12.4 ultralytics-models-sam-memory_attention.py源码分析
👉 点击关注不迷路 👉 点击关注不迷路 👉 另外,前些天发现了一个巨牛的AI人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。感兴趣的可以点击相关跳转链接。 点击跳转到网站。 ultralytics-models-sam 1.sam-modules-memory_attention.pyblocks.py: 定义模…...

【沉浸式求职学习day42】【算法题:滑动窗口】
沉浸式求职学习 长度最小的子数组水果成篮 关于算法题:滑动窗口的几个题目 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组…...

LIIGO ❤️ RUST 12 YEARS
LIIGO 💖 RUST 12 YEARS 今天是RUST语言1.0发布十周年纪念日。十年前的今天,2015年的今天,Rust 1.0 正式发行。这是值得全球Rust支持者隆重纪念的日子。我借此机会衷心感谢Rust语言创始人Graydon Hoare,Mozilla公司,以…...

Linux基础开发工具二(gcc/g++,自动化构建makefile)
3. 编译器gcc/g 3.1 背景知识 1. 预处理(进行宏替换/去注释/条件编译/头文件展开等) 2. 编译(生成汇编) 3. 汇编(生成机器可识别代码) 4. 连接(生成可执行文件或库文件) 3.2 gcc编译选项 格式 : gcc …...
Linux zip、unzip 压缩和解压
zip 命令用于压缩文件,压缩后的文件后缀名为 .zip 。 对应的解压命令是 unzip 。 测试用的目录结构如下, userzn:~/test$ tree . ├── folder1 │ ├── folder111 │ │ └── file1.txt │ └── main1.c ├── folder2 │ ├── …...
muduo库TcpConnection模块详解——C++
muduo库中的TcpConnection模块详解 TcpConnection是muduo库中处理TCP连接的核心模块,负责管理单个TCP连接的生命周期、数据读写、状态转换以及事件回调。每个TCP连接对应一个TcpConnection对象,其设计体现了高性能、线程安全和灵活回调的特点。 一、核心…...
Node.js 源码架构详解
Node.js 的源码是一个庞大且复杂的项目,它主要由 C 和 JavaScript 构成。要完全理解每一部分需要大量的时间和精力。我会给你一个高层次的概述,并指出一些关键的目录和组件,帮助你开始探索。 Node.js 的核心架构 Node.js 的核心可以概括为以…...

全局异常处理:如何优雅地统一管理业务异常
在软件开发中,异常处理是保证系统健壮性的重要环节。一个良好的异常处理机制不仅能提高代码的可维护性,还能为使用者提供清晰的错误反馈。本文将介绍如何通过全局异常处理和业务异常统一处理来编写更加优雅的代码。 一、传统异常处理的痛点 1.1 典型问…...
分布式锁: Redis和ZooKeeper两种分布式锁对比
在分布式系统中,分布式锁是协调多节点共享资源访问的核心机制。Redis 和 ZooKeeper 是两种常用的分布式锁实现方案,但两者的设计理念、适用场景和优缺点存在显著差异。本文将从 一致性模型、性能、可靠性、实现原理 等维度进行对比,并提供技术…...