Ubuntu下内核与内核模块的编译过程

内核开发中经常需要编译内核,这里对ubuntu下内核编译的步骤进行总结


内核编译过程

  1. 下载某个版本的内核源码,将内核目录移动至/usr/src/目录下
  2. 在内核根目录下执行make mrpropermake clean(后者只删除类似目标文件之类的编译过程生成的中间文件,而不会删除设置文件)
  3. 在内核根目录下make menuconfig生成内核配置文件.config(如果已有配置文件,比如第2次编译内核,那么可以省略这一步)
  4. make bzImage编译得到经过压缩的内核,在/usr/src/内核版本/arch/x86_64/boot/
  5. make modules编译模块(只是编译好,还未安装,/lib/modules下还未生成相应文件)
  6. make modules_install安装模块(/lib/modules下会生成相应文件)
  7. 创建initrd,执行:mkinitramfs -o /boot/initrd文件名 内核版本内核版本参考/lib/modules/目录下的内核模块的目录名)
  8. 将相关文件移动到/boot目录下,包括:
    • 配置文件
    • 编译产生的压缩过的内核
  9. 修改grub
    • /etc/grub.d/40_custom中添加启动引导项
    • 调用sudo update-grub2更新grub配置
    • 编辑/etc/default/grub修改grub启动配置(比如修改默认启动项。可以通过/boot/grub/grub.cfg文件查看当前的启动菜单项,启动菜单项的下标和menuentry的对应关系参照这里


内核模块编译过程

以overlay模块为例

  1. service docker stop停止docker服务
  2. modprobe -r overlay卸载模块(会调用module_exit(出口函数)指定的出口函数)
  3. 编译overlay模块

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash

    KERNEL_VERSION="4.4.68"
    KERNEL_VERSION_EXPAND="linux-4.4.68"

    #编译内核模块
    make CONFIG_OVERLAY_FS=m -C /usr/src/$KERNEL_VERSION_EXPAND M=/usr/src/$KERNEL_VERSION_EXPAND/fs/overlayfs modules

    #将内核模块文件拷贝到相应目录
    cp /usr/src/$KERNEL_VERSION_EXPAND/fs/overlayfs/overlay.ko /lib/modules/$KERNEL_VERSION/kernel/fs/overlayfs/

    #更新模块依赖
    depmod -a
  4. modprobe overlay装载模块(会调用module_init(入口函数)指定的入口函数)

  5. service docker start启动docker服务
文章目录
  1. 1. 内核编译过程
  2. 2. 内核模块编译过程
|