新手也能搞定:Linux服务器内核模块编译全流程

什么是内核模块与为什么需要编译

Linux内核模块是可以在不重启系统的情况下动态加载到内核中的代码片段,常用于添加驱动程序、文件系统支持或自定义功能。
当你需要让服务器支持新硬件、启用内核调试或定制内核行为时,手动编译内核模块是最灵活的方式。
本文以最简单的hello模块为例,教你在Ubuntu/Debian或CentOS上完成编译与加载。

编译前的环境准备

不同发行版需要安装不同的开发包,请根据你服务器的系统执行对应命令。

Debian/Ubuntu

sudo apt update
sudo apt install build-essential linux-headers-$(uname -r)

CentOS/RHEL

sudo yum install epel-release
sudo yum groupinstall "Development Tools"
sudo yum install kernel-devel-$(uname -r)

确保安装完成后,/lib/modules/$(uname -r)/build 目录存在,它是指向内核源码的符号链接。

编写一个最简单的内核模块

创建一个工作目录并进入:

mkdir ~/hello_module && cd ~/hello_module

新建文件 hello.c

#include 
#include 
#include 

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello, Kernel Module!\n");
    return 0;
}

static void __exit hello_exit(void)
{
    printk(KERN_INFO "Goodbye, Kernel Module!\n");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("You");
MODULE_DESCRIPTION("A simple hello kernel module");

编写Makefile并编译

同一目录下创建 Makefile

obj-m += hello.o
all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

执行编译:

make

编译成功后会生成 hello.ko 文件。
如果报错,检查 linux-headerskernel-devel 是否完整。

加载与卸载模块

加载模块(需要root权限):

sudo insmod hello.ko

查看内核消息确认:

dmesg | tail -5

应能看到 Hello, Kernel Module!
卸载模块:

sudo rmmod hello
dmesg | tail -3

此时出现 Goodbye, Kernel Module!

常见错误与避坑要点

  • error: ‘struct task_struct’ has no member named ‘xxxx’:当前内核版本与模块代码不符,需要根据内核头文件调整代码。
  • Required key not available:某些系统启用了内核模块签名验证,需要在BIOS禁用Secure Boot,或自行签名模块。
  • insmod: ERROR: could not insert module hello.ko: Operation not permitted:检查是否以root执行,或者模块与内核版本不匹配。
  • 务必使用与当前运行内核完全一致的 linux-headers-$(uname -r),不同版本头文件差异可能导致编译失败或加载后内核崩溃。
  • 生产服务器上加载模块前建议先在测试环境验证,避免触发内核oops。

验证模块是否正常运行

除了通过 dmesg 查看打印,还可以查询模块信息:

lsmod | grep hello
modinfo hello.ko

lsmod 显示已加载模块列表,modinfo 展示作者、描述和许可证等元数据。
如果你的模块需要和用户空间交互(例如 /dev/hello),则需额外创建设备节点,但基础验证用 dmesg 已经足够。

如果你正在处理Linux服务器内核模块编译,建议先按本文步骤完成hello模块的编译与加载,再根据自己的需求修改代码;
遇到异常时优先检查内核头文件版本和模块与内核的兼容性。

分享到:
上一篇
WP网站图片格式转换:WordPress图片格式转换到
下一篇
Docker部署php:Docker部署PHP环境
1
系统公告

泽御云五一特惠活动🔥

泽御云持证合规运营,资质齐全可查,长久稳定! 五一限时多重福利同步开启: ✅ 香港 2 核 2G 云服务器超值拼团,低价入手团长免费 ✅ 4 核 4G 多机房年付拼团,性价比拉满 ✅ 内蒙古新区限时 7 折(zeyuyunnmg)特惠,专属优惠码锁价续费 ✅ 全站通用 75 折优惠,老用户充值享专属赠金 官方站点:zeyuyun.com 合规资质齐全|售后有保障|活动限时错过不再有
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意