【干货】教你在十分钟内编译一个Linux内核,并在虚拟机里运行!

news2025/7/15 1:20:30

前言

这篇文章将会简单的介绍如何在Linux系统上面,编译一个5.19的内核,然后在QEMU虚拟机中运行。

下载Linux内核源码

首先,我们需要下载Linux的代码:

https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.19.10.tar.xz

然后,把它解压到一个地方,比如在桌面新建一个叫做linux-5.19-build的文件夹,然后把代码解压进去。

这个时候,我们的目录结构应该是这样子:

安装所需的软件包

在控制台输入以下命令,安装所需的软件包。

sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison qemu qemu-system qemu-kvm

如果你的电脑运行的不是Ubuntu/Debian系列的Linux发行版,请使用对应的包管理器安装以上软件。

配置Linux的编译选项

Linux有很多的编译选项,我们选择默认的即可。

首先,我们在linux源代码的文件夹内,右键打开终端。请确保终端显示的“当前工作目录”为”linux-5.19-build/linux-5.19.10″.

接着,我们创建Linux的默认编译配置,在控制台输入:

make defconfig

当显示”configuration written to .config”字样之后,说明配置创建成功。我们可以进入下一步。

注解:如果你想对linux内核进行裁减或者交叉编译,请使用”make menuconfig”选项,可以自定义你的编译配置。当然,对于新手来说,默认配置就可以了。

开始编译Linux

终于,我们可以开始编译Linux内核了,我们只需要在控制台输入以下命令即可。

make -j $(nproc) bzImage

根据电脑的性能不同,编译时间从1分钟到二十分钟甚至更久。

ps: 我在E5-2640v4双路服务器上(总共40个逻辑处理器)编译,花费1分36秒的时间。在配备AMD R7-4800H(总共16个逻辑处理器)的笔记本电脑上花费2分25秒的时间。

当显示“Kernel: arch/x86/boot/bzImage is ready“的时候,意味着编译完成了。

怎么运行?工作还没有完成!

Linux内核只是一个内核,我们要运行它的话,还需要一个磁盘文件系统来放置一些所需的文件和程序。因此我们还需要一个工具:busybox

配置BusyBox

按照百科的定义:

BusyBox

BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet等。

那我们如何下载它?

我们可以这样,在linux-5.19-build文件夹下,输入以下命令,即可下载busybox的代码,并解压它。

wget https://busybox.net/downloads/busybox-1.35.0.tar.bz2
tar xvf busybox-1.35.0.tar.bz2

解压之后,目录结构如图所示:

 

然后我们在busybox文件夹下打开控制台,输入以下命令,配置它的编译选项:

make menuconfig

然后就会弹出这样一个界面:

 

我们可以通过上下左右键来操作它。选中Settings,然后回车进入。

一直按方向键,往下找到Build Options

然后选中“Build static binary“,按下键盘的y键,即可选中它。选中之后前面的方框的*号会亮起。如图所示:

 

接着,我们按键盘的右键,将底部光标移动到Exit处,按回车,回到主界面。

 

接着在主界面同样也是exit.

就会弹出界面询问我们是否保存,我们选择Yes即可。

 

创建磁盘镜像

接着,我们回到“桌面/linux-5.19-build”文件夹,在控制台输入以下命令,创建磁盘镜像:

dd if=/dev/zero of=rootfs.img bs=1M count=20
mkfs.ext4 rootfs.img

然后,我们接着运行以下命令,编译BusyBox它装进磁盘镜像。

