QEMU学习之路(5)— 从0到1构建Linux系统镜像

news2025/4/17 14:12:16

QEMU学习之路(5)— 从0到1构建Linux系统镜像

一、前言

参考:从内核到可启动镜像:0到1构建你的极简Linux系统

二、linux源码获取

安装编译依赖

sudo apt install -y build-essential libncurses-dev flex bison libssl-dev libelf-dev

1、从Linux官网下载源码

wget https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.14.tar.xz

下好后使用命令解压

tar xvf linux-6.14.tar.xz

2、使用git拉取

git clone --depth 1 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git -b v6.14 linux-6.14

3、国内镜像源获取

从国外的网站下载内核可能很慢,可以尝试使用国内的镜像源,例如清华大学的开源镜像站

git clone --depth 1 https://mirrors.tuna.tsinghua.edu.cn/git/linux.git -b v6.14 linux-6.14

三、内核构建

源码获取好后可以使用如下命令生成默认配置

make defconfig

然后编译内核

make -j$(nproc)

编译后得到内核镜像文件:arch/x86_64/boot/bzImage
在这里插入图片描述

四、构建initramfs

initramfs(Initial RAM File System)是 Linux 系统启动过程中使用的 临时根文件系统,它存储在内存中,用于在内核加载后、挂载真实根文件系统前完成关键初始化任务。
使用如下命令构造目录结构与设备节点

mkdir -p initramfs/{bin,dev,proc,sys}
cd initramfs
sudo mknod dev/console c 5 1
sudo mknod dev/null c 1 3
sudo chown root:root dev/{console,null}

BusyBox 是一个高度优化的 多合一 Unix 工具集,它将数百个常用 Unix 工具(如 ls、cat、grep、mount、ifconfig 等)集成到一个精简的二进制文件中。
下载BusyBox 源码:

wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2

解压

tar -xf busybox-1.36.1.tar.bz2

进入源码目录进行配置

cd busybox-1.36.1
make menuconfig

进入配置界面后,启用以下选项吗,选择静态方式编译busybox,目的是将程序的所有依赖库直接打包进二进制文件,避免了Linux系统运行时依赖动态库。

Settings  --->
    [*] Build static binary (no shared libs) 

编译busybox

make -j$(nproc)

然后部署到initramfs

make install CONFIG_PREFIX=../work/initramfs

在initramfs目录新建init文件,它作为Linux 启动镜像(initramfs)中的 首个用户态进程(PID 1),由内核直接启动,承担着从内核过渡到用户空间的关键桥梁作用,主要任务是为后续系统启动准备必要的运行环境。输入内容如下:

#!/bin/sh
/bin/echo "Hello Linux"
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev

exec /bin/sh

使用chmod +x init命令添加可执行权限
在这里插入图片描述
然后将其打包到initramfs.img镜像文件中。

find . | cpio -H newc -o | gzip > ../initramfs.img

使用如下命令检查打包结果

file ../initramfs.img 

在这里插入图片描述

五、启动测试

将bzImage拷贝到当前目录
在这里插入图片描述
使用如下命令测试启动

qemu-system-x86_64 -kernel bzImage -initrd initramfs.img

启动后显示界面如下:
在这里插入图片描述
也可使用如下命令不带图形界面启动

qemu-system-x86_64 -kernel bzImage -initrd initramfs.img -m 1G -nographic -append "earlyprintk=serial,ttyS0 console=ttyS0"

六、制作ISO镜像

ISO文件是一种标准的光盘镜像格式(遵循ISO 9660文件系统规范),通常用于封装完整的可启动操作系统或软件集合。在Linux系统构建中,ISO文件的核心作用是将内核(vmlinuz)、初始内存盘(initramfs.img)和引导程序(如GRUB)等关键组件打包成一个可物理刻录(光盘/USB)或虚拟机加载的独立镜像。

构建boot目录

mkdir -p iso/boot/grub

将前面编译或者构建好的内核镜像文件(bzImage或者Image.gz)、根文件系统镜像文件(initramfs.img)添加到boot目录中

cp ../linux-6.14/arch/x86_64/boot/bzImage iso/boot/vmlinuz
cp ./initramfs.img iso/boot/initramfs.img

新建GRUB配置文件

touch iso/boot/grub/grub.cfg

输入内容如下

menuentry "Custom Linux" {
    linux /boot/vmlinuz root=/dev/ram0 rw
    initrd iso/boot/initramfs.img
}

在这里插入图片描述

安装工具依赖包

sudo apt install mtools xorriso

生成ISO

grub-mkrescue -o custom-linux.iso iso/

验证ISO结构

xorriso -indev custom-linux.iso -ls

