这篇文章将会简单的介绍如何在Linux系统上面,编译一个5.19的内核,然后在QEMU虚拟机中运行。
首先,我们需要下载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-5.19-build/linux-5.19.10″.
接着,我们创建Linux的默认编译配置,在控制台输入:
make defconfig
当显示”configuration written to .config”字样之后,说明配置创建成功。我们可以进入下一步。
注解:如果你想对linux内核进行裁减或者交叉编译,请使用”make menuconfig”选项,可以自定义你的编译配置。当然,对于新手来说,默认配置就可以了。
终于,我们可以开始编译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 是一个集成了三百多个最常用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
至此,我们的准备工作已经全部完成!我们可以在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内核,并在虚拟机里运行 | | 龙进的博客
欢迎关注我的公众号“灯珑”,让我们一起了解更多的事物~