如何编译Linux Kernel

嵌入式技术

1367人已加入

描述

整个Linux内核编译的过程非常简单,但是内核编译需要花费很长的时间。因为Linux内核的代码非常多。当然,如果你的计算机性能强劲,时间会短很多。当你准备好性能强劲的计算机后,让小编带你一步一步的编译Linux内核。

一、下载源代码

1、登录官网

进入Linux 内核的官网,下载最新版本,或者其它版本的内核代码。这里是源代码的压缩包。

编译

在kernel.org上你能看到几种类型的内核存在:

  • mainline

最新版本的linux内核,发布新版本后会打开一个合并窗口,接受下一版本要做出的合并,窗口关闭后,就会发布新的rc(即release candidate,发布候选)版内核

  • stable

这是一个主要针对过去发布的内核进行bug修复的树,它更加的稳定

  • linux-next

为发布将来的版本而累积新代码并进行测试的源码树

  • longterm

Long Term Support,长期维护的意思

2. 命令行下载

在官网上查看内核tarball链接地址,在一个Linux操作系统中,使用wget命令行下载内核tarball代码。

编译

在下载的过程中可以看到下载进度,下载完成后信息大致如下所示。

编译

Linux内核压缩包如下:

[root@localhost~]# ls -l | grep linux-6.3.tar.xz
-rw-r--r--   1 root     root      136891752 Apr 24 12:59 linux-6.3.tar.xz

二、解压源代码

压缩包下载完成后,可以通过tar命令解压。

tar -xvf linux-6.3.tar.xz

在解压的时候可以看到文件列表,内容较多,需要解压一会儿。

编译

三、安装需要的软件包

安装全套必备工具。下面步骤 全部在管理员状态下进行

yum install ncurses-devel gcc make rpmdevtools openssl-devel bison flex rpm-build rpm-devel rpmlint python3 coreutils diffutils patch

四、配置内核代码

在编译内核之前,我们可以对内核源代码进行配置。配置的目的主要是确定哪些模块会编译到内核当中。

step 1) 进入源代码目录

cd linux-6.3/

step 2) 拷贝当前主机系统内核使用的config文件

从当前机器的启动目录拷贝config文件到内核源代码目录。目标是使编译内核的config采用与当前环境一致的配置。这个文件保存了在安装系统时内核所安装的模块配置信息,否则需要重新手动指定每一个模块的编译配置。

cp -v /boot/config-$(uname -r) .config

或者

make oldconfig

make oldconfig 命令的作用是检查已有的.config文件和Kconfig文件的规则是否一致,如果一致,就什么都不做,否则提示用户哪些源代码中有的选项在.config文件没有。一般情况下一直执行回车即可。

执行后,内核源码目录下会生成.config文件

[root@localhost linux-6.3]# ls -al | grep -w "config"
-rw-r--r--    1 root root 232033 May  6 13:39 .config

.config 中保存的就是内核编译的相关设置。它的内容大致是这样的:

# General setup
#
CONFIG_INIT_ENV_ARG_LIMIT=32
# CONFIG_COMPILE_TEST is not set
# CONFIG_WERROR is not set
CONFIG_LOCALVERSION="_20230506"
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_BUILD_SALT=""
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_HAVE_KERNEL_LZ4=y
CONFIG_HAVE_KERNEL_ZSTD=y
CONFIG_KERNEL_GZIP=y

:以 # 开头的行就是注释行,这些 CONFIG_* 就是设置项,这些设置项与Linux内核的各功能相对应,它的值有三种分别表示编译时的三种操作:

  • CONFIG_*=y

表示该项目所对应的功能会被静态地添加到内核中

  • CONFIG_*=m

表示该项目对应的功能会被编译成模块,在内核需要时再加载入内核

  • CONFIG_* is not set

表示不编译该项目对应的功能

注意:由于内核间功能的相互依赖十分复杂,因此不要尝试手工编辑 .config 文件,否则可能出现编译失败,或者编译后内核无法执行的情况!

step 3) 启动配置界面(可选)

make menuconfig

该命令会运行一些脚本,然后打开一个配置界面

编译

step 4) 打开配置界面(依赖上一步操作)。

可以看出里面包含所有的内核组件,包括文件系统,网络,IO栈,虚拟化和设备驱动等等。

