CentOS7编译自己的内核模块

  部门已经有固定下来的内核编译方式。迁出完整代码后,加载环境变量文件,直接make即可重新编译内核。修改了某个模块,直接到模块目录下make即可生成模块,很方便。最近想尝试在centos下进行内核开发,查阅了几个centos内核编译wiki说明。感觉比较零散,于是整理出来方便后续查阅和分享。

下载内核源码

$ uname -r
3.10.0-514.26.2.el7.x86_64

有两种方式可以下载centos与当前内核版本一致的源码:
方式1:使用yumdownloader自动下载

$ sudo yum install yum-utils
$ sudo yumdownloader --source kernel
kernel-3.10.0-514.26.2.el7.src.rpm

要注意的是kernel源码下载速度可能很慢,需要挂VPN下载,否则可能会下载失败。

方式2:手工从镜像网站下载
由于软件源镜像站点只保留二进制软件包,所以我们要去centos软件包归档站点“http://vault.centos.org”去下载内核源码。下载地址:http://vault.centos.org/7.3.1611/updates/Source/SPackages/kernel-3.10.0-514.26.2.el7.src.rpm

编译内核源码

  注意:官方强烈建议不要以root身份编译内核源码。主要原因是编译过程中可能有对系统文件的修改操作,如果用root编译就可能在你不知情的情况下直接修改了。用普通用户编译过程中,要是有对系统文件的修改,会因权限不足而报错。详见参考“[5] Building Source RPM as non-root under CentOS ”。

  • 以普通用户创建编译rpm所需的基础目录结构
$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
  • 安装编译内核所需软件包
$ sudo yum install kernel-devel
$ sudo yum install rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed pesign xmlto
$ sudo yum install audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel
$ sudo yum install ncurses-devel newt-devel numactl-devel pciutils-devel python-devel zlib-devel
  • 安装内核源码
$ rpm -i kernel-3.10.0-514.26.2.el7.src.rpm 2>&1 | grep -v exist
$ cd ~/rpmbuild/SPECS
$ rpmbuild -bp --target=$(uname -m) kernel.spec
现在可以在“~/rpmbuild/BUILD/kernel*/linux*”看到完整的内核源代码了。
  • 内核编译设置
$ cd ~/rpmbuild/BUILD/kernel-*/linux-*/
$ cp /boot/config-`uname -r` .config
$ cp /usr/src/kernels/`uname -r`/Module.symvers .
$ cp /usr/src/kernels/`uname -r`/System.map .
$ cp /usr/src/kernels/`uname -r`/vmlinux.id .

  这里拷贝了当前内核的配置到源码目录。因为只是要编译自己的内核模块,所以直接复用当前内核的配置。避免了重新编译整个内核,以及内核版本校验导致新模块加载错误的问题。

$ make prepare
$ make modules_prepare
  • 编译新增模块
$ cd ~/rpmbuild/BUILD/kernel-*/linux-*/
$ mkdir modules
  • 增加加载/移除时会打印提示信息的hello模块
    hello/hello.c
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

static int hello_init(void)
{
    printk(KERN_ERR "Module init: Hello linux kernel.\n");
    return (0);
}

static void hello_exit(void)
{
    printk(KERN_ERR "Module exit: Bye-bye linux kernel.\n");
}

module_init(hello_init);
module_exit(hello_exit);

hello/Makefile

obj-m += hello.o

all:
    make -C $(PWD) M=$(PWD) modules

clean:
    make -C $(PWD) M=$(PWD) clean
$ make M=modules/hello
$ sudo cp modules/hello/hello.ko /lib/modules/`uname -r`/extra
  • 新模块加载/移除
$ cd /lib/modules/`uname -r`/extra
$ sudo insmod hello.ko
$ sudo rmmod hello

$ tail -f /var/log/messages
“
* localhost kernel: Module init: Hello linux kernel.
* localhost kernel: Module exit: Bye-bye linux kernel.
”

messages打印出了模块加载/移除时的提示信息,新增模块工作正常。

参考
[1] SystemTap on CentOS,https://sourceware.org/systemtap/wiki/SystemTapOnCentOS
[2] 我需要内核的源代码,https://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source
[3] 我需要创建一个自设的内核,https://wiki.centos.org/zh/HowTos/Custom_Kernel
[4] 创建你自己的内核模块,https://wiki.centos.org/zh/HowTos/BuildingKernelModules
[5] Building Source RPM as non-root under CentOS,http://www.owlriver.com/tips/non-root/

修订记录
2017-11-05 PM:从网易博客迁移至简书;
2017-07-16 PM:初稿;

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,533评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,055评论 3 414
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,365评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,561评论 1 307
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,346评论 6 404
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,889评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,978评论 3 439
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,118评论 0 286
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,637评论 1 333
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,558评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,739评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,246评论 5 355
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,980评论 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,362评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,619评论 1 280
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,347评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,702评论 2 370

推荐阅读更多精彩内容

  • 通过源码的方式替换 1.获取内核源码 获取内核源码的路径:https://www.kernel.org/pub/l...
    jony456123阅读 2,591评论 0 1
  • 我们说的Linux其实指的就是 内核(kernel)而已。这个内核控制你主机的所有硬件并提供系统所有的功能,所以它...
    Zhang21阅读 7,440评论 0 18
  • CentOS 7 内核编译 本文是参考CentOS官网说明文件,详细内容请参考以下链接https://wiki.c...
    茫子阅读 2,241评论 1 0
  • 【步骤一】安装centos7下载ios(https://www.centos.org/download/),在虚拟...
    分享放大价值阅读 3,133评论 0 2
  • 哪个弄堂飘来一阵饭香 孩子们在嬉笑哄抢 围坐在一起的欢畅 无关于多少钱两 芴地传来的打骂声 夹杂着打翻碗在地的男孩...
    柚宝妈咪阅读 272评论 0 6