Linux内核编译生成bzImage的详细方法步骤及错误解决

什么是bzImage

bzImage诚如其名是big image的意思,不是压缩的image。

​ 在网络中,不少服务器采用的是Linux系统。为了进一步提高服务器的性能,可能需要根据特定的硬件及需求重新编译Linux内核。编译Linux 内核,需要根据规定的步骤进行,编译内核过程中涉及到几个重要的文件。编译过RedHat Linux内核的人对其中的System.map、vmlinuz、initrd-2.4.7-10.img印象可能比较深刻,因为编译内核过程中涉及到这些文件的建立等操作。那么这些文件是怎么产生的呢?以vmlinuz为例。

  vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行 的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接。

  vmlinuz的建立有两种方式。一是编译内核时通过“make zImage”创建,手动拷贝到/boot目录下面。zImage适用于小内核的情况,它的存在是为了向后的兼容性。

  二是内核编译时通过命令make bzImage创建,然后手动拷贝至/boot目录下。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起误解,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有 gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。

  内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个 640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage或bzImage之一,两种方式引导的系统运行 时是相同的。大的内核采用bzImage,不能采用zImage。vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。

环境准备

  1. 下载Ubuntu镜像

  2. 安装虚拟机并导入镜像

  3. 下载linux内核

    1.png

虚拟机联网

刚安装的虚拟机及映像可能会产生连不上网的情况。解决办法:

  1. 进入VMware Workstation,编辑->虚拟网络编辑器,将VMnet8设置为NAT模式

    2.png

    W_A3KES@2E2B`_X0MDS_VXH.png

  2. 虚拟机->设置,保证网络适配器配置也为NAT模式

    4.png

winscp的使用

WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端。同时支持 SCP 协议。它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑文件。

5.png

官网下载并安装。若初始连不上虚拟机,则检查远程虚拟机是否安装并开启了ssh服务(下述3.1)

搭建编译环境

  1. 进入root:su

    6.png

  2. 进入用户所在文件夹:cd /home/siqi

  3. 常规配置及网络测试

    1. 虚拟机安装ssh服务

      //检测是否已安装ssh服务,输入以下命令
      #ssh localhost
      //出现以下提示则为未安装: ssh: connect to host localhost port 22: Connection refused (ssh:连接到主机本地主机端口22:连接被拒绝)
      #apt-get install openssh-server
      //启动服务
      #/etc/init.d/ssh start
      //检查服务是否启动成功
      #ps -e|grep ssh
      
    2. winscp连接到虚拟机

      输入主机名为虚拟机ip地址,端口号默认22,输入用户名和密码

      MPK641___Y55__KK0D_@KIE.png

  4. 在虚拟机新建kernel文件夹,并将linux内核解压到当前文件夹

    #cd kernel
    #tar -zxvf linux-5.11-rc1
    
  5. 将内核中的默认x86配置到根目录

    #cd linux-5.11-rc1/arch/x86/configs
    #cp x86_64_deconfig /home/siqi/kernel/linux-5.11-rc1/.config
    #cd ../../../
    
  6. x86编译前准备:如果不执行以下指令,会有“command not found”的错误提示

    #apt-get install make
    #apt-get install gcc
    #apt-get install flex
    #apt-get install bison
    #apt-get install libcurses-dev
    #apt-get install libssl-dev
    #apt-get install libelf-dev
    
  7. 基于文本选单的图形化内核配置:make menuconfig,会在源码的顶层目录下面生成一个.config文件

    可能出现的错误有

    1. 一些安装包没有提前安装上;(根据错误提示依次安装)
    2. 终端窗口太小导致错误;

    正常执行会出现下面的菜单框:选择64-bit kernel并点击save保存

    8.png

    若没有这一步直接进行下一步,则会出现无尽的选择情况(需要不断按回车)

  8. 最后执行make bzImage -j8即可。

  9. 编译完成。找到编译生成的bzImage,拷贝出kernel

    #cd linux-5.11-rc1/arch/x86/boot/
    #ls
    会看到bzImage在这儿啦
    #cp bzImage /home/siqi/
    
  10. 附:arm交叉编译命令

    make distclean ARCH-arm64
    make mrproper ARCH-arm64
    make dtbs ARCH-arm64
    cp arch/arm64/configs/defconfig .config
    cp /home/siqi/ft2000plus_defconfig .config
    make menuconfig ARCH-arm64
    make Image ARCH-arm64 -j8 CROSS_COMPILE-aarch64-none-linux-gnu-
    make uImage ARCH-arm64 -j8 CROSS_COMPILE-aarch64-none-linux-gnu-
    
posted @ 2020-12-29 15:07  似漆  阅读(11703)  评论(0编辑  收藏  举报