编译

可以通过该图形界面对内核加载的模块编译选项进行调整,如修改编译后的内核名称、新添加之前系统缺少的模块等。

编译

如果你不熟悉,可以不做任何修改。

step 5) 确认config文件中Local version功能是否配置成功

vi .config

打开.config文件,搜索CONFIG_LOCALVERSION,发现已含有刚刚修改的版本附加信息。

编译

五、编译内核

1、编译内核

使用如下命令编译内核

make -j $(nproc --all)

nproc命令来自英文词组“number of processing units available”的缩写,其功能是用于显示当前进程可用的CPU数量。--all 表示显示所有拥有的CPU数量

参考示例:

显示当前进程可用的CPU数量:

[root@localhost linux-6.3]# nproc

72

显示所有CPU数量:

[root@localhost linux-6.3]# nproc --all

80

输出结果很多,截取部分如下:

编译

编译前内核源码内容如下:

编译

编译后内核源码内容如下:

编译

2、安装模块

将模块安装到指定的路径。使用如下命令安装内核模块

make modules_install
  • 默认安装的路径(/lib/modules/kernel-version/)

    make modules_install     
    #kernel-version是所编译的内核的版本
    
  • 指定安装路径

    make modules_install INSTALL_MOD_PATH=~/rootfs #指定到开发板的文件系统中或者打包放到文件系统中。

执行过程如下:

[root@localhost linux-6.3]# make modules_install
  INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/events/amd/power.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/arch/x86/events/amd/power.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/events/intel/intel-uncore.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/arch/x86/events/intel/intel-uncore.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/events/intel/intel-cstate.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/arch/x86/events/intel/intel-cstate.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/events/rapl.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/arch/x86/events/rapl.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/kernel/cpu/mce/mce-inject.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/arch/x86/kernel/cpu/mce/mce-inject.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/twofish-x86_64.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/twofish-x86_64.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/twofish-x86_64-3way.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/twofish-x86_64-3way.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/twofish-avx-x86_64.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/twofish-avx-x86_64.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/serpent-sse2-x86_64.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/serpent-sse2-x86_64.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/serpent-avx-x86_64.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/serpent-avx-x86_64.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/serpent-avx2.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/arch/x86/crypto/serpent-avx2.ko
...
  INSTALL /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/vmw_vsock_virtio_transport.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/vmw_vsock_virtio_transport.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/vmw_vsock_virtio_transport_common.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/vmw_vsock_virtio_transport_common.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/hv_sock.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/hv_sock.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/vsock_loopback.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/net/vmw_vsock/vsock_loopback.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/net/qrtr/qrtr.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/net/qrtr/qrtr.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/net/qrtr/qrtr-mhi.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/net/qrtr/qrtr-mhi.ko
  INSTALL /lib/modules/6.3.0_20230506/kernel/virt/lib/irqbypass.ko
  SIGN    /lib/modules/6.3.0_20230506/kernel/virt/lib/irqbypass.ko
  DEPMOD  /lib/modules/6.3.0_20230506

查看安装结果,如下:

编译

3、安装内核

安装内核二进制映像文件,并生成boot初始化文件系统映像

make install

make install 主要进行以下事项

1.检查内核是否已经正确编译

2.将bzImage, System.map复制到/boot目录下,并以当前内核版本命名

3.根据modules_install创建的模块,创建所需的initrd.img镜像(初始化内存虚拟磁盘映像)文件

4.修改bootloader(如GRUB2),增加新内核的启动项

执行过程如下:

[root@localhost linux-6.3]# make install
  INSTALL /boot
[root@localhost linux-6.3]#

命令执行后,查看/boot目录变化如下:

#命令执行前检索/boot目录是否包含最新内核
[root@localhost linux-6.3]# ls -l /boot | grep 0506
[root@localhost linux-6.3]#

#命令执行后检索/boot目录是否包含最新内核
[root@localhost ~]# ls -l /boot/ | grep 0506
-rw-------  1 root root 169277320 May  6 14:54 initramfs-6.3.0_20230506.img
lrwxrwxrwx  1 root root        31 May  6 14:53 System.map - > /boot/System.map-6.3.0_20230506
-rw-r--r--  1 root root   6504071 May  6 14:53 System.map-6.3.0_20230506
lrwxrwxrwx  1 root root        28 May  6 14:53 vmlinuz - > /boot/vmlinuz-6.3.0_20230506
-rw-r--r--  1 root root  11486496 May  6 14:53 vmlinuz-6.3.0_20230506
[root@localhost ~]#

