linux 编译kernel
编译kernel
1. 下载
下载指定版本:
https://kernel.org/
https://cdn.kernel.org/pub/linux/kernel/v5.x/
下载最新稳定版本:
https://mirrors.edge.kernel.org/pub/linux/kernel/
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
2. 安装编译kernel依赖包
sudo apt-get install libncurses5-dev \ openssl \ libssl-dev \ build-essential \ pkg-config \ libc6-dev \ bison \ flex \ libelf-dev \ minizip \ libidn11-dev \ libidn11
3. 解压(指定版本)
tar -xavf linux-5.0.3.tar.xz -C /usr/src
4. 生成配置文件
方式一:使用命令生成当前系统的配置文件,在/usr/src/lounx-5.0.3/下生成 .config 文件
cd /usr/src/linux-5.0.3 make oldconfig # 使用当前系统自带的配置文件,文件不存在需要选择(y,n,m)
方式二:使用准备好的kernel配置文件,把配置文件复制到Linux-5.0.3目录下,文件名必须是.config
mv kernel-config .config make olddefconfig # 文件不存在,你不需要选择
方式三:自己配置.config文件。基于图形工具页面
make menuconfig # 基于ncurse库编制的图形工具界面
build kernel error: 要清除,重新build
make mrproper # 清除编译过程中产生的中间文件包括.config make clean # 清除上次编译长生的中间文件
note(方式三):
- 空格键: 选中、取消、下级目录
- 上下键: 上下移动
- exit: 退出
- []: 有*代表选中,没有*代表没有选中。选中表示编译到内核镜像中
- <> 有三种状态,*代表选中,没有*代表未选中,M代表模块
- () 存放十进制或十六进制或字符串
Note: 如果需要再次编译,清除上次编译的文件,否则报错
# make mrproper
make clean
5. 编译
5.1编译kernel的方式一
编译kernel
make -j4
安装模块
make modules_install
安装内核
make install
5.2 编译kernel的方式二
只编译内核
make bzImage -j4
编译模块
make modules -j4
安装模块
make modules_install
安装内核
make install
说明:
make modules_install
lib/modules/目录下就会生成一个以版本号命名的一个文件模块
make install
在/boot目录下会生成一个vmlinuz-5.0.3的文件
6. 查看编译的kernel(查看编译的kernel是否已经在其中)
vim /boot/grub/grub.conf
修改启动kernel:https://www.cnblogs.com/zhuangshenhao/articles/15632391.html
7. reboot后,进入grub,选择我们编译好的kernel
8. kernel 相关文件
/usr/src/ /boot/ /lib/modules/ /boot/grub/grub.cfg
liunx 内核文件区别:
- vmlinux 编译出的最原始的内核文件,未压缩。
- zImage 是vmliunx经过gzip压缩的文件。
- bzImage bz表示big zImage,不是bzip2压缩的。两者的不同处是zImage压缩内核到低端内存(第一个640K),bzImage解压缩到高端内存(1M以上)。如果内核比较小,采用zImage和标准Image都可以,如果比较大用bzImage。
- vmliunz 是bzImage、zImage文件的拷贝或指向bzImage、zImage的链接
- initrd 是initial ramdisk的简写,一般被用来临时的引导硬件到实际内核vmlinuz能够结果并继续引导的状态。
编译kernel遇到的问题
1.
报错内容:openssl/opensslv.h not fond or not directory
解决方法:apt-get install libssl-dev
2.
命令:
make menuconfig
报错内容:
*** Unable to find the ncurses libraries orthe *** required header files. *** 'make menuconfig' requires the ncurseslibraries. *** *** Install ncurses (ncurses-devel) and tryagain.
解决方法:
apt-get install libncurses5-dev
3.
报错内容:
In file included fromscripts/kconfig/mconf.c:23:0: scripts/kconfig/lxdialog/dialog.h:38:20:fatal error: curses.h: No such file or directory
解决方法:同2
4.
编译的过程中报错:
ld: final link failed: No space left ondevice scripts/Makefile.modpost:125: recipe fortarget 'drivers/net/wireless/p54/p54common.ko' failed make[1]: ***[drivers/net/wireless/p54/p54common.ko] Error 1
说明:你的空间不够了,可以使用df -h命令查看
解决方法:把磁盘弄大点
5.
command:
make -j4
error log: canonical-certs.pem
make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop. make[1]: *** Waiting for unfinished jobs.... make: *** [Makefile:1846: certs] Error 2
solution:
scripts/config --disable SYSTEM_TRUSTED_KEYS
6.
command:
make -j4
error log: debian/canonical-revoked-certs.pem
make[1]: *** No rule to make target 'debian/canonical-revoked-certs.pem', needed by 'certs/x509_revocation_list'. Stop. make: *** [Makefile:1868: certs] Error 2
solution:
scripts/config --disable SYSTEM_REVOCATION_KEYS
7.
command:
make -j4
error log:
BTF: .tmp_vmlinux.btf: pahole (pahole) is not available Failed to generate BTF for vmlinux Try to disable CONFIG_DEBUG_INFO_BTF make: *** [Makefile:1161: vmlinux] Error 1
solution:
scripts/config --set-val CONFIG_DEBUG_INFO_BTF=n
参考:
https://blog.csdn.net/zhaogang1993/article/details/79514344
https://blog.csdn.net/qq_43688952/article/details/88856354
https://blog.csdn.net/m0_47696151/article/details/121574718
https://askubuntu.com/questions/1329538/compiling-the-kernel-5-11-11
https://www.cnblogs.com/networking/p/4821248.html