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 开始成为默认机制。

工作流程

  1. 引导加载器 加载内核(vmlinuz)和 initramfs 到内存。

  2. 内核将 initramfs 解压到 tmpfs 并作为初始根文件系统(/)。

  3. /init(通常是 shell 脚本或 systemd)执行,加载必要的驱动和工具。

  4. 挂载真正的根文件系统,并切换根目录(pivot_root)。

  5. 真正的 init 进程接管,initramfs 被释放。

更快的启动速度(无需挂载块设备)。动态调整大小,节省内存。支持更复杂的早期用户空间(如 systemd 在 initramfs 中运行)。

3、initrd vs. initramfs 对比

特性initrdinitramfs
存储方式块设备(如 /dev/ram0tmpfs(内存文件系统)
格式磁盘映像(ext2+gzipcpio 归档(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/chkconfigsystemctl + .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操作系统加载过程。

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

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

相关文章

AIStarter Windows 版本迎来重磅更新!模型插件工作流上线,支持 Ollama / ComfyUI 等多平台本地部署模型统一管理

如果你正在使用 AIStarter 工具进行本地 AI 模型部署 &#xff0c;那么这条消息对你来说非常重要&#xff01; 在最新推出的 AIStarter Windows 正式版更新中 &#xff0c;官方对整个平台进行了功能重构和性能优化&#xff0c;尤其是新增了「模型插件工作流 」功能&#xff0c…

深入理解桥接模式:解耦抽象与实现的设计艺术

一、为什么需要桥接模式&#xff1f;从“类爆炸”问题说起 你是否遇到过这样的开发困境&#xff1f; 当需要为系统扩展新功能时&#xff0c;继承体系像滚雪球一样越变越臃肿&#xff1a;新增一种遥控器类型&#xff0c;需要为电视、音响各写一个子类&#xff1b;新增一种设备类…

Java 中的泛型原理与实践案例

引言&#xff1a;为什么需要泛型 在Java 5之前&#xff0c;集合类只能存储Object类型的对象&#xff0c;这带来了两个主要问题&#xff1a; 类型不安全&#xff1a;可以向集合中添加任何类型的对象&#xff0c;容易出错繁琐的类型转换&#xff1a;从集合中取出元素时需要手动…

springboot3+vue3融合项目实战-大事件文章管理系统-获取文章分类详情

GetMapping("/detail")public Result<Category> detail(Integer id){Category c categoryService.findById(id);return Result.success(c);}在CategoryService接口增加 Category findById(Integer id); 在CategoryServiceImpl增加 Overridepublic Category f…

从零开始创建一个 Next.js 项目并实现一个 TodoList 示例

Next.js 是一个基于 React 的服务端渲染框架&#xff0c;它提供了很多开箱即用的功能&#xff0c;如自动路由、API 路由、静态生成、增量静态再生等。本文将带你一步步创建一个 Next.js 项目&#xff0c;并实现一个简单的 TodoList 功能。 效果地址 &#x1f9f1; 安装 Next.j…

分布式锁: Redisson红锁(RedLock)原理与实现细节

分布式锁是分布式系统的核心基础设施&#xff0c;但 单节点 Redis 锁在高可用场景下存在致命缺陷&#xff1a;当 Redis 主节点宕机时&#xff0c;从节点可能因异步复制未完成而丢失锁信息&#xff0c;导致多个客户端同时持有锁。为此&#xff0c;Redis 作者 Antirez 提出了 Red…

c++多态面试题之(析构函数与虚函数)

有以下问题展开 析构函数要不要定义成虚函数&#xff1f;基类的析构函数要不要定义成虚函数&#xff1f;如果不定义会有什么问题&#xff0c;定义了在什么场景下起作用。 1. 基类析构函数何时必须定义为虚函数&#xff1f; 当且仅当通过基类指针&#xff08;或引用&#xff09;…

Python高级进阶:Vim与Vi使用指南

李升伟 整理 在 Python 高级进阶中&#xff0c;使用 Vim 或 Vi 作为代码编辑器可以显著提升开发效率&#xff0c;尤其是在远程服务器开发或快速脚本编辑时。以下是关于它们在 Python 开发中的高级应用详解&#xff1a; 1. Vim/Vi 简介 Vi&#xff1a;经典的 Unix 文本编辑器…

Dify中使用插件LocalAI配置模型供应商报错

服务器使用vllm运行大模型&#xff0c;今天在Dify中使用插件LocalAI配置模型供应商后&#xff0c;使用工作流的时候&#xff0c;报错&#xff1a;“Run failed: PluginInvokeError: {"args":{},"error_type":"ValueError","message":&…

深度学习驱动下的目标检测技术:原理、算法与应用创新(二)

三、主流深度学习目标检测算法剖析 3.1 R - CNN 系列算法 3.1.1 R - CNN 算法详解 R - CNN&#xff08;Region - based Convolutional Neural Networks&#xff09;是将卷积神经网络&#xff08;CNN&#xff09;应用于目标检测领域的开创性算法&#xff0c;其在目标检测发展历…

【Umi】项目初始化配置和用户权限

app.tsx import { RunTimeLayoutConfig } from umijs/max; import { history, RequestConfig } from umi; import { getCurrentUser } from ./services/auth; import { message } from antd;// 获取用户信息 export async function getInitialState(): Promise<{currentUse…

[学习] RTKLib详解:qzslex.c、rcvraw.c与solution.c

RTKLib详解&#xff1a;qzslex.c、rcvraw.c与solution.c 本文是 RTKLlib详解 系列文章的一篇&#xff0c;目前该系列文章还在持续总结写作中&#xff0c;以发表的如下&#xff0c;有兴趣的可以翻阅。 [学习] RTKlib详解&#xff1a;功能、工具与源码结构解析 [学习]RTKLib详解…

移植RTOS,发现任务栈溢出怎么办?

目录 1、硬件检测方法 2、软件检测方法 3、预防堆栈溢出 4、处理堆栈溢出 在嵌入式系统中&#xff0c;RTOS通过管理多个任务来满足严格的时序要求。任务堆栈管理是RTOS开发中的关键环节&#xff0c;尤其是在将RTOS移植到新硬件平台时。堆栈溢出是嵌入式开发中常见的错误&am…

window 显示驱动开发-使用有保证的协定 DMA 缓冲区模型

Windows Vista 的显示驱动程序模型保证呈现设备的 DMA 缓冲区和修补程序位置列表的大小。 修补程序位置列表包含 DMA 缓冲区中命令引用的资源的物理内存地址。 在有保证的协定模式下&#xff0c;用户模式显示驱动程序知道 DMA 缓冲区和修补程序位置列表的确切大小&#xff0c;…

SD-HOST Controller design-----SD CLK 设计

hclk的分频电路&#xff0c;得到的分频时钟作为sd卡时钟。 该模块最终输出两个时钟&#xff1a;一个为fifo_sd_clk,另一个为out_sd_clk_dft。当不分频时&#xff0c;fifo_sd_clk等于hclk&#xff1b;当分频时候&#xff0c;div_counter开始计数&#xff0c;记到相应分频的时候…

完全背包问题中「排列数」与「组合数」的核心区别

&#x1f3af; 一句话理解 求组合数&#xff08;不计顺序&#xff09; → 外层遍历物品&#xff0c;内层遍历背包容量 求排列数&#xff08;计顺序&#xff09; → 外层遍历背包容量&#xff0c;内层遍历物品 &#x1f3b2; 举例说明 假设有硬币 [1, 2, 3]&#xff0c;目标金…

NHANES指标推荐:MDS

文章题目&#xff1a;The association between magnesium depletion score (MDS) and overactive bladder (OAB) among the U.S. population DOI&#xff1a;10.1186/s41043-025-00846-x 中文标题&#xff1a;美国人群镁耗竭评分 &#xff08;MDS&#xff09; 与膀胱过度活动症…

C++:字符串操作函数

strcpy() 功能&#xff1a;把一个字符串复制到另一个字符串。 #include <iostream> #include <cstring> using namespace std;int main() {char src[] "Hello";char dest[10];strcpy(dest, src);cout << "Copied string: " << …

1基·2台·3空间·6主体——蓝象智联解码可信数据空间的“数智密码”

近日&#xff0c;由全国数据标准化技术委员会编制的《可信数据空间 技术架构》技术文件正式发布&#xff0c;标志着我国数据要素流通体系向标准化、规范化迈出关键一步。该文件从技术功能、业务流程、安全要求三大维度对可信数据空间进行系统性规范&#xff0c;为地方、行业及企…

基于TI AM6442+FPGA解决方案,支持6网口,4路CAN,8个串口

TI AM6442FPGA解决方案具有以下技术优势及适用领域&#xff1a; 一、技术优势 ‌异构多核架构‌&#xff1a;AM6442处理器集成7个内核&#xff08;2xCortex-A534xCortex-R5F1xCortex-M4F&#xff09;&#xff0c;可实现应用处理、实时控制和独立任务分核协同&#xff0c;满足…