安装内核命令执行后,即发现/boot目录下生成最新的内核镜像和相关文件了。

六、重启,验证版本

当上述步骤都没有出错的情况下,我们重启一下计算机,然后运行如下命令。

uname -mrs

此时就可以看到内核版本已经是我们编译的版本了。

编译

七、设置内核启动顺序

如果机器重启后,未更新到最新编译的内核版本,则可通过设置Linux内核启动项,更改内核启动顺序,将新编译的内核作为第一内核启动选项。

首先,查看系统安装的全部内核:

grubby --info=ALL

结果如下:

[root@localhost ~]# grubby --info=ALL
index=0
kernel="/boot/vmlinuz-6.3.0_20230506"
args="ro crashkernel=512M rhgb quiet intermap=on iommu=pt console=ttyS0,115200 console=ttyS1,115200 intel_iommu=on pci=realloc default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=1375 isolcpus=1,3,5,7,9,11,13,17 nohz_full=1,3,5,7,9,11,13,17 rcu_nocbs=1,3,5,7,9,11,13,17 $tuned_params"
root="/dev/mapper/bel-root"
initrd="/boot/initramfs-6.3.0_20230506.img $tuned_initrd"
title="BigCloud Enterprise Linux (6.3.0_20230506) 8.2 (Core)"
id="613790481f5a48e0b1608a83a3c399f7-6.3.0_20230506"
index=1
kernel="/boot/vmlinuz-6.3.0-rc7+"
args="ro crashkernel=512M rhgb quiet intermap=on iommu=pt console=ttyS0,115200 console=ttyS1,115200 intel_iommu=on pci=realloc default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=1375 isolcpus=1,3,5,7,9,11,13,17 nohz_full=1,3,5,7,9,11,13,17 rcu_nocbs=1,3,5,7,9,11,13,17 $tuned_params"
root="/dev/mapper/bel-root"
initrd="/boot/initramfs-6.3.0-rc7+.img $tuned_initrd"
title="BigCloud Enterprise Linux (6.3.0-rc7+) 8.2 (Core)"
id="613790481f5a48e0b1608a83a3c399f7-6.3.0-rc7+"
index=2
kernel="/boot/vmlinuz-6.3.0+"
args="ro crashkernel=512M rhgb quiet intermap=on iommu=pt console=ttyS0,115200 console=ttyS1,115200 intel_iommu=on pci=realloc default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=1375 isolcpus=1,3,5,7,9,11,13,17 nohz_full=1,3,5,7,9,11,13,17 rcu_nocbs=1,3,5,7,9,11,13,17 $tuned_params"
root="/dev/mapper/bel-root"
initrd="/boot/initramfs-6.3.0+.img $tuned_initrd"
title="BigCloud Enterprise Linux (6.3.0+) 8.2 (Core)"
id="613790481f5a48e0b1608a83a3c399f7-6.3.0+"
index=3
kernel="/boot/vmlinuz-6.2.0-rc5+"
args="ro crashkernel=512M rhgb quiet intermap=on iommu=pt console=ttyS0,115200 console=ttyS1,115200 intel_iommu=on pci=realloc default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=1375 isolcpus=1,3,5,7,9,11,13,17 nohz_full=1,3,5,7,9,11,13,17 rcu_nocbs=1,3,5,7,9,11,13,17 $tuned_params"
root="/dev/mapper/bel-root"
initrd="/boot/initramfs-6.2.0-rc5+.img $tuned_initrd"
title="BigCloud Enterprise Linux (6.2.0-rc5+) 8.2 (Core)"
id="613790481f5a48e0b1608a83a3c399f7-6.2.0-rc5+"
index=4
kernel="/boot/vmlinuz-5.4.240-1.el8.elrepo.x86_64"
args="ro crashkernel=512M rhgb quiet intermap=on iommu=pt console=ttyS0,115200 console=ttyS1,115200 intel_iommu=on pci=realloc default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=1375 isolcpus=1,3,5,7,9,11,13,17 nohz_full=1,3,5,7,9,11,13,17 rcu_nocbs=1,3,5,7,9,11,13,17 $tuned_params"
root="/dev/mapper/bel-root"
initrd="/boot/initramfs-5.4.240-1.el8.elrepo.x86_64.img $tuned_initrd"
title="Enterprise Linux (5.4.240-1.el8.elrepo.x86_64) 8.7"
id="613790481f5a48e0b1608a83a3c399f7-5.4.240-1.el8.elrepo.x86_64"
index=5
kernel="/boot/vmlinuz-5.4.67-300.el8.bclinux.x86_64"
args="ro crashkernel=512M rhgb quiet intermap=on iommu=pt console=ttyS0,115200 console=ttyS1,115200 intel_iommu=on pci=realloc default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=1375 isolcpus=1,3,5,7,9,11,13,17 nohz_full=1,3,5,7,9,11,13,17 rcu_nocbs=1,3,5,7,9,11,13,17 $tuned_params"
root="/dev/mapper/bel-root"
initrd="/boot/initramfs-5.4.67-300.el8.bclinux.x86_64.img $tuned_initrd"
title="BigCloud Enterprise Linux (5.4.67-300.el8.bclinux.x86_64) 8.1 (Core)"
id="613790481f5a48e0b1608a83a3c399f7-5.4.67-300.el8.bclinux.x86_64"
index=6
kernel="/boot/vmlinuz-4.19.0-240.23.18.el8_2.bclinux.x86_64"
args="ro crashkernel=512M rhgb quiet intermap=on iommu=pt console=ttyS0,115200 console=ttyS1,115200 intel_iommu=on pci=realloc default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=1375 isolcpus=1,3,5,7,9,11,13,17 nohz_full=1,3,5,7,9,11,13,17 rcu_nocbs=1,3,5,7,9,11,13,17 $tuned_params"
root="/dev/mapper/bel-root"
initrd="/boot/initramfs-4.19.0-240.23.18.el8_2.bclinux.x86_64.img $tuned_initrd"
title="BigCloud Enterprise Linux (4.19.0-240.23.18.el8_2.bclinux.x86_64) 8.2 (Core)"
id="613790481f5a48e0b1608a83a3c399f7-4.19.0-240.23.18.el8_2.bclinux.x86_64"
index=7
kernel="/boot/vmlinuz-4.19.0-240.23.11.el8_2.bclinux.x86_64"
args="ro crashkernel=512M rhgb quiet intermap=on iommu=pt console=ttyS0,115200 console=ttyS1,115200 intel_iommu=on pci=realloc default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=1375 isolcpus=1,3,5,7,9,11,13,17 nohz_full=1,3,5,7,9,11,13,17 rcu_nocbs=1,3,5,7,9,11,13,17 $tuned_params"
root="/dev/mapper/bel-root"
initrd="/boot/initramfs-4.19.0-240.23.11.el8_2.bclinux.x86_64.img $tuned_initrd"
title="BigCloud Enterprise Linux (4.19.0-240.23.11.el8_2.bclinux.x86_64) 8.2 (Core)"
id="613790481f5a48e0b1608a83a3c399f7-4.19.0-240.23.11.el8_2.bclinux.x86_64"
index=8
kernel="/boot/vmlinuz-0-rescue-613790481f5a48e0b1608a83a3c399f7"
args="ro crashkernel=512M rhgb quiet intermap=on iommu=pt console=ttyS0,115200 console=ttyS1,115200 intel_iommu=on pci=realloc default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=1375 isolcpus=1,3,5,7,9,11,13,17 nohz_full=1,3,5,7,9,11,13,17 rcu_nocbs=1,3,5,7,9,11,13,17"
root="/dev/mapper/bel-root"
initrd="/boot/initramfs-0-rescue-613790481f5a48e0b1608a83a3c399f7.img"
title="BigCloud Enterprise Linux (0-rescue-613790481f5a48e0b1608a83a3c399f7) 8.1 (Core)"
id="613790481f5a48e0b1608a83a3c399f7-0-rescue"

