- 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 内核研发自动化
## 核心定位
**五大功能:**
1. **依赖检测与安装** - 自动检测并安装内核开发所需的软件包
2. **工具链安装** - 安装编译器(gcc)、make、git 等开发工具
3. **内核 devel 包安装** - 下载并安装当前系统内核的 devel 包
4. **内核编译** - 支持两种编译方法:
- **SRPM 方法**:Alinux4 官方内核,输出 RPM 包,适合生产环境
- **Upstream 方法**:kernel.org 最新内核,编译快速,适合新特性测试
5. **Module 编译测试** - 测试编译示例内核 module
**支持架构:**
- `x86_64` — Intel/AMD 64 位服务器
- `aarch64` — ARM 64 位服务器(如倚天 710)
**重要约束:**
- 🔒 需要 root 权限执行内核相关操作
- 📦 仅Linux操作系统
- ⚠️ 内核编译会消耗大量系统资源(建议至少 4GB 内存)
- ⏱️ 编译时间:SRPM 方法 1-3 小时,Upstream 方法 30-60 分钟
---
## 快速开始
### 一键搭建开发环境
```bash
# 1. 检测系统架构
ARCH=$(uname -m)
KERNEL_VER=$(uname -r)
echo "架构: $ARCH | 内核: $KERNEL_VER"
# x86_64 示例输出:架构: x86_64 | 内核: 6.6.102-5.2.alnx4.x86_64
# aarch64 示例输出:架构: aarch64 | 内核: 6.6.102-5.2.alnx4.aarch64
# 2. 检查 Alinux4 系统
grep -i 'alinux\|alnx' /etc/os-release || echo "[警告] 非 Alinux4 系统"
# 3. 安装所有依赖(两种架构通用)
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
# 4. 安装内核 devel 包(yum 自动匹配当前架构)
sudo yum install -y kernel-devel-$KERNEL_VER kernel-headers-$KERNEL_VER
# 5. 验证环境
ls -l /lib/modules/$KERNEL_VER/build
gcc --version
# 6. 编译内核(可选,两种方法)
# 方法 A: Upstream 方法(推荐,快速)
sudo ./scripts/build-kernel.sh upstream latest 8 defconfig
# 方法 B: SRPM 方法(Alinux4 官方)
sudo ./scripts/build-kernel.sh srpm 6.6.102-5.2.alnx4.x86_64
```
### 创建第一个内核模块
```bash
MODULE_NAME="hello_module"
mkdir -p $MODULE_NAME && cd $MODULE_NAME
# 创建模块代码
cat > ${MODULE_NAME}.c << 'EOF'
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
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
# 创建 Makefile
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: 检测系统架构与信息
```bash
# 检测架构并设置架构相关变量
ARCH=$(uname -m)
KERNEL_VER=$(uname -r)
echo "系统架构: $ARCH"
echo "内核版本: $KERNEL_VER"
# x86_64 典型输出:6.6.102-5.2.alnx4.x86_64
# aarch64 典型输出:6.6.102-5.2.alnx4.aarch64
# 查看操作系统版本
cat /etc/os-release
# 检查是否为 Alinux4 系统
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 会自动匹配当前架构下载对应包:
```bash
# 通用依赖(两种架构均适用)
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/`
**检查依赖是否已安装:**
```bash
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 包
```bash
# 获取当前内核版本和架构
KERNEL_VER=$(uname -r)
ARCH=$(uname -m)
echo "当前内核:$KERNEL_VER (架构:$ARCH)"
# x86_64 示例:6.6.102-5.2.alnx4.x86_64
# aarch64 示例:6.6.102-5.2.alnx4.aarch64
# 安装匹配的 devel 包和 headers 包(yum 自动匹配架构)
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: 验证编译环境
```bash
# 检查 GCC 版本
gcc --version
# 检查 Make 版本
make --version
# 检查 kmod 版本
kmod --version
# 检查内核头文件
ls /usr/include/linux/*.h | head -5
# 测试编译简单模块
mkdir -p /tmp/kernel_test && cd /tmp/kernel_test
cat > test_module.c << 'EOF'
#include <linux/init.h>
#include <linux/module.h>
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:
```bash
#!/bin/bash
# 用法: bash create_module.sh <module_name>
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
# 创建 Makefile
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
```bash
cd my_module
# 编译
make
# 查看生成的文件
ls -lh *.ko
# 显示模块信息
modinfo my_module.ko
# 加载模块(需要 root)
sudo insmod my_module.ko
# 检查是否加载成功
lsmod | grep my_module
# 查看内核日志
dmesg | tail -10
# 卸载模块
sudo rmmod my_module
# 再次查看日志
dmesg | tail -10
```
---
## 故障排查
### 自动化诊断工具
**使用环境检查脚本:**
```bash
# 检查所有依赖
./scripts/check-env.sh
# 自动安装缺失的依赖
sudo ./scripts/install-deps.sh
# 一键搭建环境
sudo ./scripts/setup.sh
```
### 常见问题
**Q1: 缺少内核头文件**
```bash
# 检查 devel 包
rpm -qa | grep kernel-devel
# 安装匹配的 devel 包
sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
# 验证链接
ls -l /lib/modules/$(uname -r)/build
```
**Q2: GCC 版本不匹配**
```bash
# 查看 GCC 版本
gcc --version
# 重新安装 GCC
sudo yum reinstall gcc gcc-c++
```
**Q3: 编译时内存不足**
```bash
# 减少编译线程数
make -j2
# 或增加 swap
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
```
**Q4: insmod 失败 - 无效格式**
```bash
# 检查内核版本匹配
uname -r
modinfo my_module.ko | grep vermagic
# 如果不匹配,重新编译
make clean && make
```
**Q5: Secure Boot 阻止模块加载**
```bash
# 临时禁用 Secure Boot(重启时按 F2/Del 进入 BIOS)
# 或为模块签名
sudo mokutil --disable-validation
```
**Q6: 缺少 kmod 工具**
```bash
# 安装 kmod
sudo yum install kmod
# 验证
kmod --version
```
**Q7: 编译警告 "compiler differs from the one used to build the kernel"**
这是正常警告,表示当前 GCC 版本与编译内核时的 GCC 版本略有不同。
只要主版本相同(如都是 GCC 12.3),通常可以安全忽略。
```bash
# 查看内核编译版本
cat /proc/version
# 查看当前 GCC 版本
gcc --version
```
**Q8: BTF generation skipped**
```bash
# 警告信息:Skipping BTF generation due to unavailability of vmlinux
# 这是正常现象,BTF 是可选功能,不影响模块基本功能
# 如需 BTF 支持,需要编译完整的内核
```
### 诊断命令
```bash
# 检查已安装的依赖
View on GitHub