| name | kernel-dev |
| version | 1.0.0 |
| description | Linux 内核研发自动化技能(RPM 包管理系统),提供内核编译(SRPM/Upstream 双方法)、内核 module 开发环境搭建、依赖安装、示例代码生成等功能。Linux 官方内核及上游最新内核,兼容 x86_64 和 aarch64 双架构。使用场景:内核定制开发、驱动模块研发、内核漏洞修复验证。适用于 RPM 包管理的 Linux 系统(如 Alibaba Cloud Linux)。 |
| layer | core |
| lifecycle | production |
Kernel Development - Linux 内核研发自动化
核心定位
五大功能:
- 依赖检测与安装 - 自动检测并安装内核开发所需的软件包
- 工具链安装 - 安装编译器(gcc)、make、git 等开发工具
- 内核 devel 包安装 - 下载并安装当前系统内核的 devel 包
- 内核编译 - 支持两种编译方法:
- SRPM 方法:Alinux4 官方内核,输出 RPM 包,适合生产环境
- Upstream 方法:kernel.org 最新内核,编译快速,适合新特性测试
- Module 编译测试 - 测试编译示例内核 module
支持架构:
x86_64 — Intel/AMD 64 位服务器
aarch64 — ARM 64 位服务器(如倚天 710)
重要约束:
- 🔒 需要 root 权限执行内核相关操作
- 📦 仅Linux操作系统
- ⚠️ 内核编译会消耗大量系统资源(建议至少 4GB 内存)
- ⏱️ 编译时间:SRPM 方法 1-3 小时,Upstream 方法 30-60 分钟
快速开始
一键搭建开发环境
ARCH=$(uname -m)
KERNEL_VER=$(uname -r)
echo "架构: $ARCH | 内核: $KERNEL_VER"
grep -i 'alinux\|alnx' /etc/os-release || echo "[警告] 非 Alinux4 系统"
sudo yum install -y \
gcc gcc-c++ make binutils \
flex bison \
libelf-devel openssl-devel ncurses-devel \
pahole perl python3 python3-devel \
git ccache dwarves wget curl kmod \
rpm-build rpmdevtools
sudo yum install -y kernel-devel-$KERNEL_VER kernel-headers-$KERNEL_VER
ls -l /lib/modules/$KERNEL_VER/build
gcc --version
sudo ./scripts/build-kernel.sh upstream latest 8 defconfig
sudo ./scripts/build-kernel.sh srpm 6.6.102-5.2.alnx4.x86_64
创建第一个内核模块
MODULE_NAME="hello_module"
mkdir -p $MODULE_NAME && cd $MODULE_NAME
cat > ${MODULE_NAME}.c << 'EOF'
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Alinux4 Kernel Dev");
MODULE_DESCRIPTION("Hello World kernel module for alnx4");
MODULE_VERSION("0.1");
static int __init hello_init(void)
{
printk(KERN_INFO "hello_module: Module loaded (alnx4)\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "hello_module: Module unloaded\n");
}
module_init(hello_init);
module_exit(hello_exit);
EOF
cat > Makefile << 'EOF'
obj-m += hello_module.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
make -C $(KERNEL_DIR) M=$(PWD) modules
clean:
make -C $(KERNEL_DIR) M=$(PWD) clean
install:
sudo insmod hello_module.ko
unload:
sudo rmmod hello_module
.PHONY: all clean install unload
EOF
make
sudo make install
dmesg | tail
sudo make unload
Step-by-Step 环境搭建
Step 1: 检测系统架构与信息
ARCH=$(uname -m)
KERNEL_VER=$(uname -r)
echo "系统架构: $ARCH"
echo "内核版本: $KERNEL_VER"
cat /etc/os-release
grep -i 'alinux\|alnx' /etc/os-release
case "$ARCH" in
x86_64) echo "[✓] x86_64 架构,支持" ;;
aarch64) echo "[✓] aarch64 架构,支持" ;;
*) echo "[✗] 不支持的架构: $ARCH" ; exit 1 ;;
esac
Step 2: 安装内核开发依赖
以下依赖包为 x86_64 和 aarch64 通用,yum 会自动匹配当前架构下载对应包:
sudo yum install -y \
gcc gcc-c++ make binutils \
flex bison \
libelf-devel openssl-devel ncurses-devel \
pahole perl python3 python3-devel \
git ccache dwarves wget curl kmod
依赖包说明:
| 软件包 | 用途 | 必需 | 架构 |
|---|
| gcc, gcc-c++ | GNU 编译器 | ✓ | 通用 |
| make | 构建工具 | ✓ | 通用 |
| binutils | 二进制工具 | ✓ | 通用 |
| flex, bison | 词法/语法分析器 | ✓ | 通用 |
| libelf-devel | ELF 文件处理 | ✓ | 通用 |
| openssl-devel | SSL/TLS 库 | ✓ | 通用 |
| ncurses-devel | 终端 UI 库 | ✓ | 通用 |
| pahole | DWARF 调试工具 | ✓ | 通用 |
| kmod | 内核模块工具 | ✓ | 通用 |
| git | 版本控制 | ○ | 通用 |
| ccache | 编译加速 | ○ | 通用 |
注意:yum 仓库的 baseurl 中架构路径不同:
- x86_64:
https://mirrors.aliyun.com/alinux/4/updates/x86_64/os/
- aarch64:
https://mirrors.aliyun.com/alinux/4/updates/aarch64/os/
检查依赖是否已安装:
echo "当前架构: $(uname -m)"
for pkg in gcc make flex bison libelf-devel openssl-devel ncurses-devel pahole perl python3 kmod; do
if rpm -q $pkg &>/dev/null; then
echo "[✓] $pkg 已安装"
else
echo "[✗] $pkg 未安装"
fi
done
Step 3: 安装内核 devel 包
KERNEL_VER=$(uname -r)
ARCH=$(uname -m)
echo "当前内核:$KERNEL_VER (架构:$ARCH)"
sudo yum install -y kernel-devel-$KERNEL_VER kernel-headers-$KERNEL_VER
ls -l /lib/modules/$KERNEL_VER/build
验证成功标志:
# x86_64:
/lib/modules/6.6.102-5.2.alnx4.x86_64/build -> ../../usr/src/kernels/...
# aarch64:
/lib/modules/6.6.102-5.2.alnx4.aarch64/build -> ../../usr/src/kernels/...
Step 4: 验证编译环境
gcc --version
make --version
kmod --version
ls /usr/include/linux/*.h | head -5
mkdir -p /tmp/kernel_test && cd /tmp/kernel_test
cat > test_module.c << 'EOF'
MODULE_LICENSE("GPL");
static int __init test_init(void) { return 0; }
static void __exit test_exit(void) {}
module_init(test_init);
module_exit(test_exit);
EOF
cat > Makefile << 'EOF'
obj-m += test_module.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
make -C $(KERNEL_DIR) M=$(PWD) modules
clean:
make -C $(KERNEL_DIR) M=$(PWD) clean
EOF
make && ls -lh test_module.ko
内核 Module 开发
创建自定义 Module
以下脚本可创建一个完整的内核模块项目,包含源码和 Makefile:
#!/bin/bash
MODULE_NAME="${1:?请提供模块名称}"
if [ -d "$MODULE_NAME" ]; then
echo "[✗] 目录已存在:$MODULE_NAME"
exit 1
fi
mkdir -p "$MODULE_NAME" && cd "$MODULE_NAME"
cat > ${MODULE_NAME}.c << CEOF
/* ${MODULE_NAME} - Kernel Module for Alinux4 */
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Alinux4 Kernel Dev");
MODULE_DESCRIPTION("${MODULE_NAME}: A simple kernel module for alnx4");
MODULE_VERSION("0.1");
static int __init ${MODULE_NAME}_init(void)
{
printk(KERN_INFO "${MODULE_NAME}: Module loaded (alnx4)\n");
printk(KERN_INFO "${MODULE_NAME}: Hello, Alinux4 Kernel!\n");
return 0;
}
static void __exit ${MODULE_NAME}_exit(void)
{
printk(KERN_INFO "${MODULE_NAME}: Module unloaded\n");
}
module_init(${MODULE_NAME}_init);
module_exit(${MODULE_NAME}_exit);
CEOF
cat > Makefile << MEOF
obj-m += ${MODULE_NAME}.o
KERNEL_DIR := /lib/modules/\$(shell uname -r)/build
PWD := \$(shell pwd)
all:
make -C \$(KERNEL_DIR) M=\$(PWD) modules
clean:
make -C \$(KERNEL_DIR) M=\$(PWD) clean
install:
sudo insmod ${MODULE_NAME}.ko
unload:
sudo rmmod ${MODULE_NAME}
status:
dmesg | tail -20 | grep ${MODULE_NAME}
.PHONY: all clean install unload status
MEOF
echo "[✓] Module 文件已创建:"
echo " - ${MODULE_NAME}/${MODULE_NAME}.c"
echo " - ${MODULE_NAME}/Makefile"
echo ""
echo "快速开始:"
echo " cd ${MODULE_NAME} && make && sudo make install"
编译和测试 Module
cd my_module
make
ls -lh *.ko
modinfo my_module.ko
sudo insmod my_module.ko
lsmod | grep my_module
dmesg | tail -10
sudo rmmod my_module
dmesg | tail -10
故障排查
自动化诊断工具
使用环境检查脚本:
./scripts/check-env.sh
sudo ./scripts/install-deps.sh
sudo ./scripts/setup.sh
常见问题
Q1: 缺少内核头文件
rpm -qa | grep kernel-devel
sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
ls -l /lib/modules/$(uname -r)/build
Q2: GCC 版本不匹配
gcc --version
sudo yum reinstall gcc gcc-c++
Q3: 编译时内存不足
make -j2
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Q4: insmod 失败 - 无效格式
uname -r
modinfo my_module.ko | grep vermagic
make clean && make
Q5: Secure Boot 阻止模块加载
sudo mokutil --disable-validation
Q6: 缺少 kmod 工具
sudo yum install kmod
kmod --version
Q7: 编译警告 "compiler differs from the one used to build the kernel"
这是正常警告,表示当前 GCC 版本与编译内核时的 GCC 版本略有不同。
只要主版本相同(如都是 GCC 12.3),通常可以安全忽略。
cat /proc/version
gcc --version
Q8: BTF generation skipped
诊断命令
rpm -qa | grep -E 'gcc|make|flex|bison|kmod'
ls /usr/include/linux/*.h | wc -l
ls -l /lib/modules/$(uname -r)/build/Makefile
modinfo my_module.ko
dmesg | tail -50
cat /etc/system-release
uname -r
验收标准
环境搭建验收
| 步骤 | 检查命令 | 成功标志 |
|---|
| 1️⃣ 依赖安装 | gcc --version | GCC >= 10.0 |
| 2️⃣ 工具链 | make --version | Make >= 4.0 |
| 3️⃣ kmod 工具 | kmod --version | kmod 已安装 |
| 4️⃣ 内核头文件 | ls /usr/include/linux | 头文件存在 |
| 5️⃣ Kbuild | ls /lib/modules/$(uname -r)/build | build 链接存在 |
| 6️⃣ 编译测试 | make (测试模块) | .ko 文件生成 |
| 7️⃣ 加载测试 | sudo insmod test.ko | 无报错,dmesg 有输出 |
Module 开发验收
bash create_module.sh test_mod
cd test_mod && make
ls -lh test_mod.ko
sudo insmod test_mod.ko
dmesg | tail
sudo rmmod test_mod
最佳实践
1. 使用 ccache 加速编译
sudo yum install ccache
export CCACHE_DIR=$HOME/.ccache
export CC="ccache gcc"
export CXX="ccache g++"
ccache --stats
编译速度提升:
- 首次编译:~45 分钟
- 二次编译:~8 分钟(提升 5.6 倍)
2. 保存内核配置
cp /boot/config-$(uname -r) ~/kernel-configs/my-config
cp ~/kernel-configs/my-config /usr/src/kernels/linux-*/.config
make olddefconfig
3. 增量编译
make -j8 && make modules -j8
make M=drivers/net clean && make M=drivers/net
4. 版本控制
cd my_module
git init
git add .
git commit -m "Initial kernel module"
Examples
- 编译新内核 — 双方法编译指南(SRPM/Upstream),包含配置优化、编译加速、安装流程
- 编译示例内核 Module — Hello World 内核模块的创建、编译、加载、卸载
- 示例模块集合 — 包含 hello_module、param_module、proc_module、char_device
Scripts
| 脚本 | 描述 |
|---|
scripts/build-kernel.sh | 内核编译自动化(支持 SRPM/Upstream 双方法) |
scripts/check-env.sh | 检查环境依赖 |
scripts/install-deps.sh | 自动安装依赖 |
scripts/setup.sh | 一键搭建开发环境 |
scripts/verify-env.sh | 全面验证环境(含测试编译) |
scripts/test-module.sh | 自动化测试内核模块 |
build-kernel.sh 用法:
./scripts/build-kernel.sh upstream latest 8 defconfig
./scripts/build-kernel.sh srpm $(uname -r)
./scripts/build-kernel.sh status
./scripts/build-kernel.sh install upstream
Documentation
References
适用版本: Alinux4 (alnx4)
支持架构: x86_64, aarch64
支持内核: