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

2022-11-20 15:42:24 浏览数 (1)

前言

这篇文章将会简单的介绍如何在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

0 人点赞