首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >教你在十分钟内编译一个Linux内核,并在虚拟机里运行

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

作者头像
灯珑LoGin
发布2022-11-20 15:42:24
发布2022-11-20 15:42:24
9.5K0
举报
文章被收录于专栏:龙进的专栏龙进的专栏

前言

这篇文章将会简单的介绍如何在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的文件夹,然后把代码解压进去。

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

安装所需的软件包

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

代码语言:javascript
复制
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的默认编译配置,在控制台输入:

代码语言:javascript
复制
make defconfig

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

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

开始编译Linux

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

代码语言:javascript
复制
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的代码,并解压它。

代码语言:javascript
复制
wget https://busybox.net/downloads/busybox-1.35.0.tar.bz2
tar xvf busybox-1.35.0.tar.bz2

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

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

代码语言:javascript
复制
make menuconfig

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

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

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

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

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

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

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

创建磁盘镜像

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

代码语言:javascript
复制
dd if=/dev/zero of=rootfs.img bs=1M count=20
mkfs.ext4 rootfs.img

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

代码语言:javascript
复制
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”文件夹下的控制台输入命令:

代码语言:javascript
复制
qemu-system-x86_64 -kernel ./linux-5.19.10/arch/x86_64/boot/bzImage  -hda rootfs.img  -append "root=/dev/sda"

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

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

转载请注明来源:https://longjin666.cn/?p=1599

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年11月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 下载Linux内核源码
  • 安装所需的软件包
  • 配置Linux的编译选项
  • 开始编译Linux
  • 怎么运行?工作还没有完成!
  • 配置BusyBox
  • 创建磁盘镜像
  • 启动Linux内核
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档