设置新的默认启动内核,方法如下:

#方法一:使用路径来指定内核,可以使用--set-default=kernel-path
[root@localhost ~]# grubby --set-default=/boot/vmlinuz-6.3.0_20230506
The default is /boot/loader/entries/613790481f5a48e0b1608a83a3c399f7-6.3.0_20230506.conf with index 0 and kernel /boot/vmlinuz-6.3.0_20230506
[root@localhost ~]#
[root@localhost ~]# grubby --default-kernel
/boot/vmlinuz-6.3.0_20230506
[root@localhost ~]#

#方法二:使用index来指定内核,则使用--set-default-index=entry-index
[root@localhost ~]# grubby --set-default-index=0
The default is /boot/loader/entries/613790481f5a48e0b1608a83a3c399f7-6.3.0_20230506.conf with index 0 and kernel /boot/vmlinuz-6.3.0_20230506
[root@localhost ~]#
[root@localhost ~]# grubby --default-kernel
/boot/vmlinuz-6.3.0_20230506

重新启动后生效。

grubby是一个用于更新和显示有关各种体系结构特定的引导程序的配置文件信息的命令行工具。它主要设计用于安装新内核并需要查找有关当前引导环境的信息的脚本,同时也可以对启动内核的各项信息参数进行修改。在centos8中使用grubby工具来对系统的内核启动参数和启动顺序进行调整。使用yum或者dnf可以直接安装grubby工具。

