linux kernel的编译安装
编译环境:ubuntu server VM
1.编译依赖的安装:
build-essential: Build tools (C compiler, make, …)
libncurses-dev: ncurses library for interactive menu
bison: To generate lexical analyzers
flex: To generate parsers
libssl-dev: OpenSSL library
libelf-dev: ELF object file access library
安装命令:
sudo apt update
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev
2.kernel源文件下载:
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.172.tar.xz
tar -xf linux-4.19.172.tar.xz
cd linux-4.19.172
4(版本号).19(主要更新号).172(次要更新号)
在版本号和主要更新号相同的情况下,linux kernel的API是不会发生变化的,次要更新主要是安全补丁等相关的更新
tar -xf: x表明是解压缩文件,f是屏蔽输出(即不会显示解压文件的详细情况,但是有error还是会输出)
3.kernel配置
在没有 .config 文件存在的情况下 使用:
make defconfig
生成 .config 文件
<3.1>.自动通过比对现有linux内核的config与将要生成的linux config进行设置
相同的label设置相同的选项,不同的label进行询问
cp /boot/config-$(uname -r) .config
yes "" | make oldconfig
前面的 yes "" 是对每一个被询问的config选项选择yes.(当所有不同的选项希望全部选择yes时可以选择加上)
<3.2>.生成可视化的选项界面进行手动选择:
make menuconfig
Y则编译进kernel image
N则排除对应选项
M则将其编译为可调用的 module,类似硬件驱动一样在需要的时候进行调用
在 menuconfig 界面的第二行可以设置内部版本号,在内核版本号后面加上自己的信息: e.g. 4.19.172-ABCD
<1>和<2>可以选择其中一个进行
<3.可选>. 使用 make localmodconfig 将没有被选中的模块进行排除
后面的编译中将不会编译已经选择N的模块,会显著缩短编译时间,
但是未来如果需要使用被排除的模块则需要重新编译kernel
(使用 lsmod 可以查看目前已被调用的module)
yes "" | make oldconfig
4.源代码编译:
make –j <N> (N是同时编译的线程数,这里可以使用 $(nproc) 将其设置为电脑核心数)
make –j $(nproc) 或者 make –j 3 或者 make –j3 均可运行
编译过程中可能会有warning,其可能是虚拟机设置的内存空间过大或是其他问题,只要不是error,并不会影响后续的执行
5.内核安装:
sudo make modules_install (将编译完成的内核安装到 /lib/modules 目录)
sudo make install (将内核image安装到 /boot/ 文件夹)
6.调整boot loader
编辑位于 /etc/default/grub 的 boot loader 的配置文件,将对应行进行修改,若没有则需要进行添加
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true #开启保存默认内核
GRUB_TIMEOUT_STYLE=menu #开启开机菜单
GRUB_TIMEOUT=10 #开机菜单延时
应用刚刚编辑造成的改变
sudo update-grub
6.重启虚拟机,并在开机菜单中选择刚刚编译好的内核版本
sudo reboot
7.检查安装
重新开机后输入以下命令, 应该看到刚刚自己设定的版本号
uname -r
-> 4.19.172-ABCD