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

posted @ 2021-05-10 14:47  zhuang6  阅读(685)  评论(0编辑  收藏  举报