八、卸载内核

有时我们在使用pci设备时,可能会发生设备在最新Linux内核版本上无法正常使用的场景。这时就需要切换到低版本的内核,而高版本内核可能需要卸载,下面让我们来看一下如何进行内核卸载。

  • 查看系统当前内核版本
uname -r
  • 查看系统中全部内核
[root@localhost ~]# rpm -qa | grep kernel
kernel-6.3.0_rc7+-1.x86_64
kmod-mlnx-ofa_kernel-5.6-OFED.5.6.2.0.9.1.bclinux8u2.x86_64
kernel-tools-4.19.0-240.23.16.el8_2.bclinux.x86_64
kernel-lt-devel-5.4.240-1.el8.elrepo.x86_64
kernel-bek-modules-5.4.67-300.el8.bclinux.x86_64
kernel-6.2.0_rc5+-28.x86_64
kernel-lt-core-5.4.240-1.el8.elrepo.x86_64
kernel-headers-6.2.0+-1.x86_64
kernel-core-4.19.0-240.23.11.el8_2.bclinux.x86_64
kernel-bek-core-5.4.67-300.el8.bclinux.x86_64
kernel-tools-libs-4.19.0-240.23.16.el8_2.bclinux.x86_64
kernel-devel-6.3.0+-1.x86_64
kernel-lt-5.4.240-1.el8.elrepo.x86_64
mlnx-ofa_kernel-devel-5.6-OFED.5.6.2.0.9.1.bclinux8u2.x86_64
kernel-core-4.19.0-240.23.18.el8_2.bclinux.x86_64
kernel-modules-4.19.0-240.23.11.el8_2.bclinux.x86_64
kernel-lt-modules-5.4.240-1.el8.elrepo.x86_64
kernel-modules-4.19.0-240.23.18.el8_2.bclinux.x86_64
kmod-kernel-mft-mlnx-4.20.0-1.bclinux8u2.x86_64
kernel-6.3.0+-1.x86_64
mlnx-ofa_kernel-5.6-OFED.5.6.2.0.9.1.bclinux8u2.x86_64
  • 删除指定内核

    此处以删除内核的 6.3.0+版本为例

    注意 :无法卸载当前在用的内核版本。

yum remove -y kernel-6.3.0+-1.x86_64
yum remove -y kernel-devel-6.3.0+-1.x86_64

卸载完后不一定需要重启

检查卸载后内核版本

