我使用的是kernel 4.9.153
版本,debian上测试过,但是编译环境可以是任何linux系统。
从kernel.org
下载一个稳定版的kernel包,如linux-4.9.153.tar.xz
, 然后解压出来到linux-4.9.153
文件夹
sudo apt install build-essential bc python libncurses5-dev libncursesw5-dev
然后重启一下
可以查看一下当前自己系统的kernel 版本(结果根据自己系统不同而不同):
uname -r
# 我的机器上是 :
4.9.0-8-amd64
进入解压后的文件夹linux-4.9.153
, 然后看一下Makefile
:
$ head -n 5 Makefile
VERSION = 4
PATCHLEVEL = 9
SUBLEVEL = 153
EXTRAVERSION =
NAME = Roaring Lionus
.config
需要在kernel源文件根目录下(linux-4.9.153
下), 创建一个配置文件.config
, 在里面可以指定非常多的配置项。
为了方便起见,可以使用当前系统的配置文件,它在/boot
下。
可以使用下面命令通过本机配置来创建.config
文件,并且验证不合格的参数值
$ make olddefconfig
之后可以使用菜单的方式查看和改动.config:
$ make menuconfig
保存退出后,它会创建备份配置文件.config.old
, 用新的配置覆盖 .config
可以设置2个值:
CONFIG_LOCALVERSION="-mykernel"
-mykernel
CONFIG_BLK_DEV_LOOP=y
可以使用
scripts/diffconfig .config.old .config
来对比新老配置文件的区别
执行编译的时候,会有很多时间花在了编译和安装 kernel 的 modules上,但是实际上有很多module都是用不到的。所以可以根据当前系统中已经加载的module,来重新产生一个更小的.config
文件,这样这个文件中只包含到当前使用到的modules,能够大大减小编译时间。
在内核根目录下,执行
make localmodconfig
它会根据当前系统中运行的modules,来修改.config
文件。
因为执行这一句的时候,会被询问很多问题,所以可以直接按回车来默认选项,或者是直接输入:
yes '' | make localmodconfig
执行完之后,就会产生一个更小的配置文件(配置文件本身可能占用空间更大,但是内部配置的modules更少了)。
然后确保修改
CRYPTO_CRC32C_INTEL=y
最好是在运行这一步之前,创建一下虚拟机镜像,万一这一步操作之后导致编译失败,直接回到之前,使用原始的.config文件用来执行第五步以及后面的步骤
在kernel的根目录下运行下面的命令,其中N替换成本机器的核心数(4核就是 make -j4
)
make -jN
根据每台机器性能不同,这次编译时间可能多达3个小时。
在确认第五步正常运行,没有报错的情况下,运行下面2个代码(使用root权限):
sudo make modules_install # 安装所有已编译的kernel modules
sudo make install # 安装kernel镜像到 /boot/
然后可以去/boot/
下面查看,应该多了这3个文件:
不同kernel版本 install出的文件可能名称会略有不同,但是这个名字
-mykernel
就是刚才自己配置的CONFIG_LOCALVERSION
内容
sudo shutdown -r now
重启系统,进入启动菜单选项的时候,找到和自己编译的kernel相同的项启动。
进入桌面后可以查看kernel版本:
uname -r
4.9.153-mykernel