介绍
在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进行图形化配置。
我们需要修改 or 添加如下属性
1 | CONFIG_MODULE_SIG=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。
!!!!不要在=号两边加空格
到此就可以在开机时切换内核为刚刚编译的内核了。
驱动代码
1 | hi.c |
1 | Makefile |
将两个文件放在同一个文件夹。
输入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模块了。