[root@compute2 ~]# rpm -qa | grep kernel
kernel-6.3.0_rc7+-1.x86_64
kmod-mlnx-ofa_kernel-5.6-OFED.5.6.2.0.9.1.bclinux8u2.x86_64
kernel-tools-4.19.0-240.23.16.el8_2.bclinux.x86_64
kernel-lt-devel-5.4.240-1.el8.elrepo.x86_64
kernel-bek-modules-5.4.67-300.el8.bclinux.x86_64
kernel-6.2.0_rc5+-28.x86_64
kernel-lt-core-5.4.240-1.el8.elrepo.x86_64
kernel-headers-6.2.0+-1.x86_64
kernel-core-4.19.0-240.23.11.el8_2.bclinux.x86_64
kernel-bek-core-5.4.67-300.el8.bclinux.x86_64
kernel-tools-libs-4.19.0-240.23.16.el8_2.bclinux.x86_64
kernel-lt-5.4.240-1.el8.elrepo.x86_64
mlnx-ofa_kernel-devel-5.6-OFED.5.6.2.0.9.1.bclinux8u2.x86_64
kernel-core-4.19.0-240.23.18.el8_2.bclinux.x86_64
kernel-modules-4.19.0-240.23.11.el8_2.bclinux.x86_64
kernel-lt-modules-5.4.240-1.el8.elrepo.x86_64
kernel-modules-4.19.0-240.23.18.el8_2.bclinux.x86_64
kmod-kernel-mft-mlnx-4.20.0-1.bclinux8u2.x86_64
mlnx-ofa_kernel-5.6-OFED.5.6.2.0.9.1.bclinux8u2.x86_64

小结

  • .config

    编译内核前所生成的配置文件,用来告诉make需要编译哪些东西
    
  • bzImage, vmlinuz

    bzImage是使用的make命令一起生成的。想要单独生成bzImage,请输入

    make bzImage
    

    bzImage, vmlinuz是完全一样的东西,只是习惯将bzImage放到/boot目录下时重名名为vmlinuz

  • bzImage, zImage

    bzImage是指:big zImage(compressed kernel image) ,zImage和bzImage都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到 低端内存(第一个640K) , bzImage解压缩内核到 高端内存(1M以上) 。如果内核比较小,那么可以采用zImage 或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。

  • vmlinux, vmlinuz

    vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。

  • make modules_install

    安装模块,其实就是将编译的模块复制到/lib/modules/kernel-version/目录下,kernel-version是当前编译的内核的版本号

  • System.map

    内核符号表(Kernel Symbol Table)之一(另一个是/proc/ksyms)
    System.map是文件系统上的一个真实文件。当你编译一个新内核时,你原来的System.map中的符号信息就不正确了。随着每次内核的编译,就会产生一个新的 System.map文件,并且需要用该文件取代原来的文件。/proc/ksyms 是一个 “proc文件” 并且是在内核启动时创建的。实际上它不是一个真实的文件;它只是内核数据的简单表示形式,呈现出象一个磁盘文件似的。
    System.map的作用:

    1.Linux使用了的klogd(内核日志后台程序)可以进行名字-地址之间的解析。一旦klogd开始转换内核消息,它就使用手头的记录器,将整个系统的消息记录下来,通常是使用syslogd记录器。为了进行名字-地址解析,klogd就要用到System.map文件
    2.有一些驱动程序将使用System.map来解析符号(因为它们与内核头连接而非glibc库等),如果没有System.map文件,它们将不能正确地工作。

附录:常用编译命令

1.清理工作目标
make clean: 删除编译中间文件,但是保留配置
make mrproper:删除包括配置文件的所有构建文件  
make distclean:执行mrproper所做的一切,并删除备份文件

2.配置内核  
make menuconfig:文本图形方式配置内核  
make oldconfig:基于当前的.config文件提示更新内核  
make defconfig:生成默认的内核配置  
make allmodconfig:所有的可选的选项构建成模块  
make allyesconfig:生成全部选择是内核配置  
make noconfig:生成全部选择否的内核配置

3.构建内核目标  
make all:构建所有目标  
make bzImage:构建内核映像  
make modules:构建所有驱动  
make dir/:构建指定目录  
make dir/file.[s|o|i]:构建指定文件  
make dir/file.ko:构建指定驱动

4.安装内核  
make install:安装内核  
make modules_install:安装驱动

5.打包工具  
make rpm:生成内核的RMP包  
make rpm-pkg:生成带源码的RPM包  
make binrpm-pkg:生成包含内核和驱动的RMP包  
make deb-pkg:生成包含内核和驱动的debian包

6.生成文档工具  
make xmldocs:生成xml文档  
make pdfdocs:生成pdf文档  
maek htmldocs:生成html文档
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分