linux内核编译学习笔记
内核编译
共同的步骤
1. 下载源码:
https://github.com/torvalds/linux.git
**2. 安装工具包: ** 在编译过程中按照具体报错再具体安装对应的工具包
# CentOS
yum -y groupinstall "development tools"
# ubuntu
sudo apt-get update
sudo apt-get install gcc g++
sudo apt-get install -y libncurses5-dev build-essential libssl-dev libc6-dev bin86 flex bison qttools5-dev libelf-dev
3. 清除残留信息:
make mrproper
make distclean
4. 生成配置文件:
make memuconfig #提供一个基于curses的命令行界面(需要curses库的支持)
make nconfig #提供一个基于ncurses(下一代curses)的命令行界面(需要ncurses库的支持)
make xconfig #基于QT的X Window图形化界面
make gconfig #基于GTK+的X Window图形化界面
make oldconfig #新配置的.config文件基于已经存在的.config,已经存在的.config中的值在新的.config文件中都成为默认值。
make silentoldconfig #同“make oldconfig”,但是该命令会避免被已经回答的问题弄乱屏幕,另外还会更新依赖。
make allyesconfig #在创建.config配置文件时,会尽可能选择“y”。(内核会非常大)
make allmodconfig #在创建.config配置文件时,会尽可能选择“m”。
make allnoconfig #在创建.config配置文件时,会尽可能选择“n”。
make randconfig #在创建.config配置文件时,会对各个选项进行随机设置(随机选择“y”、“m”、“n”)。
make defconfig #使用各架构下默认的.config文件(位于arch/<arch>/configs/*_defconfig)。
# 也可以用自己的内核配置,cp过去
cp /boot/config=$(uname -r) .config
5. 自动处理.config文件,不用手动去处理:
./scripts/config -e CONFIG_LOCALVERSION_AUTO -d MODULE_SIG
- -e:表示启用,这里CONFIG_LOCALVERSION_AUTO的意思是内核版本字符串会自动追加一个后缀(基于git仓库信息或本地修改)
- -d:表示禁用,MODULE_SIG是内核模块签名验证相关的配置,禁用后,内核允许加载未签名的模块
直接编译安装
1. 编译linux内核源码:
make -j64
# 使用clang编译
make LLVM=1 -j64
2. 安装linux内核:
make modules_install # 安装模块
make headers_install # 安装linux内核头文件
make install # 安装内核镜像
生成rpm包安装
1. 构建rpm包:
make rpm-pkg -j64
- rpm-pkg相对于rpm,会先执行make clean再进行构建
2. 安装kernel:
rpm -ivh --force kernel-4-5.4.*.rpm
更换kernel
查看已安装的kernel:
grubby --info=ALL | grep ^kernel
选定需要默认启动的kernel并将其设置为默认启动:
grubby --set-default=<kernel-path>
重启切换:
reboot
验证:
uname -r
删除某个内核启动项:
sudo grubby --remove-kernel=<kernel-path>
安装工具(tools)
bpftool
编译:
make -C tools/bpf/bpftool
安装:
make install -C tools/bpf/bpftool
内核配置学习
启用BTF配置
如果想要开启BTF配置,前提是要启动调试,即打开下面配置
CONFIG_DEBUG_INFO_BTF=y
使用上面提到的脚本:
./scripts/config -e CONFIG_DEBUG_INFO_BTF