mkdir fs
sudo mount -t ext4 -o loop rootfs.img ./fs
cd busybox-1.35.0
sudo make install -j $(nproc) CONFIG_PREFIX=../fs
# 为文件系统创建一些必须的文件夹
cd ../fs
sudo mkdir proc dev etc home mnt
sudo cp -r ../busybox-1.35.0/examples/bootfloppy/etc/* etc/
cd ..
# 更改权限,以免无法运行
sudo chmod -R 777 fs/ 
# 卸载磁盘镜像
sudo umount fs

启动Linux内核

至此,我们的准备工作已经全部完成!我们可以在QEMU虚拟机中启动Linux内核了。

在“桌面/linux-5.19-build”文件夹下的控制台输入命令:

qemu-system-x86_64 -kernel ./linux-5.19.10/arch/x86_64/boot/bzImage  -hda rootfs.img  -append "root=/dev/sda"

于是,内核就成功启动了。如图所示,我们能够看到当前目录下有一些文件夹。

 

我们也能够使用一些常用的Linux命令来操作了。

转载请注明来源:教你在十分钟内编译一个Linux内核,并在虚拟机里运行 | | 龙进的博客

欢迎关注我的公众号“灯珑”,让我们一起了解更多的事物~

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

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

相关文章

使用vue互联QQ音乐完成网站音乐播放器

🎶 文章简介:使用vue互联QQ音乐完成网站音乐播放器 💡 创作目的:记录使用APlayer播放器MetingJs实现 在线播放qq音乐、网易云音…等平台的音乐 ☀️ 今日天气:2022-11-19 小雨多云 天空灰蒙蒙的 🥲 &#x…

还在付费使用 XShell?我选择这款超牛逼的 SSH 客户端,完全免费

分享过FinallShell这款SSH客户端,也是xiaoz目前常用的SSH客户端工具,FinalShell使用起来方便顺手,但令我不爽的是tab数量变多的时候FinalShell越来越卡,而且内存占用也比较高。 最近发现一款使用使用C语言开发的跨平台SSH客户端W…

【无人机】基于Matlab的四旋翼无人机控制仿真

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

uni-app —— 下拉刷新 上拉加载

文章目录 前言一、下拉刷新 1.开启下拉刷新2.监听下拉刷新3.关闭下拉刷新二、上拉加载总结一、下拉刷新 1. 开启下拉刷新 在uni-app中有两种方式开启下拉刷新 需要在 ​​pages.json ​​​ 里,找到的当前页面的pages节点,并在​​style​​​ 选项中开…

这次把怎么做好一个PPT讲清-总体篇

文章目录一、背景二、图表化、图示化三、关键词设计四、版式层级五、逻辑关系图**1)常用逻辑****2)如何让逻辑关系图好看**六、对齐、分组和对比**对齐****分组****分组就是将同类得信息放在一起,靠的更近一点**那么,实现分组原则…

基于S32K144实现TPS929120的基本控制功能

文章目录前言1.TPS92910简介2.硬件调试平台2.1 灯板原理图2.2 参考电流2.3 器件地址3.TPS929120通信协议3.1 物理层3.2 数据链路层3.3 传输层2.3.1 读写时序2.3.2 帧格式说明2.3.3 寄存器lock与unlock2.3.4 输出通道控制4.使用S32K144驱动TPS929104.1 实现命令帧格式4.1.1 写寄…

【云原生】玩转Kubernetes实战(一):Pod、ConfigMap的使用

本文主要是利用Kubernetes 集群搭建出一个 WordPress 网站,用了三个镜像:WordPress、MariaDB、Nginx。 下面是其简单的架构图,用于直观的展示这个系统的内部逻辑关系: 简单来说,就是要通过本地地址http://127.0.0.1…

Spring AOP[详解]

一.需求引入 在开发过程中,总会有一些功能与业务逻辑代码耦合度不强(例如保存日志,提交事务,权限验证,异常处理),我们可以将这些代码提取到一个工具类中,需要使用时在调用工具类来实现. ​ 但是这样也会有弊端,那就是我们的代码已经开发完毕,后期如果需要增加公共功能就需要更…

Pinpoint--基础--03--安装部署

Pinpoint–基础–03–安装部署 前提 使用hd用户登陆 完成基础环境搭建https://blog.csdn.net/zhou920786312/article/details/118212302代码位置 https://gitee.com/DanShenGuiZu/learnDemo/tree/master/pinpoint-learn/demo11、安装环境准备 1.1、jdk1.8 基础环境搭建 包含…

一文搞懂MySQL表字段类型长度的含义

不知道大家第一眼看标题的时候有没有理解,什么是“字段类型长度”,这里我来解释下,就比如我们在MySQL建表的时候,比如下面这个建表语句: CREATE TABLE user (id int(10) DEFAULT NULL,name varchar(50) DEFAULT NULL,…

linux系统离线安装docker(分步法一键法)

1 前言 在有的项目场景中,服务器是不允许连接外网的。此时若想在服务器上安装部署docker容器,就不能采用在线方式了,不过可以采取离线方式进行安装。下面我们就一起看看离线安装的两种办法。 一种是分步安装法,一种是一键安装法…

Python冷知识:如何找出新版本增加或删除了哪些标准库?

“内置电池”是 Python 最为显著的特性之一,它提供了 200 多个开箱即用的标准库。但是,历经了 30 多年的发展,很多标准库已经成为了不得不舍弃的历史包袱,因为它们正在“漏电”! 好消息是,Python 正在进行…

Pinpoint--基础--02--架构设计

Pinpoint–基础–02–架构设计 1、整体架构 1.1、Pinpoint Collector 数据收集模块,接收Agent发送过来的监控数据,并存储到HBase部署在 Web 容器上 1.2、Pinpoint Web 监控展示模块,展示系统调用关系、调用详情、应用状态等,并…

CleanMyMac磁盘空间内存瘦身清理软件使用教程

许多用着Mac系统电脑的朋友们总是卸载不干净电脑垃圾软件,想要把垃圾软件卸载干净,可以尝试使用苹果电脑清理软件CleanMyMac。 经典的电脑深度清理软件——CleanMyMac。由于苹果电脑硬盘售价高昂,且不可以自行安装内存,很多苹果用…

代码随想录day60|结束亦是开始|84.柱状图中最大的矩形|总结

代码随想录day60 来了老弟 84.柱状图中最大的矩形 思路 本题和42. 接雨水是遥相呼应的两道题目,建议都要仔细做一做,原理上有很多相同的地方,但细节上又有差异,更可以加深对单调栈的理解!42. 接雨水 其实这两道题目先…

java 分布式游戏服务器框架,集群游戏服务器框架,游戏服务器网关框架 ioGame 网络游戏服务器框架

网络游戏框架简介 ioGame 是一个由 java 语言编写的网络游戏服务器框架。支持 websocket、tcp ,适用于全球同服、回合制游戏、策略游戏、即时战斗等游戏服务器的开发。具有高性能、稳定、易用易扩展、超好编程体验等特点。可做为 H5、手游、端游的 java 游戏服务器…

Intel关NUMA的内存编址

最近在做某国产化平台相关的适配, 不管NUMA的性能和实现方式都和Intel有较大不同, 作为比较对象, 理解Intel的NUMA实现是很有必要的. 虽然从软件角度, 打开NUMA会带来额外的复杂度, 但是从硬件角度, 关闭NUMA其实更复杂, 本文尝试分析关闭NUMA时Intel平台的内存编址. Memory I…

java+springboot基于性别网上学习特征问卷调查及可视化系统

基于JSP技术、SSM框架、B/S机构、Mysql数据库设计并实现了性别网上学习特征及可视化。系统主要包括个人中心、用户管理、调查问卷管理、用户答卷管理、专家建议管理、学习攻略管理、我的收藏管理、爬虫管理、系统管理等功能模块。 (1)绪论 网站的开发背景,意义和系…

栈和队列(带图,有手就废)

文章目录1.栈1.1栈的概念与结构1.2栈的声明1.3动态栈的实现1.3.1初始化栈1.3.2入栈1.3.3出栈1.3.4获取栈顶元素1.3.5获取栈中元素个数1.3.6判断栈是否为空1.3.7销毁栈1.4栈的总结2.队列2.1队列的概念与结构2.2队列的声明2.3队列的实现2.3.1初始化队列2.3.2入队2.3.3出队2.3.4获…

BUUCTF web之WarmUp 源代码详解

目录 前言 PHP代码分析 关于../ 前言 访问除了一张滑稽图,就没其他的了 查看源码,有一个注释了的 source.php,可以尝试直接访问一下。同时进行目录扫描 访问source.php,里面包含php代码,题目说了是php代码审计&…