在这里插入图片描述
使用如下命令启动:

qemu-system-x86_64 -cdrom custom-linux.iso

七、开发驱动

创建hello.c文件,内容如下所示:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("william");
MODULE_DESCRIPTION("Hello module");
MODULE_VERSION("0.1");


static int __init hello_init(void)
{
	printk(KERN_INFO "Loading hello module\n");
	printk(KERN_INFO "hello world\n");
	return 0;
}


static void __exit hello_exit(void)
{
	printk(KERN_INFO "exit module\n");
}

module_init(hello_init);
module_exit(hello_exit);

编写Makefile如下所示:

KERNELDIR=/home/william/project/linux/linux-6.14

obj-m := hello.o

all:
	make -C ${KERNELDIR} M=${PWD} modules

clean:
	make -C ${KERNELDIR} M=${PWD} clean

.PHONY: all clean

编译后将hello.ko拷贝到initramfs/usr/文件夹下,重新生成initramfs.img后启动系统
在这里插入图片描述
进入/usr目录后加载驱动,卸载驱动,可看到如下打印
在这里插入图片描述

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

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

相关文章

node ---- 解决错误【Error: error:0308010C:digital envelope routines::unsupported】

1. 报错 在 Node.js 18.18.0 的版本中&#xff0c;遇到以下错误&#xff1a; this[kHandle] new _Hash(algorithm, xofLen);^ Error: error:0308010C:digital envelope routines::unsupported这个错误通常发生在运行项目或构建时&#xff0c;尤其是在使用 Webpack、Vite 或其他…

蓝桥杯——走迷宫问题(BFS)

这是一个经典的BFS算法 1. BFS算法保证最短路径 核心机制&#xff1a;广度优先搜索按层遍历所有可能的路径&#xff0c;首次到达终点的路径长度即为最短步数。这是BFS的核心优势。队列的作用&#xff1a;通过队列按先进先出的顺序处理节点&#xff0c;确保每一步探索的都是当…

详解 Redis repl_backlog_buffer(如何判断增量同步)

一、repl_backlog_buffer 复制积压缓冲区&#xff08;Replication Backlog Buffer&#xff09; 是一个环形内存区域&#xff08;Ring Buffer&#xff09;&#xff0c;用于临时保存主节点最近写入的写命令&#xff0c;以支持从节点断线重连后的增量同步。 1.1 三个复制偏移量 …

使用PyTorch实现ResNet:从残差块到完整模型训练

ResNet&#xff08;残差网络&#xff09;是深度学习中的经典模型&#xff0c;通过引入残差连接解决了深层网络训练中的梯度消失问题。本文将从残差块的定义开始&#xff0c;逐步实现一个ResNet模型&#xff0c;并在Fashion MNIST数据集上进行训练和测试。 1. 残差块&#xff08…

Scala相关知识学习总结5

1、多维数组 定义&#xff1a; val arr Array.ofDim[Double](3,4) 表示二维数组中有三个一维数组&#xff0c;每个一维数组有四个元素。 2、列表 List 不可变 List&#xff1a;默认不可变&#xff0c;可创建有序且可重复的列表&#xff0c;可使用:从右向左增加数据&#xf…

Day1:前端项目uni-app壁纸实战

uni-app官网下载HBuilder。 uni-app快速上手 | uni-app官网 点击HBuilder 安装 新建项目 工具——插件安装 安装uni-app&#xff08;vue3&#xff09; 我们先来准备一下&#xff1a; 先在wallpaper下新建目录 我已经建过了 同样&#xff0c;再在common下建images和style目录&…

光谱相机的光谱数据采集原理

光谱相机的光谱数据采集原理基于‌分光技术‌和‌光电信号转换‌&#xff0c;通过将入射光按波长分解并记录各波段的强度信息&#xff0c;最终生成包含空间和光谱维度的数据立方体。以下是详细原理分解&#xff1a; ‌1. 分光技术&#xff1a;将复合光分解为单色光‌ 光谱相机…

宏碁笔记本电脑擎7PRO搭载的 NVIDIA RTX 5080 显卡安装pytorch

宏碁笔记本电脑擎7PRO搭载的 NVIDIA RTX 5080 显卡是一款高性能移动 GPU&#xff0c;基于 NVIDIA 最新的 Blackwell 架构设计&#xff0c;通过修正架构&#xff08;Blackwell&#xff09;、显存类型与带宽&#xff08;GDDR7、960GB/s&#xff09;、Tensor Core 与 RT Core 全面…

html+css+js 实现一个贪吃蛇小游戏

