./include/config/kernel.release
https://mirror.hostart.az/AltArch/7.8.2003/kernel/x86_64/Packages/
https://buildlogs.centos.org/c7-kernels.x86_64/kernel/20200916135108/5.4.65-200.el7.x86_64/
yum clean all
yum install make
yum install gcc
yum install flex
yum install bison
yum install lrzsz
yum install elfutils-libelf-devel
yum install openssl-devel
yum install bc
yum install rpm-build rpmdevtools
rpmdev-setuptree
# tree /root/rpmbuild/
/root/rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
/usr/local/src/linux-5.4.177
cp /boot/config-3.10.0-862.el7.x86_64 ./.config
make clean
make mrproper
make menuconfig
make -j 32
make modules_install
make install
make -j$(nproc) rpm-pkg
下面是包含你已有配置及所有建议补充项的**完整内核配置脚本**,用于构建支持 **bcc + eBPF + Cilium + BTF + 全调试功能** 的 Linux 内核配置环境:
---
### ✅ 完整脚本 `enable_kernel_features.sh`:
```bash
#!/bin/bash
set -e
# 确保在内核源码根目录执行
if [ ! -x scripts/config ]; then
echo "Error: scripts/config not found or not executable. 请在内核源码根目录运行该脚本"
exit 1
fi
config_exists() {
local cfg=$1
grep -qr "^config $cfg" . || return 1
}
try_enable() {
local cfg=$1
if config_exists "$cfg"; then
echo "启用配置: CONFIG_$cfg"
scripts/config --enable "CONFIG_$cfg"
else
echo "警告: CONFIG_$cfg 不存在,跳过"
fi
}
try_module() {
local cfg=$1
if config_exists "$cfg"; then
echo "设置模块化: CONFIG_$cfg"
scripts/config --module "CONFIG_$cfg"
else
echo "警告: CONFIG_$cfg 不存在,跳过"
fi
}
echo "====== 开始设置内核配置 ======"
#################################
# 基础调试和符号支持
#################################
try_enable DEBUG_INFO
try_enable DEBUG_INFO_DWARF4
try_enable DEBUG_INFO_BTF
try_enable PAHOLE_HAS_SPLIT_BTF
try_enable FRAME_POINTER
try_enable DEBUG_KERNEL
try_enable KALLSYMS
try_enable KALLSYMS_ALL
try_enable STACK_VALIDATION
try_enable IKHEADERS
# DWARF5(如支持)
try_enable DEBUG_INFO_DWARF5
#################################
# Crash/调试/转储支持
#################################
try_enable PROC_KCORE
try_enable CRASH_DUMP
try_enable KEXEC
try_enable KEXEC_FILE
try_enable KDUMP
try_enable VMCOREINFO
try_enable KDB
try_enable KGDB
try_enable KGDB_SERIAL_CONSOLE
#################################
# eBPF 支持
#################################
try_enable BPF
try_enable BPF_SYSCALL
try_enable BPF_JIT
try_enable BPF_JIT_ALWAYS_ON
try_enable BPF_EVENTS
try_enable BPF_LSM
try_enable BPF_PRELOAD
try_enable BPF_PRELOAD_UMD
try_enable BPF_STREAM_PARSER
try_enable BPF_KPROBE_OVERRIDE
try_enable BPF_KFUNC_TEST
try_enable BPF_LIRC_MODE2
try_enable BPF_PROG_TEST_RUN
# JIT 能力标识(版本适配)
try_enable HAVE_BPF_JIT
try_enable HAVE_EBPF_JIT
# 支持的 map 类型
for m in ARRAY HASH PERCPU_ARRAY PERCPU_HASH RINGBUF STACK_TRACE LPM_TRIE HASH_OF_MAPS ARRAY_OF_MAPS TASK_STORAGE SK_STORAGE SOCKHASH; do
try_enable BPF_MAP_TYPE_${m}
done
#################################
# Cilium / 网络子系统
#################################
try_enable NET
try_enable INET
try_enable IPV6
try_enable NETFILTER
try_enable NETFILTER_ADVANCED
try_enable NETFILTER_XTABLES
try_enable NF_CONNTRACK
try_enable NF_CONNTRACK_IPV4
try_enable NF_CONNTRACK_IPV6
try_enable NF_NAT
try_enable NF_NAT_IPV4
try_enable NF_NAT_IPV6
try_enable NET_SCH_INGRESS
try_enable NET_CLS_ACT
try_enable NET_SCH_TBF
try_enable XDP_SOCKETS
try_enable XDP_SOCKETS_DIAG
# 模块形式
for m in NET_CLS_BPF NET_ACT_BPF NET_ACT_GACT NET_ACT_POLICE NET_SCH_SFQ NET_SCH_HTB NET_SCH_FQ NET_SCH_CAKE DUMMY VXLAN NET_VETH; do
try_module $m
done
try_enable NET_IPGRE
try_enable NET_IP_TUNNEL
try_enable NET_FOU
try_enable NET_FOU_IP_TUNNELS
try_enable BRIDGE
try_enable BRIDGE_VLAN_FILTERING
try_enable LWTUNNEL_BPF
try_enable SOCK_CGROUP_DATA
#################################
# CGroup v2
#################################
try_enable CGROUPS
try_enable CGROUP2
try_enable CGROUP_SCHED
try_enable FAIR_GROUP_SCHED
try_enable CGROUP_CPUACCT
try_enable CGROUP_DEVICE
try_enable CGROUP_FREEZER
try_enable CGROUP_PIDS
try_enable CGROUP_HUGETLB
try_enable CGROUP_NET_CLASSID
try_enable CGROUP_NET_PRIO
try_enable CGROUP_DEBUG
try_enable CGROUP_WRITEBACK
try_enable CGROUP_PERF
try_enable CGROUP_IO
try_enable CGROUP_RDMA
try_enable MEMCG
try_enable BLK_CGROUP
#################################
# perf/ftrace/tracepoint/kprobe/uprobe
#################################
try_enable PERF_EVENTS
try_enable TRACEPOINTS
try_enable FTRACE_SYSCALLS
try_enable FUNCTION_TRACER
try_enable FUNCTION_GRAPH_TRACER
try_enable HAVE_FUNCTION_GRAPH_TRACER
try_enable DYNAMIC_FTRACE
try_enable STACK_TRACER
try_enable KPROBES
try_enable KPROBE_EVENTS
try_enable UPROBES
try_enable UPROBE_EVENTS
#################################
# KASAN / 内存调试 / kmemleak
#################################
try_enable KASAN
try_enable KASAN_INLINE
scripts/config --disable CONFIG_KASAN_STACK || true
try_enable KASAN_GENERIC
try_enable DEBUG_SLAB
try_enable SLUB_DEBUG
try_enable DEBUG_KMEMLEAK
scripts/config --disable CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF || true
try_enable DEBUG_STACKOVERFLOW
try_enable DEBUG_STACK_USAGE
#################################
# Lock 调试
#################################
try_enable DEBUG_SPINLOCK
try_enable PROVE_LOCKING
try_enable DEBUG_LOCKDEP
try_enable LOCK_STAT
try_enable DEBUG_ATOMIC_SLEEP
#################################
# 安全 / LSM
#################################
try_enable SECURITY
try_enable SECURITYFS
try_enable LSM
try_enable SECURITY_PATH
#################################
# KASLR / 可重定位
#################################
try_enable RELOCATABLE
try_enable RANDOMIZE_BASE
#################################
# 安全调试推荐项
#################################
try_enable DEBUG_LIST
try_enable DEBUG_NOTIFIERS
try_enable DEBUG_CREDENTIALS
#################################
# 基础文件系统
#################################
try_enable PROC_FS
try_enable TMPFS
try_enable SYSFS
try_enable DEBUG_FS
#################################
# 覆盖率 / 测试(可选)
#################################
try_enable KCOV
try_enable KUNIT
try_enable KSELFTEST
#################################
# BCC 示例常用依赖
#################################
try_enable UNIX_DIAG
try_enable INET_DIAG
try_enable PACKET_DIAG
try_enable SOCK_DIAG
echo "✅ 配置完成!请执行: make olddefconfig && make"
```
---
## ✅ 后续步骤
执行脚本后,运行以下命令生成 `.config`:
```bash
make olddefconfig
```
编译内核或模块:
```bash
make -j$(nproc)
make modules_install
make install
```
---
如需为特定内核版本适配(如 5.4、5.10、6.x),可以告诉我,我将根据版本帮你做兼容性调整。需要 `.config` 文件样本也可以提供。
你这次配置启用了非常全面且重要的内核调试和追踪功能,包括:
---
### 关键启用配置说明
* **调试信息**
* `CONFIG_DEBUG_INFO`:生成内核调试信息,支持GDB等调试器。
* `CONFIG_DEBUG_INFO_DWARF4`、`CONFIG_DEBUG_INFO_BTF`:增强调试信息格式,特别是BPF相关的BTF调试信息。
* `CONFIG_FRAME_POINTER`:保存函数调用栈信息,方便栈回溯。
* `CONFIG_DEBUG_KERNEL`:开启内核自带的调试支持。
* `CONFIG_KALLSYMS`及`CONFIG_KALLSYMS_ALL`:允许内核导出符号表,方便调试和内核分析。
* `CONFIG_PROC_KCORE`:支持/proc/kcore,核心转储信息读取。
* `CONFIG_CRASH_DUMP`和`CONFIG_KEXEC`系列:支持内核崩溃转储和重启机制。
* **调试辅助工具**
* `CONFIG_KDB`、`CONFIG_KGDB`:内核调试器和远程调试支持。
* `CONFIG_DEBUG_SLAB`、`CONFIG_SLUB_DEBUG`、`CONFIG_DEBUG_KMEMLEAK`:内存分配器及泄漏检测。
* `CONFIG_DEBUG_STACKOVERFLOW`、`CONFIG_DEBUG_STACK_USAGE`:栈溢出和栈使用调试。
* `CONFIG_DEBUG_SPINLOCK`、`CONFIG_PROVE_LOCKING`、`CONFIG_DEBUG_LOCKDEP`、`CONFIG_LOCK_STAT`:锁机制及死锁检测。
* `CONFIG_DEBUG_ATOMIC_SLEEP`:检测原子上下文内的睡眠操作。
* **BPF/eBPF支持**
* `CONFIG_BPF`及相关JIT和安全模块。
* `CONFIG_BPF_LSM`:将BPF用作Linux安全模块。
* 你启用了XDP、netfilter的BPF相关模块,对网络性能追踪和过滤很有帮助。
* **网络子系统**
* `CONFIG_NET`,支持IPv4/IPv6,Netfilter防火墙框架。
* 支持多种网络队列调度(TBF、SFQ、HTB、CAKE等)。
* 支持VXLAN、GRE、IP隧道、FOU、桥接等多种隧道和虚拟网络设备。
* 支持网络的BPF分类和动作(net\_cls\_bpf, net\_act\_bpf等)。
* **cgroup相关**
* 你启用了内存、CPU、设备、冻结、PIDs、hugetlb、网络类别和优先级等多个cgroup子系统。
* 但有一些警告显示 `CONFIG_CGROUPS` 和 `CONFIG_CGROUP2` 不存在,可能你的内核版本或配置环境缺少这部分支持,建议确认内核版本,cgroup通常非常重要,尤其是容器化场景。
* **性能分析和追踪**
* `CONFIG_PERF_EVENTS`、`CONFIG_TRACEPOINTS`、`CONFIG_FTRACE_SYSCALLS`、`CONFIG_FUNCTION_TRACER`、`CONFIG_DYNAMIC_FTRACE` 等,全面支持perf和ftrace。
* `CONFIG_STACK_TRACER`,用于栈追踪。
* **安全模块**
* 启用了 `CONFIG_SECURITY`、`CONFIG_LSM`、`CONFIG_SECURITYFS` 等,方便安全模块开发与加载。
* **文件系统**
* 基本文件系统支持:`CONFIG_PROC_FS`、`CONFIG_TMPFS`、`CONFIG_SYSFS`。
* 调试文件系统 `CONFIG_DEBUG_FS` 用于内核调试信息暴露。
* **其他**
* `CONFIG_KUNIT`:内核单元测试支持,方便持续集成和自动化测试。
* `CONFIG_KCOV`:代码覆盖率工具,用于测试。
* 启用了大量调试辅助功能,如 `CONFIG_DEBUG_LIST`、`CONFIG_DEBUG_NOTIFIERS`、`CONFIG_DEBUG_CREDENTIALS`。
---
### 警告和跳过项
* 你配置中有若干警告,例如:
* `CONFIG_PAHOLE_HAS_SPLIT_BTF`、`CONFIG_DEBUG_INFO_DWARF5`、`CONFIG_KDUMP`、`CONFIG_VMCOREINFO`等不存在。
* BPF MAP类型相关的配置不存在。
* cgroup相关(`CONFIG_CGROUPS`、`CONFIG_CGROUP2`)不存在。
* 某些网络设备(如 `CONFIG_NET_VETH`)不存在。
* 这些多数是因为你的内核版本或者当前内核源码配置限制,没有对应配置项。建议确认内核版本(最好是5.10及以上,部分功能在较新内核中支持更完善)。
---
### 建议执行步骤
1. **确认内核版本和源码树完整性**
建议使用5.10以上内核源码,如果你对BPF、cgroup等现代特性有需求,最好用5.15或更高版本。
2. **执行 `make olddefconfig`**
这一步会根据你当前配置,自动填充缺失的默认选项,减少配置不完整导致的编译失败。
3. **执行 `make`** 编译内核及模块。
4. **安装并测试新内核**
* 安装编译好的内核(`make modules_install install`)。
* 更新bootloader配置,重启。
* 启动后检查 `dmesg` 是否正常,有无调试功能加载提示。
---
### 需要帮助我帮你做什么?
* 你需要我帮你检查并补充完整某些特定的配置吗?
* 你希望我帮你写一个自动化的内核配置脚本吗?
* 你想知道怎么验证你启用的调试功能是否生效吗?
* 或者你需要我帮你解决某些警告或缺失配置的具体问题?
告诉我,我随时帮你!
# 1. 从一个已有的配置开始(比如 defconfig 或旧 .config)
make defconfig
# 2. 修改配置(用 menuconfig 等交互界面)
make menuconfig
# 这里修改后,确保选择保存并退出
# 3. 如果用 scripts/config 方式修改
scripts/config --enable CONFIG_DEBUG_INFO
# 4. 运行旧配置更新(同步依赖)
make olddefconfig
# 5. 准备环境
make prepare
make scripts
# 6. 编译内核
make -j$(nproc)
#!/bin/bash
set -e
# 确认在内核源码根目录执行该脚本,确保 scripts/config 存在
if [ ! -x scripts/config ]; then
echo "Error: scripts/config not found or not executable. 请在内核源码根目录运行该脚本"
exit 1
fi
# 基础调试和符号支持
scripts/config --enable CONFIG_DEBUG_INFO
scripts/config --enable CONFIG_DEBUG_INFO_DWARF4
scripts/config --enable CONFIG_DEBUG_INFO_BTF
scripts/config --enable CONFIG_FRAME_POINTER
scripts/config --enable CONFIG_DEBUG_KERNEL
scripts/config --enable CONFIG_KALLSYMS
scripts/config --enable CONFIG_KALLSYMS_ALL
scripts/config --enable CONFIG_PAHOLE_HAS_SPLIT_BTF
scripts/config --enable CONFIG_STACK_VALIDATION
# KGDB / Crash 支持
scripts/config --enable CONFIG_KGDB
scripts/config --enable CONFIG_KGDB_SERIAL_CONSOLE
scripts/config --enable CONFIG_PROC_KCORE
scripts/config --enable CONFIG_CRASH_DUMP
scripts/config --enable CONFIG_KEXEC
# eBPF 支持(JIT / LSM / Preload / map)
scripts/config --enable CONFIG_BPF
scripts/config --enable CONFIG_BPF_SYSCALL
scripts/config --enable CONFIG_BPF_JIT
scripts/config --enable CONFIG_BPF_JIT_ALWAYS_ON
scripts/config --enable CONFIG_HAVE_EBPF_JIT
scripts/config --enable CONFIG_HAVE_BPF_JIT
scripts/config --enable CONFIG_BPF_EVENTS
scripts/config --enable CONFIG_BPF_LSM
scripts/config --enable CONFIG_BPF_PRELOAD
scripts/config --enable CONFIG_BPF_PRELOAD_UMD
scripts/config --enable CONFIG_BPF_STREAM_PARSER
scripts/config --enable CONFIG_BPF_KPROBE_OVERRIDE
scripts/config --enable CONFIG_BPF_LPM_TRIE
scripts/config --enable CONFIG_BPF_MAP_TYPE_ARRAY
scripts/config --enable CONFIG_BPF_MAP_TYPE_HASH
scripts/config --enable CONFIG_BPF_MAP_TYPE_PERCPU_HASH
scripts/config --enable CONFIG_BPF_MAP_TYPE_PERCPU_ARRAY
scripts/config --enable CONFIG_BPF_MAP_TYPE_RINGBUF
scripts/config --enable CONFIG_BPF_MAP_TYPE_STACK_TRACE
# Cilium 所需网络子系统与设备
scripts/config --enable CONFIG_NET
scripts/config --enable CONFIG_INET
scripts/config --enable CONFIG_IPV6
scripts/config --enable CONFIG_NETFILTER
scripts/config --enable CONFIG_NETFILTER_ADVANCED
scripts/config --enable CONFIG_NF_CONNTRACK
scripts/config --enable CONFIG_NF_CONNTRACK_IPV4
scripts/config --enable CONFIG_NF_CONNTRACK_IPV6
scripts/config --enable CONFIG_NF_NAT
scripts/config --enable CONFIG_NF_NAT_IPV4
scripts/config --enable CONFIG_NF_NAT_IPV6
scripts/config --enable CONFIG_NET_SCH_INGRESS
scripts/config --enable CONFIG_NET_CLS_ACT
scripts/config --module CONFIG_NET_CLS_BPF
scripts/config --module CONFIG_NET_ACT_BPF
scripts/config --module CONFIG_NET_ACT_POLICE
scripts/config --module CONFIG_NET_ACT_GACT
scripts/config --module CONFIG_NET_SCH_SFQ
scripts/config --enable CONFIG_XDP_SOCKETS
scripts/config --module CONFIG_DUMMY
scripts/config --module CONFIG_VXLAN
scripts/config --module CONFIG_NET_VETH
scripts/config --enable CONFIG_NET_IPGRE
scripts/config --enable CONFIG_BRIDGE
scripts/config --enable CONFIG_BRIDGE_VLAN_FILTERING
scripts/config --enable CONFIG_LWTUNNEL_BPF
scripts/config --enable CONFIG_SOCK_CGROUP_DATA
# CGroup v2 和子系统
scripts/config --enable CONFIG_CGROUPS
scripts/config --enable CONFIG_CGROUP2
scripts/config --enable CONFIG_FAIR_GROUP_SCHED
scripts/config --enable CONFIG_CGROUP_SCHED
scripts/config --enable CONFIG_CGROUP_CPUACCT
scripts/config --enable CONFIG_CGROUP_DEVICE
scripts/config --enable CONFIG_CGROUP_FREEZER
scripts/config --enable CONFIG_CGROUP_PIDS
scripts/config --enable CONFIG_CGROUP_HUGETLB
scripts/config --enable CONFIG_CGROUP_NET_CLASSID
scripts/config --enable CONFIG_CGROUP_NET_PRIO
scripts/config --enable CONFIG_CGROUP_DEBUG
scripts/config --enable CONFIG_CGROUP_WRITEBACK
scripts/config --enable CONFIG_CGROUP_BLK
scripts/config --enable CONFIG_CGROUP_PERF
scripts/config --enable CONFIG_CGROUP_IO
scripts/config --enable CONFIG_CGROUP_RDMA
scripts/config --enable CONFIG_BLK_CGROUP
scripts/config --enable CONFIG_MEMCG
# perf / trace / ftrace / syscall trace
scripts/config --enable CONFIG_PERF_EVENTS
scripts/config --enable CONFIG_TRACEPOINTS
scripts/config --enable CONFIG_FTRACE_SYSCALLS
scripts/config --enable CONFIG_FUNCTION_TRACER
scripts/config --enable CONFIG_FUNCTION_GRAPH_TRACER
scripts/config --enable CONFIG_HAVE_FUNCTION_GRAPH_TRACER
scripts/config --enable CONFIG_DYNAMIC_FTRACE
scripts/config --enable CONFIG_STACK_TRACER
scripts/config --enable CONFIG_KPROBES
scripts/config --enable CONFIG_KPROBE_EVENTS
scripts/config --enable CONFIG_UPROBES
scripts/config --enable CONFIG_UPROBE_EVENTS
# 内存调试 / kasan / kmemleak
scripts/config --enable CONFIG_KASAN
scripts/config --enable CONFIG_KASAN_INLINE
scripts/config --enable CONFIG_KASAN_STACK # 解决 warning 的关键
scripts/config --enable CONFIG_KASAN_GENERIC
scripts/config --enable CONFIG_DEBUG_SLAB
scripts/config --enable CONFIG_SLUB_DEBUG
scripts/config --enable CONFIG_DEBUG_KMEMLEAK
scripts/config --disable CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF
scripts/config --enable CONFIG_DEBUG_STACKOVERFLOW
scripts/config --enable CONFIG_DEBUG_STACK_USAGE
# 锁调试 / Lockdep
scripts/config --enable CONFIG_DEBUG_SPINLOCK
scripts/config --enable CONFIG_PROVE_LOCKING
scripts/config --enable CONFIG_DEBUG_LOCKDEP
scripts/config --enable CONFIG_LOCK_STAT
scripts/config --enable CONFIG_DEBUG_ATOMIC_SLEEP
# 安全模块 / LSM
scripts/config --enable CONFIG_SECURITY
scripts/config --enable CONFIG_SECURITYFS
scripts/config --enable CONFIG_LSM
# KASLR / relocatable
scripts/config --enable CONFIG_RANDOMIZE_BASE
scripts/config --enable CONFIG_RELOCATABLE
# 运行时 headers(bcc 使用)
scripts/config --enable CONFIG_IKHEADERS
# 推荐开启的安全调试
scripts/config --enable CONFIG_DEBUG_LIST
scripts/config --enable CONFIG_DEBUG_NOTIFIERS
scripts/config --enable CONFIG_DEBUG_CREDENTIALS
# 文件系统支持
scripts/config --enable CONFIG_PROC_FS
scripts/config --enable CONFIG_TMPFS
scripts/config --enable CONFIG_SYSFS
scripts/config --enable CONFIG_DEBUG_FS
# 覆盖率和测试(可选)
scripts/config --enable CONFIG_KCOV
echo "配置修改完成!请运行 'make olddefconfig' 和 'make' 重新编译内核。"
你已经正确编译并安装了新版 `pahole`,但依然出现:
```
symbol lookup error: /usr/local/bin/pahole: undefined symbol: tabs
```
说明:**`pahole` 仍然链接到了不兼容版本的 `libdwarves.so.1`**,或者你编译出的 `libdwarves.so.1` 不包含或导出了错误的符号。
---
## ✅ 彻底修复:完全静态链接 `pahole`(推荐)
我们使用 `cmake` 编译时,让 `pahole` **静态链接它自己的 `libdwarves`**,避免系统库干扰。
### 🔄 步骤:
1. 清除旧编译文件:
```bash
cd /usr/src/pahole
rm -rf build
mkdir build && cd build
```
2. 重新配置构建为**静态链接**:
```bash
cmake -D__LIB=lib -DBUILD_SHARED_LIBS=OFF ..
make clean
make -j$(nproc)
sudo make install
```
这将确保:
* `pahole` 静态链接内置 `libdwarves`
* 不依赖系统 `/lib64/libdwarves.so.1`
3. 验证链接和版本:
```bash
ldd /usr/local/bin/pahole
# 应该 **不再**显示 libdwarves.so.1
/usr/local/bin/pahole --version
# 应该成功输出版本信息
```
---
## 🔍 如果仍失败,请排查以下几点:
### ✅ 检查 pahole 是否正确链接:
```bash
nm -D /usr/local/bin/pahole | grep tabs
```
如果没有 `U tabs`,说明已经不是外部未解析符号。
---
## 🧼 彻底卸载并重新安装(可选)
如果你仍然遇到问题,可执行以下命令 **彻底卸载**旧的:
```bash
sudo rm -f /usr/local/bin/pahole
sudo rm -f /usr/local/lib/libdwarves*
sudo ldconfig
```
然后重新走一遍上面的静态链接流程。
---
如果你希望我生成一键修复脚本,包含:
* 删除旧文件
* 静态重新编译 `pahole`
* 检查安装和链接
我可以立即为你生成,是否需要?
在 Linux 内核构建过程中,`make prepare` 和 `make scripts` 是两个用于准备内核源码和构建工具的关键步骤。以下是它们的详细作用和执行流程:
---
### **1. `make prepare`**
#### **作用**
`make prepare` 主要用于准备内核源码树,确保其处于可编译状态。它会完成以下任务:
1. **生成头文件和符号链接**
- 创建必要的内核头文件(如 `include/generated/` 下的文件)。
- 建立内核版本相关的符号链接(如 `source` 和 `build` 目录的链接)。
2. **检查编译环境**
- 验证编译器(如 `gcc` 或 `clang`)和工具链的兼容性。
- 生成编译所需的配置文件(如 `auto.conf` 和 `autoconf.h`)。
3. **处理 Kconfig 配置**
- 根据 `.config` 文件生成依赖关系(`include/config/` 目录)。
- 为模块编译生成 `modules.order` 和 `modules.builtin` 文件。
4. **架构相关准备**
- 如果是交叉编译,会初始化架构特定的代码(如 `arch/x86/` 或 `arch/arm/` 下的准备工作)。
#### **典型输出**
执行时可能会看到如下日志:
```bash
SYNC include/config/auto.conf
CALL scripts/checksyscalls.sh
DESCEND objtool
```
#### **何时需要运行**
- 首次下载内核源码后。
- 修改了 `.config` 文件或切换了架构(如从 `x86` 改为 `arm64`)。
- 更新了内核版本或关键头文件。
---
### **2. `make scripts`**
#### **作用**
`make scripts` 专门用于构建内核编译过程中依赖的**脚本和工具**,主要包括:
1. **构建 `fixdep` 工具**
- `fixdep` 是一个依赖关系修复工具,用于解析 `Makefile` 中的依赖关系,确保文件变更后能正确触发重新编译。
2. **构建 `bin2c` 工具**
- 将二进制文件转换为 C 语言数组(某些内核功能需要嵌入二进制数据)。
3. **构建其他辅助工具**
- 如 `kconfig` 相关的解析工具(`conf`、`mconf` 等),用于菜单配置界面。
- 部分架构可能需要额外的工具(如 DT——设备树编译器)。
#### **典型输出**
```bash
HOSTCC scripts/fixdep
HOSTCC scripts/bin2c
HOSTCC scripts/kconfig/conf.o
```
#### **何时需要运行**
- 首次编译内核前(通常 `make prepare` 会间接调用它)。
- 修改了内核构建脚本(如 `scripts/` 目录下的代码)。
- 切换编译器或工具链后。
---
### **完整编译流程中的顺序**
这两个命令通常由顶层 `make` 自动调用,但手动执行场景如下:
```bash
# 1. 生成默认配置(可选)
make defconfig
# 2. 准备源码树(包含头文件、环境检查)
make prepare
# 3. 构建编译工具(如 fixdep)
make scripts
# 4. 正式编译内核
make -j$(nproc)
```
---
### **常见问题**
1. **为什么需要手动执行?**
- 如果自动构建失败(如工具链更新后),可能需要手动执行这些步骤修复。
- 开发者修改了 `Kconfig` 或构建脚本时,需显式重新生成工具。
2. **错误处理**
- 若 `make prepare` 失败,检查编译器版本或 `.config` 文件是否损坏。
- 若 `make scripts` 失败,确认主机工具(如 `gcc`、`flex`、`bison`)是否安装。
3. **跳过这些步骤**
- 直接运行 `make` 会按需自动调用它们,但手动执行可以更早发现问题。
---
### **总结**
| 命令 | 主要功能 | 关键输出/工具 |
|-----------------|-------------------------------------|-------------------------------|
| `make prepare` | 准备头文件、符号链接、环境检查 | `include/generated/`, `auto.conf` |
| `make scripts` | 构建内核编译依赖的工具(如 `fixdep`) | `scripts/fixdep`, `bin2c` |
这两个步骤确保了内核源码和工具链处于一致状态,是成功编译的前提条件。
#!/bin/bash
set -e
# 确保在内核源码根目录执行
if [ ! -x scripts/config ]; then
echo "Error: scripts/config not found or not executable. 请在内核源码根目录运行该脚本"
exit 1
fi
config_exists() {
local cfg=$1
grep -qr "^config $cfg" . || return 1
}
try_enable() {
local cfg=$1
if config_exists "$cfg"; then
echo "启用配置: CONFIG_$cfg"
scripts/config --enable "CONFIG_$cfg"
else
echo "警告: CONFIG_$cfg 不存在,跳过"
fi
}
try_module() {
local cfg=$1
if config_exists "$cfg"; then
echo "设置模块化: CONFIG_$cfg"
scripts/config --module "CONFIG_$cfg"
else
echo "警告: CONFIG_$cfg 不存在,跳过"
fi
}
echo "====== 开始设置内核配置 ======"
#################################
# 基础调试和符号支持
#################################
try_enable DEBUG_INFO
try_enable DEBUG_INFO_DWARF4
try_enable DEBUG_INFO_BTF
try_enable PAHOLE_HAS_SPLIT_BTF
try_enable FRAME_POINTER
try_enable DEBUG_KERNEL
try_enable KALLSYMS
try_enable KALLSYMS_ALL
try_enable STACK_VALIDATION
try_enable IKHEADERS
# DWARF5(如支持)
try_enable DEBUG_INFO_DWARF5
#################################
# Crash/调试/转储支持
#################################
try_enable PROC_KCORE
try_enable CRASH_DUMP
try_enable KEXEC
try_enable KEXEC_FILE
try_enable KDUMP
try_enable VMCOREINFO
try_enable KDB
try_enable KGDB
try_enable KGDB_SERIAL_CONSOLE
#################################
# eBPF 支持
#################################
try_enable BPF
try_enable BPF_SYSCALL
try_enable BPF_JIT
try_enable BPF_JIT_ALWAYS_ON
try_enable BPF_EVENTS
try_enable BPF_LSM
try_enable BPF_PRELOAD
try_enable BPF_PRELOAD_UMD
try_enable BPF_STREAM_PARSER
try_enable BPF_KPROBE_OVERRIDE
try_enable BPF_KFUNC_TEST
try_enable BPF_LIRC_MODE2
try_enable BPF_PROG_TEST_RUN
# JIT 能力标识(版本适配)
try_enable HAVE_BPF_JIT
try_enable HAVE_EBPF_JIT
# 支持的 map 类型
for m in ARRAY HASH PERCPU_ARRAY PERCPU_HASH RINGBUF STACK_TRACE LPM_TRIE HASH_OF_MAPS ARRAY_OF_MAPS TASK_STORAGE SK_STORAGE SOCKHASH; do
try_enable BPF_MAP_TYPE_${m}
done
#################################
# Cilium / 网络子系统
#################################
try_enable NET
try_enable INET
try_enable IPV6
try_enable NETFILTER
try_enable NETFILTER_ADVANCED
try_enable NETFILTER_XTABLES
try_enable NF_CONNTRACK
try_enable NF_CONNTRACK_IPV4
try_enable NF_CONNTRACK_IPV6
try_enable NF_NAT
try_enable NF_NAT_IPV4
try_enable NF_NAT_IPV6
try_enable NET_SCH_INGRESS
try_enable NET_CLS_ACT
try_enable NET_SCH_TBF
try_enable XDP_SOCKETS
try_enable XDP_SOCKETS_DIAG
# 模块形式
for m in NET_CLS_BPF NET_ACT_BPF NET_ACT_GACT NET_ACT_POLICE NET_SCH_SFQ NET_SCH_HTB NET_SCH_FQ NET_SCH_CAKE DUMMY VXLAN NET_VETH; do
try_module $m
done
try_enable NET_IPGRE
try_enable NET_IP_TUNNEL
try_enable NET_FOU
try_enable NET_FOU_IP_TUNNELS
try_enable BRIDGE
try_enable BRIDGE_VLAN_FILTERING
try_enable LWTUNNEL_BPF
try_enable SOCK_CGROUP_DATA
#################################
# CGroup v2
#################################
try_enable CGROUPS
try_enable CGROUP2
try_enable CGROUP_SCHED
try_enable FAIR_GROUP_SCHED
try_enable CGROUP_CPUACCT
try_enable CGROUP_DEVICE
try_enable CGROUP_FREEZER
try_enable CGROUP_PIDS
try_enable CGROUP_HUGETLB
try_enable CGROUP_NET_CLASSID
try_enable CGROUP_NET_PRIO
try_enable CGROUP_DEBUG
try_enable CGROUP_WRITEBACK
try_enable CGROUP_PERF
try_enable CGROUP_IO
try_enable CGROUP_RDMA
try_enable MEMCG
try_enable BLK_CGROUP
#################################
# perf/ftrace/tracepoint/kprobe/uprobe
#################################
try_enable PERF_EVENTS
try_enable TRACEPOINTS
try_enable FTRACE_SYSCALLS
try_enable FUNCTION_TRACER
try_enable FUNCTION_GRAPH_TRACER
try_enable HAVE_FUNCTION_GRAPH_TRACER
try_enable DYNAMIC_FTRACE
try_enable STACK_TRACER
try_enable KPROBES
try_enable KPROBE_EVENTS
try_enable UPROBES
try_enable UPROBE_EVENTS
#################################
# KASAN / 内存调试 / kmemleak
#################################
try_enable KASAN
try_enable KASAN_INLINE
scripts/config --disable CONFIG_KASAN_STACK || true
try_enable KASAN_GENERIC
try_enable DEBUG_SLAB
try_enable SLUB_DEBUG
try_enable DEBUG_KMEMLEAK
scripts/config --disable CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF || true
try_enable DEBUG_STACKOVERFLOW
try_enable DEBUG_STACK_USAGE
#################################
# Lock 调试
#################################
try_enable DEBUG_SPINLOCK
try_enable PROVE_LOCKING
try_enable DEBUG_LOCKDEP
try_enable LOCK_STAT
try_enable DEBUG_ATOMIC_SLEEP
#################################
# 安全 / LSM
#################################
try_enable SECURITY
try_enable SECURITYFS
try_enable LSM
try_enable SECURITY_PATH
#################################
# KASLR / 可重定位
#################################
try_enable RELOCATABLE
try_enable RANDOMIZE_BASE
#################################
# 安全调试推荐项
#################################
try_enable DEBUG_LIST
try_enable DEBUG_NOTIFIERS
try_enable DEBUG_CREDENTIALS
#################################
# 基础文件系统
#################################
try_enable PROC_FS
try_enable TMPFS
try_enable SYSFS
try_enable DEBUG_FS
#################################
# 覆盖率 / 测试(可选)
#################################
try_enable KCOV
try_enable KUNIT
try_enable KSELFTEST
#################################
# BCC 示例常用依赖
#################################
try_enable UNIX_DIAG
try_enable INET_DIAG
try_enable PACKET_DIAG
try_enable SOCK_DIAG
echo "✅ 配置完成!请执行: make olddefconfig && make"
下面是你需要的**完整调试支持内核配置脚本**,在上一版基础上:
✅ **已集成**:
* `crash` / `kdump`
* `gdb` / `kgdb`
* `ftrace` / `dynamic_debug`
* `bpf` / `bcc`
* ✅ **Lock 相关调试功能**
---
## 🧩 `set_debug_full.sh`:完整调试配置脚本
```bash
#!/bin/bash
set -e
if [ ! -x scripts/config ]; then
echo "Error: scripts/config not found or not executable. 请在内核源码根目录运行该脚本"
exit 1
fi
config_exists() {
local cfg=$1
grep -qr "^config $cfg" . || return 1
}
try_enable() {
local cfg=$1
if config_exists "$cfg"; then
echo "启用配置: CONFIG_$cfg"
scripts/config --enable "CONFIG_$cfg"
else
echo "警告: CONFIG_$cfg 不存在,跳过"
fi
}
echo "====== 开始设置完整调试配置 ======"
#################################
# 基础调试符号支持(gdb/bcc/crash)
#################################
try_enable DEBUG_KERNEL
try_enable DEBUG_INFO
try_enable DEBUG_INFO_DWARF4
try_enable DEBUG_INFO_BTF
try_enable FRAME_POINTER
try_enable KALLSYMS
try_enable KALLSYMS_ALL
try_enable STACK_VALIDATION
#################################
# crash/kdump 支持
#################################
try_enable PROC_KCORE
try_enable CRASH_DUMP
try_enable KDUMP
try_enable KEXEC
try_enable KEXEC_FILE
try_enable VMCOREINFO
#################################
# gdb/kgdb 支持
#################################
try_enable KGDB
try_enable KGDB_SERIAL_CONSOLE
#################################
# dynamic debug
#################################
try_enable DYNAMIC_DEBUG
#################################
# ftrace 支持
#################################
try_enable TRACEPOINTS
try_enable FUNCTION_TRACER
try_enable FUNCTION_GRAPH_TRACER
try_enable DYNAMIC_FTRACE
try_enable STACK_TRACER
#################################
# lock 调试相关
#################################
try_enable DEBUG_SPINLOCK
try_enable DEBUG_MUTEXES
try_enable PROVE_LOCKING
try_enable DEBUG_LOCKDEP
try_enable LOCK_STAT
try_enable DEBUG_ATOMIC_SLEEP
try_enable DEBUG_WW_MUTEX_SLOWPATH
#################################
# bpf/ebpf 支持
#################################
try_enable BPF
try_enable BPF_SYSCALL
try_enable BPF_JIT
try_enable BPF_JIT_ALWAYS_ON
try_enable BPF_EVENTS
try_enable BPF_LSM
try_enable BPF_PRELOAD
try_enable BPF_PRELOAD_UMD
try_enable BPF_STREAM_PARSER
try_enable BPF_KPROBE_OVERRIDE
try_enable BPF_PROG_TEST_RUN
# JIT 能力标识
try_enable HAVE_BPF_JIT
try_enable HAVE_EBPF_JIT
# 支持 map 类型
for m in ARRAY HASH PERCPU_ARRAY RINGBUF STACK_TRACE LPM_TRIE TASK_STORAGE SOCKHASH; do
try_enable BPF_MAP_TYPE_${m}
done
#################################
# BCC 所需诊断接口
#################################
try_enable UNIX_DIAG
try_enable INET_DIAG
try_enable PACKET_DIAG
try_enable SOCK_DIAG
try_enable DEBUG_FS
echo "✅ 完整调试内核配置完成!请执行: make olddefconfig && make"
```
---
## 🛠 使用说明
```bash
cd /usr/src/linux-<version>
chmod +x set_debug_full.sh
./set_debug_full.sh
make olddefconfig
```
---
## 🔍 功能涵盖汇总
| 模块功能 | 覆盖配置项 |
| -------------- | --------------------------------------------------------------------------------------- |
| crash/kdump | `CRASH_DUMP`, `KDUMP`, `KEXEC`, `PROC_KCORE`, `VMCOREINFO` |
| gdb/kgdb | `KGDB`, `KGDB_SERIAL_CONSOLE` |
| ftrace | `FUNCTION_TRACER`, `FUNCTION_GRAPH_TRACER`, `DYNAMIC_FTRACE`, `STACK_TRACER` |
| dynamic\_debug | `DYNAMIC_DEBUG` |
| lockdep | `DEBUG_SPINLOCK`, `PROVE_LOCKING`, `LOCK_STAT`, `DEBUG_LOCKDEP`, `DEBUG_ATOMIC_SLEEP` 等 |
| bpf/ebpf | `BPF_*`, JIT、map、LSM 支持 |
| bcc支持模块 | `DEBUG_INFO*`, `SOCK_DIAG`, `DEBUG_FS`, `UNIX_DIAG` 等 |
---
如你还希望我生成对应的 `.config` 示例文件,或提供精简编译建议(比如只编译 bzImage、不编模块),我可以继续生成。是否需要我同时生成 `.config` 文件供参考?
明白!下面给你一套完整方案,包含:
* **内核配置脚本(确保启用模块、bcc、eBPF、Cilium、全调试等)**
* **编译并使用 `make rpm-pkg` 生成 RPM 包**
* **生成和验证 initramfs/initrd**
* **更新 grub 引导**
---
# 一、完整内核配置脚本 (`config_full.sh`)
```bash
#!/bin/bash
set -e
# 确保在内核源码根目录运行
if [ ! -x scripts/config ]; then
echo "Error: 请在内核源码根目录运行"
exit 1
fi
config_exists() {
grep -qr "^config $1" . || return 1
}
try_enable() {
if config_exists "$1"; then
echo "启用 CONFIG_$1"
scripts/config --enable "CONFIG_$1"
else
echo "跳过 CONFIG_$1(不存在)"
fi
}
try_module() {
if config_exists "$1"; then
echo "模块化 CONFIG_$1"
scripts/config --module "CONFIG_$1"
else
echo "跳过 CONFIG_$1(不存在)"
fi
}
echo "====== 启用模块机制 ======"
try_enable MODULES
echo "====== 启用调试、bcc、eBPF、Cilium、BTF等功能 ======"
# 基础调试与符号
try_enable DEBUG_INFO
try_enable DEBUG_INFO_DWARF4
try_enable DEBUG_INFO_DWARF5
try_enable DEBUG_INFO_BTF
try_enable PAHOLE_HAS_SPLIT_BTF
try_enable FRAME_POINTER
try_enable DEBUG_KERNEL
try_enable KALLSYMS
try_enable KALLSYMS_ALL
try_enable STACK_VALIDATION
try_enable IKHEADERS
# Crash和转储支持
try_enable PROC_KCORE
try_enable CRASH_DUMP
try_enable KEXEC
try_enable KEXEC_FILE
try_enable KDUMP
try_enable VMCOREINFO
try_enable KDB
try_enable KGDB
try_enable KGDB_SERIAL_CONSOLE
# eBPF/BCC相关
try_enable BPF
try_enable BPF_SYSCALL
try_enable BPF_JIT
try_enable BPF_JIT_ALWAYS_ON
try_enable BPF_EVENTS
try_enable BPF_LSM
try_enable BPF_PRELOAD
try_enable BPF_PRELOAD_UMD
try_enable BPF_STREAM_PARSER
try_enable BPF_KPROBE_OVERRIDE
try_enable BPF_KFUNC_TEST
try_enable BPF_LIRC_MODE2
try_enable BPF_PROG_TEST_RUN
try_enable HAVE_BPF_JIT
try_enable HAVE_EBPF_JIT
try_enable BPF_MAP_TYPE_ARRAY
try_enable BPF_MAP_TYPE_HASH
try_enable BPF_MAP_TYPE_PERCPU_ARRAY
try_enable BPF_MAP_TYPE_PERCPU_HASH
try_enable BPF_MAP_TYPE_RINGBUF
try_enable BPF_MAP_TYPE_STACK_TRACE
try_enable BPF_MAP_TYPE_LPM_TRIE
try_enable BPF_MAP_TYPE_HASH_OF_MAPS
try_enable BPF_MAP_TYPE_ARRAY_OF_MAPS
try_enable BPF_MAP_TYPE_TASK_STORAGE
try_enable BPF_MAP_TYPE_SK_STORAGE
try_enable BPF_MAP_TYPE_SOCKHASH
# 网络及Cilium支持
try_enable NET
try_enable INET
try_enable IPV6
try_enable NETFILTER
try_enable NETFILTER_ADVANCED
try_enable NETFILTER_XTABLES
try_enable NF_CONNTRACK
try_enable NF_CONNTRACK_IPV4
try_enable NF_CONNTRACK_IPV6
try_enable NF_NAT
try_enable NF_NAT_IPV4
try_enable NF_NAT_IPV6
try_enable NET_SCH_INGRESS
try_enable NET_CLS_ACT
try_enable NET_SCH_TBF
try_enable XDP_SOCKETS
try_enable XDP_SOCKETS_DIAG
try_module NET_CLS_BPF
try_module NET_ACT_BPF
try_module NET_ACT_GACT
try_module NET_ACT_POLICE
try_module NET_SCH_SFQ
try_module NET_SCH_HTB
try_module NET_SCH_FQ
try_module NET_SCH_CAKE
try_module DUMMY
try_module VXLAN
try_module NET_VETH
try_enable NET_IPGRE
try_enable NET_IP_TUNNEL
try_enable NET_FOU
try_enable NET_FOU_IP_TUNNELS
try_enable BRIDGE
try_enable BRIDGE_VLAN_FILTERING
try_enable LWTUNNEL_BPF
try_enable SOCK_CGROUP_DATA
# CGroup v2 支持
try_enable CGROUPS
try_enable CGROUP2
try_enable CGROUP_SCHED
try_enable FAIR_GROUP_SCHED
try_enable CGROUP_CPUACCT
try_enable CGROUP_DEVICE
try_enable CGROUP_FREEZER
try_enable CGROUP_PIDS
try_enable CGROUP_HUGETLB
try_enable CGROUP_NET_CLASSID
try_enable CGROUP_NET_PRIO
try_enable CGROUP_DEBUG
try_enable CGROUP_WRITEBACK
try_enable CGROUP_PERF
try_enable CGROUP_IO
try_enable CGROUP_RDMA
try_enable MEMCG
try_enable BLK_CGROUP
# perf/ftrace/kprobe/uprobe支持
try_enable PERF_EVENTS
try_enable TRACEPOINTS
try_enable FTRACE_SYSCALLS
try_enable FUNCTION_TRACER
try_enable FUNCTION_GRAPH_TRACER
try_enable HAVE_FUNCTION_GRAPH_TRACER
try_enable DYNAMIC_FTRACE
try_enable STACK_TRACER
try_enable KPROBES
try_enable KPROBE_EVENTS
try_enable UPROBES
try_enable UPROBE_EVENTS
try_enable DYNAMIC_DEBUG
# KASAN及内存调试
try_enable KASAN
try_enable KASAN_INLINE
try_enable KASAN_STACK
try_enable KASAN_GENERIC
try_enable DEBUG_SLAB
try_enable SLUB_DEBUG
try_enable DEBUG_KMEMLEAK
try_enable DEBUG_STACKOVERFLOW
try_enable DEBUG_STACK_USAGE
# Lock调试
try_enable DEBUG_SPINLOCK
try_enable PROVE_LOCKING
try_enable DEBUG_LOCKDEP
try_enable LOCK_STAT
try_enable DEBUG_ATOMIC_SLEEP
# 安全模块
try_enable SECURITY
try_enable SECURITYFS
try_enable LSM
try_enable SECURITY_PATH
# KASLR和可重定位
try_enable RELOCATABLE
try_enable RANDOMIZE_BASE
# 安全调试
try_enable DEBUG_LIST
try_enable DEBUG_NOTIFIERS
try_enable DEBUG_CREDENTIALS
# 文件系统支持
try_enable PROC_FS
try_enable TMPFS
try_enable SYSFS
try_enable DEBUG_FS
# 覆盖率与测试
try_enable KCOV
try_enable KUNIT
try_enable KSELFTEST
# BCC示例依赖
try_enable UNIX_DIAG
try_enable INET_DIAG
try_enable PACKET_DIAG
try_enable SOCK_DIAG
echo "✅ 配置完成,请执行:make olddefconfig && make"
```
---
# 二、编译并打包成RPM
```bash
bash ./config_full.sh
make olddefconfig
# 使用 rpm-pkg 生成 rpm 包(默认在 ~/rpmbuild/RPMS/ 目录)
make -j$(nproc) rpm-pkg
```
---
# 三、安装 RPM 包
```bash
sudo dnf install ~/rpmbuild/RPMS/x86_64/kernel-*.rpm \
~/rpmbuild/RPMS/x86_64/kernel-devel-*.rpm \
~/rpmbuild/RPMS/x86_64/kernel-headers-*.rpm
```
---
# 四、生成并验证 initramfs
```bash
# 生成 initramfs
sudo dracut --force --kver $(make kernelrelease) /boot/initramfs-$(make kernelrelease).img
# 验证 initramfs 内容(解压查看)
mkdir /tmp/initramfs
cd /tmp/initramfs
xzcat /boot/initramfs-$(make kernelrelease).img | cpio -idmv
# 查看关键模块是否存在,如 netfilter、ebpf 等
find . -name '*.ko' | grep -E 'xt_nat|bpf|nf_conntrack'
```
---
# 五、更新 grub 并重启
```bash
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot
```
---
# 备注
* `make rpm-pkg` 会自动打包内核和模块,不需你手动调用 `rpmbuild`
* 生成的 RPM 默认存放在 `~/rpmbuild/RPMS/x86_64/`
* `dracut` 会根据当前内核配置打包驱动到 initramfs,确保你的关键驱动(如网络、存储)已编译模块化且正确安装
* 生成 initramfs 后解压查看,确认关键模块已被打包进去,可以排查启动时驱动缺失问题
---
如果你需要,我也能帮你写一键脚本,从配置到打包到安装再到更新 grub 全自动完成。需要告诉我\~