Kernel初试-环境配置

从零到一成为内核大师(x

内核下载与编译

内核下载的官方网站是 https://www.kernel.org ,选择 stable 长期稳定版本。我们也可以就近(x 从清华源下载

Index of /kernel/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

看了看网上的教程都用的是 5.4 版本,为了初学出现问题方便解决,我也下载这个版本!

1
2
3
$ curl -O -L https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/linux-5.9.8.tar.xz
$ unxz linux-5.9.8.tar.xz
$ tar -xf linux-5.9.8.tar

解压之后进入文件夹编译

1
make menuconfig

成功的话会弹出一个图形化界面的配置窗口,我们直接按两下 esc 退出就可以了

(不成功的话请跳转 “踩坑” 部分)

有很多教程都说要勾选以下配置:

是两个调试方面的选项

Kernel hacking -> Compile-time checks and compiler options -> Compile the kernel with debug info

Kernel hacking -> Generic Kernel Debugging Instruments -> KGDB: kernel debugger

经本人实践证明,它现在已经是默认会勾选这两个了,所以直接退出就行

编译内核镜像

1
make -j3 bzImage

时间还蛮长的,我看了好几个小狗吃播都没弄好。

出现下面的显示就是成功了

成功之后

1
make all

这一步时间挺长的,但是如果你 make 了五六个小时都没 make 完就是电脑的问题,可能是内存不太够了

最后:

1
make modules

编译 busybox 构建文件系统

在启动内核前,先构建一个文件系统,否则内核会报错

可以新建一个文件夹装 busybox

在文件夹里执行以下命令下载安装

1
2
3
4
5
wget https://busybox.net/downloads/busybox-1.31.0.tar.bz2
tar -jxvf busybox-1.31.0.tar.bz2
cd busybox-1.31.0
make menuconfig
make install

在 make menuconfig 结束之后还会出现和上面一样的图形化界面,也要进行一些选择

Busybox Settings -> Build Options -> Build Busybox as a static binary 编译成静态文件

关闭下面两个选项:
Linux System Utilities -> [] Support mounting NFS file system 网络文件系统
Networking Utilities -> [] inetd (Internet超级服务器)

编译完 make install 后,在 busybox 源代码的根目录下会有一个 _install 目录:

接下来

1
2
3
4
cd _install
mkdir proc sys dev etc etc/init.d
vim etc/init.d/rcS
chmod +x etc/init.d/rcS

其中 etc/init.d/rcS 的内容如下,就是作为启动脚本了:

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
echo "INIT SCRIPT"
mkdir /tmp
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
mount -t debugfs none /sys/kernel/debug
mount -t tmpfs none /tmp
echo -e "Boot took $(cut -d' ' -f1 /proc/uptime) seconds"
setsid /bin/cttyhack setuidgid 1000 /bin/sh

最后利用命令创建文件系统:

1
find . | cpio -o --format=newc > ../rootfs.img

之后就可以使用 qemu 来运行内核了 : )

踩坑

编译内核时 make menuconfig 时报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
q@ubuntu:~/linux-5.9.8$ make menuconfig
HOSTCC scripts/basic/fixdep
*
* Unable to find the ncurses package.
* Install ncurses (ncurses-devel or libncurses-dev
* depending on your distribution).
*
* You may also need to install pkg-config to find the
* ncurses installed in a non-default location.
*
scripts/kconfig/Makefile:214: recipe for target 'scripts/kconfig/mconf-cfg' failed
make[1]: *** [scripts/kconfig/mconf-cfg] Error 1
Makefile:606: recipe for target 'menuconfig' failed
make: *** [menuconfig] Error 2

解决方案:

安装这个 ncurses-dev

1
sudo apt-get install ncurses-dev

另一个报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
q@ubuntu:~/linux-5.9.8$ make menuconfig
UPD scripts/kconfig/mconf-cfg
HOSTCC scripts/kconfig/mconf.o
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTCC scripts/kconfig/confdata.o
HOSTCC scripts/kconfig/expr.o
LEX scripts/kconfig/lexer.lex.c
/bin/sh: 1: flex: not found
scripts/Makefile.host:9: recipe for target 'scripts/kconfig/lexer.lex.c' failed
make[1]: *** [scripts/kconfig/lexer.lex.c] Error 127
Makefile:606: recipe for target 'menuconfig' failed
make: *** [menuconfig] Error 2

因为缺少库(这里出现的错误大部分都是因为缺少库,缺什么安装什么就行了

解决方案:

1
2
sudo apt-get install flex
sudo apt-get install bison

我当时是这个顺序的,但是它会提示让我先安装 bison,所以说其实 sudo apt-get install flex 我执行了两次。我也不确定是哪一次 起作用了就这么就这么写了。如果你们也碰到了报错不要怕,再 install 一次 flex 就好

make all

warning: Cannot use CONFIG_STACK_VALIDATION=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel

解决方案:

按照提示安装依赖包就好啦

1
sudo apt-get install libelf-dev

warning

1
2
arch/x86/hyperv/hv_apic.c: In function ‘hv_send_ipi_mask_allbutself’:
arch/x86/hyperv/hv_apic.c:236:1: warning: the frame size of 1032 bytes

其实不影响的,这只是一个提示而已。

Linux 的 config 中有 CONFIG_FRAME_WARN 配置,这个的配置默认是1024,当你编译内核的时候,如果有函数超过内核栈的栈帧大小1024时,就会产生警告。


Kernel初试-环境配置
https://shmodifier.github.io/2024/05/17/Kernel初试-环境配置/
作者
Modifier
发布于
2024年5月17日
许可协议