目录 游戏简介 游戏功能与特点 如何玩转贪吃蛇 游戏设计与实现 HTML结构 JavaScript核心实现 代码结构&#xff1a; 效果 关于“其他游戏” 游戏简介 贪吃蛇是一款经典的单人小游戏&#xff0c;玩家通过控制蛇的移动&#xff0c;吃掉食物来增加长度&#xff0c;避免撞…

Python爬虫生成CSV文件的完整流程

引言 在当今数据驱动的时代&#xff0c;网络爬虫已成为获取互联网数据的重要工具。Python凭借其丰富的库生态系统和简洁的语法&#xff0c;成为了爬虫开发的首选语言。本文将详细介绍使用Python爬虫从网页抓取数据并生成CSV文件的完整流程&#xff0c;包括环境准备、网页请求、…

21.OpenCV获取图像轮廓信息

OpenCV获取图像轮廓信息 在计算机视觉领域&#xff0c;识别和分析图像中的对象形状是一项基本任务。OpenCV 库提供了一个强大的工具——轮廓检测&#xff08;Contour Detection&#xff09;&#xff0c;它能够帮助我们精确地定位对象的边界。这篇博文将带你入门 OpenCV 的轮廓…

医学图像分割效率大幅提升!U-Net架构升级,助力精度提升5%!

在医学图像分割领域&#xff0c;U-Net模型及其变体的创新应用正在带来显著的性能提升和效率优化。最新研究显示&#xff0c;通过引入结构化状态空间模型&#xff08;SSM&#xff09;和轻量级LSTM&#xff08;xLSTM&#xff09;等技术&#xff0c;VMAXL-UNet模型在多个医学图像数…

智能设备运行监控系统

在工业 4.0 与智能制造浪潮下&#xff0c;设备运行效率与稳定性成为企业竞争力的核心要素。然而&#xff0c;传统设备管理模式面临数据采集分散、状态分析滞后、维护成本高昂等痛点。为破解这些难题&#xff0c;设备运行监控系统应运而生&#xff0c;通过融合智能传感、5G 通信…

服务器报错:xxx/libc.so.6: version `GLIBC_2.32‘ not found

/lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32 not found (required by ./aima-sim-app-main) 解决思路 根据错误信息&#xff0c;您的应用程序 aima-sim-app-main 和 libmujoco.so.3.1.6 库依赖于较新的 GNU C Library (glibc) 版本&#xff08;如 GLIBC_2.32, GLIBC…

Flutter之页面布局一

目录&#xff1a; 1、页面布局一2、无状态组件StatelessWidget和有状态组件StatefulWidget2.1、无状态组件示例2.2、有状态组件示例2.3、在 widget 之间共享状态1、使用 widget 构造函数2、使用 InheritedWidget3、使用回调 3、布局小组件3.1、布置单个 Widget3.2、容器3.3、垂…

架构思维: 数据一致性的两种场景深度解读

文章目录 Pre案例数据一致性问题的两种场景第一种场景&#xff1a;实时数据不一致不要紧&#xff0c;保证数据最终一致性就行第二种场景&#xff1a;必须保证实时一致性 最终一致性方案实时一致性方案TCC 模式Seata 中 AT 模式的自动回滚一阶段二阶段-回滚二阶段-提交 Pre 架构…

大数据knox网关API

我们过去访问大数据组件&#xff0c;如sparkui&#xff0c;hdfs的页面&#xff0c;以及yarn上面看信息是很麻烦的一件事。要记每个端口号&#xff0c;比如50070&#xff0c;8090&#xff0c;8088&#xff0c;4007&#xff0c;如果换到另一个集群&#xff0c;不同版本&#xff0…

【Tauri2】015——前端的事件、方法和invoke函数

目录 前言 正文 准备 关键url 获取所有命令 切换主题set_theme 设置大小 获得版本version 名字name 监听窗口移动 前言 【Tauri2】005——tauri::command属性与invoke函数-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146581991?spm1001.2014.3001.…

密码学基础——分组密码的运行模式

前面的文章中文我们已经知道了分组密码是一种对称密钥密码体制&#xff0c;其工作原理可以概括为将明文消息分割成固定长度的分组&#xff0c;然后对每个分组分别进行加密处理。 下面介绍分组密码的运行模式 1.电码本模式&#xff08;ECB&#xff09; 2.密码分组链接模式&…

Python----计算机视觉处理(Opencv:道路检测完整版:透视变换,提取车道线,车道线拟合,车道线显示,)

Python----计算机视觉处理&#xff08;Opencv:道路检测之道路透视变换) Python----计算机视觉处理&#xff08;Opencv:道路检测之提取车道线&#xff09; Python----计算机视觉处理&#xff08;Opencv:道路检测之车道线拟合&#xff09; Python----计算机视觉处理&#xff0…