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-
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM