Ubuntu 20.04 编译内核
此文虽仅在Ubuntu 20.04.04上测试,但于其他版本也有一定参考意义,希望能提供些帮助。
准备工作:
sudo apt-get install libncurses5-dev openssl libssl-dev build-essential openssl pkg-config libc6-dev bison flex libelf-dev zlibc minizip
sudo apt-get install libidn11-dev libidn11 zstd
从 https://kernel.org/下载需要编译的内核源码
准备签名文件
查看当下运行的内核
uname -r
进入内核所在header/certs目录或
cd /usr/src/linux-headers-$(uname -r)/certs
创建 x509.genkey, 内容如下
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts
[ req_distinguished_name ]
CN = Modules
[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
或者
echo -e "[ req ] \n\
default_bits = 4096 \n\
distinguished_name = req_distinguished_name \n\
prompt = no \n\
x509_extensions = myexts \n\
[ req_distinguished_name ] \n\
CN = Modules \n\
\n\
[ myexts ] \n\
basicConstraints=critical,CA:FALSE \n\
keyUsage=digitalSignature \n\
subjectKeyIdentifier=hash \n\
authorityKeyIdentifier=keyid" > x509.genkey
接下来运行
sudo openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem
执行上面的命令后, 应该能得到如下两个文件
test@test:/usr/src/linux-headers-5.13.0-30-generic/certs$ ls
Kconfig Makefile signing_key.pem signing_key.x509 x509.genkey
编辑配置文件
sudo cp /boot/config/config-'uname -r' /path/to/kernel/source/.config
sudo nano /path/to/kernel/source/.config
将CONFIG_SYSTEM_TRUSTED_KEYS=“debian/canonical-certs.pem”
改为 CONFIG_SYSTEM_TRUSTED_KEYS=“”
将CONFIG_SYSTEM_REVOCATION_KEYS=“debian/canonical-revoked-certs.pem”
改为 CONFIG_SYSTEM_REVOCATION_KEYS=“”
将 CONFIG_DEBUG_INFO_BTF=y
改为 CONFIG_DEBUG_INFO_BTF=n
编译内核
sudo make -j8
-j8代表用8核编译,如需不同和数量或更多核数
编译安装组件
sudo make INSTALL_MOD_STRIP=1 modules_install -j8
注:添加 INSTALL_MOD_STRIP=1 为了得到裁剪后的initrd,如下面碰到的问题中描述
安装内核
sudo make install -j8
更新过程中碰到的问题
由于本就是在网上的教程基础上进行,并未碰到过多问题。其中一个问题为更新grub后重启,不能进入OS,卡在 load initial ramdisk。 有几种可能,最大的可能是因为initrd.img文件过大,据说是因为grub能引导的文件需要小于500MB,请查看启动使用的initrd是否大于500M. 这个也是上面步骤中编译内核过程中加入 INSTALL_MOD_STRIP=1 的原因,该参数在编译组件时进行裁剪,将initrd的尺寸缩小。
参考文档
https://blog.csdn.net/weixin_62882080/article/details/124260136
https://superuser.com/questions/1214116/no-openssl-sign-file-signing-key-pem-leads-to-error-while-loading-kernel-modules/1322832#1322832
https://blog.csdn.net/HandsomeHong/article/details/125157372