Linux kernel4.0 内核环境搭建,签名问题解决

介绍

在Linux3.7之后对驱动添加了签名的限制,更多细节在此不做过多叙述。

当我们自己编译的ko文件,进行签名时,是不会得到Ubuntu编译时的私钥的。

那我们就要使用自己编译的内核,在编译的过程中将驱动签名的验证关闭。

首先下载内核源码

1
wget https://git.kernel.org/torvalds/t/linux-4.17-rc2.tar.gz

我在这下载的时linux 4.17-rc2的版本。

环境安装

1
sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison

解压源码

1
tar xvf linux-4.17-rc2.tar.gz

内核配置

在正式编译内核之前,我们首先必须配置需要包含哪些模块。实际上,有一些非常简单的方式来配置。使用一个命令,你能拷贝当前内核的配置文件,然后使用可靠的 menuconfig 命令来做任何必要的更改。使用如下命令来完成:

1
cp /boot/config-$(uname -r) .config

得到这个.config文件之后,我们需要修改一些配置,你也可所以输入make menuconfig进行图形化配置。

1555305009746

我们需要修改 or 添加如下属性

1
2
3
CONFIG_MODULE_SIG=n
CONFIG_MODULE_SIG_FORCE=n
CONFIG_MODULE_SIG_SHA512=n

将这3个属性关闭,就可以加载未签名的驱动了。

接下来就可以编译内核了。

编译

1
make modules_install

过程耗时较长。

安装内核

1
sudo make install

make install 命令将比 make modules_install 命令花费更多的时间。

启用内核作为引导

1
sudo update-initramfs -c -k 4.17.0-rc2

更新grub

1
sudo update-grub

到此我们内核编译安装的过程已经结束了。

内核切换

下面我们要做的就是,切换当前使用的内核为我们刚刚编译的内核。

你可以将默认内核切换为刚刚编译的内核。

我在这选择的是开机时切换。

在这还需要配置/etc/default/grub文件中的 GRUB_TIMEOUT=10。

!!!!不要在=号两边加空格

1555337063789

到此就可以在开机时切换内核为刚刚编译的内核了。

驱动代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
hi.c

#include<linux/init.h>
#include<linux/module.h>

static int __init hello_init(void){
printk(KERN_INFO "Hello World enter\n");
return 0;
}

module_init(hello_init);

static void __exit hello_exit(void){
printk(KERN_INFO "Hello World exit\n");
return ;
}

module_exit(hello_exit);

MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("A simple Hello World Module");
MODULE_ALIAS("a simplest module");
MODULE_INFO(intree, "Y");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Makefile

ifeq ($(KERNELRELEASE),)

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

.PHONY: build clean

build:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c
else

$(info Building with KERNELRELEASE = ${KERNELRELEASE})
obj-m := hi.o

endif

将两个文件放在同一个文件夹。

输入make即可编译。

加载驱动

1
sudo insmod hi.ko

卸载驱动

1
sudo rmmode hi

查看驱动信息

1
modinfo hi.ko

查看驱动输出

1
dmesg | grep hi

另一种解决方案

创建一个签名加载内核中,需要用efi的方式安装Ubuntu。

安装之后在BIOS中关闭Secure Boot

创建签名文件

1
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive name/"

将签名文件加载进驱动

1
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /path/to/module

将key加载进Securt Boot

1
sudo mokutil --import MOK.der

重启

1
reboot

重启之后就可以用上面的命令加载ko模块了。

Ubuntu 论坛相关

https://askubuntu.com/questions/762254/why-do-i-get-required-key-not-available-when-install-3rd-party-kernel-modules

1571159948743

Author: YuanBi
Link: https://www.basicbit.cn/2018/10/16/2018-10-16-编译Linux内核4.17/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.