linux内核编译比我想象的要简单很多。之所以要编译内核,是因为BPF开发过程需要打开内核的一些功能。但是基础镜像的内核版本默认是不打开这些功能的。所以只能尝试自己编译内核。
整个编译过程如下:
- 安装编译所依赖的包
- 下载Kernel源码
- 自定义配置项
- 编译
- 重启
安装依赖包
apt-get install build-essential kernel-package libncurses-dev dwarves
apt-get install flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf
下载Kernel源码
参考Linux内核源代码获取方法。一般将源码copy到/usr/src目录下,执行命令tar -xf linux-XXX.tar.xz
自定义配置项
首先执行命令make mrproper
清理之前的设定的配置项。
配置项修改的方式很简单,将对应的配置由n改为y就可以了。但困难的是如何找到这一项!因为一种系统特性通常不是一个配置项负责。不同的配置项之间也存在干涉。如果手动修改,除非经验丰富,极容易发生错误。
推荐使用make menuconfig
来修改配置项。使用方法写在了界面窗口中。简单来说,使用\
查询相关配置项。搜索结果会说明匹配的配置项的含义,已经需要修改编辑位置。根据编辑位置将对应位置修改就可以了。之后退出保存就可以了。
每个配置项的含义可以参考Make Menuconfig详解
编译
make -j $(nproc) bzImage
make -j $(nproc) modules
make modules_install
make install
重启
reboot
安装过程中可能遇到的问题:
1.执行命令make bzImage
之后出现错误
错误信息为:
BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
Failed to generate BTF for vmlinux
Try to disable CONFIG_DEBUG_INFO_BTF
make: *** [Makefile:1179: vmlinux] Error 1
根据stack overflow,安装sudo apt install dwarves
可以解决问题。
2.存储空间不足
内核编译大概需要50G的硬盘空间,如果存储空间不足需要扩充硬盘。购买硬盘之后,并不能直接使用,因为并没有安装文件系统。可以根据磁盘初始化指导书来完成配置。
配置完成之后,新盘与启动盘独立。可以将编译文件移动到新盘再安装。
3.执行命令make menuconfig
之后出现错误
在一个新的环境安装,执行命令make menuconfig遇到错误如下:
/bin/sh: 1: flex: not found
make[1]: *** [scripts/Makefile.host:9: scripts/kconfig/lexer.lex.c] Error 127
make: *** [Makefile:603: menuconfig] Error 2
在ask ubuntu,查到需要安装如下的包。
apt-get install libncurses-dev flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf
参考资料