linux(1)之build構建系統基礎(一)

Linux(1)之buildroot構建系統(一)

Author:Onceday Date:2023年11月12日

漫漫長路,才剛剛開始…

參考文檔:

  • The Yocto Project
  • Buildroot - Making Embedded Linux Easy

文章目錄

      • Linux(1)之buildroot構建系統(一)
        • 1. 概述
          • 1.1 如Ubuntu等系統如何做到在許多設備上啟動
          • 1.2 不同的CPU特性功能代碼是如何兼容的
          • 1.3 嵌入式設備和通用x86兼容機的區別
          • 1.4 BIOS和UEFI的介紹
          • 1.5 BIOS和UEFI的作用
          • 1.6 設備樹的作用
        • 2. buildroot編譯環境搭建
          • 2.1 必須要安裝的軟件包
          • 2.2 可選的軟件包
          • 2.3 開發環境
          • 2.4 獲取源碼
          • 2.5 生成配置config文件
          • 2.6 編譯流程
          • 2.7 編譯輸出

1. 概述

Buildroot和Yocto是兩種用于嵌入式Linux系統開發的工具,可以構建完整的根文件系統(root filesystem),包括內核、引導加載器和用戶空間應用程序。

Buildroot 是一個簡單、高效的嵌入式Linux系統構建工具,使用Makefile和Kconfig配置系統(與Linux內核相同)。Buildroot是高度可配置的,可以為各種目標板構建精簡的Linux系統。它使用交叉編譯,可以快速生成一個小型的、在目標硬件上運行的Linux系統。

Buildroot提供了大量的包配置,涵蓋了各種庫和應用程序,并且配置和構建過程相對直觀和簡單。它特別適合需要快速迭代并且目標硬件資源有限的項目。

Yocto Project 是一個開源協作項目,為嵌入式Linux開發者提供了創建自定義Linux系統的模板、工具和方法。Yocto使用BitBake工具(一個與Gentoo的Portage類似的構建自動化工具)和OpenEmbedded的元數據。

Yocto提供了更強大的自定義能力,可以創建高度定制的嵌入式Linux系統。它擁有大量的“recipe”(描述如何構建軟件包的指南),并且支持復雜的依賴關系和層次結構。

Buildroot 和 Yocto 的比較

  • 簡單性:Buildroot更簡單,易于學習和使用。Yocto的學習曲線較陡,但提供了更強大的功能和更多的自定義選項。

  • 配置和擴展性:Buildroot使用Kconfig系統,易于配置,并且包管理器簡潔。Yocto使用BitBake和復雜的元數據系統,更適合大型、復雜的項目,需要處理復雜的依賴關系和多層次的軟件包。

  • 社區支持和文檔:Yocto的社區更大,文檔更全面,但是更復雜。Buildroot的社區規模較小,但更易于上手。

  • 構建時間:通常,Buildroot的構建時間比Yocto的短,因為Yocto的構建過程更復雜。

總的來說,Buildroot和Yocto都是強大的工具,適合于嵌入式Linux開發。你應該根據你的具體需求和項目的復雜性來選擇哪一個更適合。對于小型項目和需要快速原型的場合,Buildroot可能是一個更好的選擇。對于需要高度定制和復雜的大型項目,Yocto可能是更好的選擇。

buildroot介紹:

Buildroot is a simple, efficient and easy-to-use tool to generate embedded Linux systems through cross-compilation.

buildroot的特點如下:

  • 可以處理任何事情,Cross-compilation toolchain, root filesystem generation, kernel image compilation and bootloader compilation.】
  • 非常簡單,Thanks to its kernel-like menuconfig, gconfig and xconfig configuration interfaces, building a basic system with Buildroot is easy and typically takes 15-30 minutes.
  • 支持廣泛,X.org stack, Gtk3, Qt 5, GStreamer, Webkit, Kodi, a large number of network-related and system-related utilities are supported.
1.1 如Ubuntu等系統如何做到在許多設備上啟動

Ubuntu和其他許多現代的Linux發行版都能在多種硬件上啟動,這主要得益于以下幾個方面的設計:

  1. 通用內核:Ubuntu使用一個“通用”或“通用”內核,這個內核包含了許多不同硬件設備的驅動。這意味著,只要硬件設備的驅動包含在內核中,Ubuntu就可以在該硬件上運行。

  2. 模塊化的驅動:Linux內核支持模塊化的驅動,這意味著驅動可以在運行時動態加載和卸載,而不需要重新編譯整個內核。這使得Ubuntu能夠根據需要加載特定的硬件驅動。

  3. 設備樹:對于某些類型的設備(特別是很多嵌入式設備),Ubuntu可以使用設備樹來描述硬件。設備樹是一個數據結構,它描述了硬件的布局和配置。雖然Ubuntu的默認內核可能不包含所有可能的設備樹,但用戶可以提供自己的設備樹以支持特定的硬件配置。

  4. UEFI和BIOS:Ubuntu支持UEFI(統一可擴展固件接口)和傳統的BIOS啟動方式。這意味著Ubuntu可以在各種不同的計算機系統上啟動,包括新的基于EFI的系統和老的基于BIOS的系統。

  5. 自動硬件檢測和配置:Ubuntu包含了udev(用戶設備管理器),它可以在啟動時自動檢測和配置硬件。這意味著Ubuntu可以在啟動時動態地適應不同的硬件環境。

綜上所述,Ubuntu的跨硬件兼容性主要是由于它的通用內核、模塊化驅動、設備樹支持、UEFI/BIOS兼容性以及自動硬件檢測和配置的能力。這些特性使得Ubuntu能夠在各種各樣的硬件配置上運行。

1.2 不同的CPU特性功能代碼是如何兼容的

對于核心的CPU特性如內存管理單元(MMU),這些功能通常由內核直接處理,而不是通過驅動程序。這些功能在CPU體系結構的內核代碼中實現,例如在Linux內核源代碼中的arch/目錄下,你可以找到針對各種CPU體系結構(如x86,ARM,MIPS等)的代碼。

這些代碼包含處理MMU和其他核心CPU特性的代碼。例如,對于ARM架構,arch/arm/mm/目錄包含了內存管理相關的代碼,包括MMU的處理。

關于外設,Linux內核包含了大量的設備驅動程序,用于處理各種不同的硬件設備。這些驅動程序通常在內核源代碼的drivers/目錄下。對于一些設備,如網絡接口卡或圖形卡,驅動程序可能來自設備制造商,并被合并到內核中。

對于基本的CPU特性,如MMU,處理這些特性的代碼已經被合并到內核中。對于外設,驅動程序可能也已經被合并到內核中,或者在需要時可以動態加載。

在一些情況下,特定的設備可能需要額外的驅動程序,這些驅動程序可能需要從設備制造商那里獲取,并安裝到系統中。然而,大多數常見的硬件設備都已經有在Linux內核中的驅動程序支持。

1.3 嵌入式設備和通用x86兼容機的區別

比如stm32mp157需要廠家的特殊設備樹文件才能啟動,那為什么通用ubuntu不能啟動,就像樹莓派一樣,ubuntu需要提供特供版本支持。而對于通用x86兼容機,我們很少有這方面的問題,也沒有需要廠家提供設備樹這一說法。

這是一個很好的問題,它涉及到了嵌入式系統與通用PC硬件之間的一些關鍵區別。

在x86兼容的PCs上,硬件的配置和初始化通常由BIOS或UEFI固件完成,內核不需要知道具體的硬件細節。在這種情況下,Linux內核可以使用抽象的、通用的接口(比如ACPI)來與硬件交互。這些接口隱藏了硬件的具體實現,使得同一個內核可以在各種不同的硬件上運行。

然而,在嵌入式系統(如STM32MP157或樹莓派)上,情況就完全不同了。這些系統通常沒有像BIOS或UEFI這樣的固件來進行硬件初始化,也沒有像ACPI這樣的通用接口。相反,Linux內核需要直接與硬件交互,需要知道硬件的具體布局和配置。這就是設備樹在嵌入式Linux中的角色:設備樹描述了硬件的布局和配置,使得內核可以正確地初始化和管理礎。

所以,對于STM32MP157這樣的設備,你需要一個特定的設備樹文件,以告訴內核如何與硬件交互。這就是為什么"通用"的Ubuntu不能在這樣的設備上啟動:通用Ubuntu的內核不知道如何處理這種特定的硬件配置。

對于一些流行的嵌入式硬件(如樹莓派),Ubuntu和其他Linux發行版可能提供了特定的版本,這些版本包含了對這些硬件的支持。這通常涉及到使用一個包含了正確設備樹和其他硬件特定代碼的定制內核。

總的來說,嵌入式硬件的多樣性和復雜性,以及缺少像BIOS或UEFI這樣的硬件抽象,意味著嵌入式Linux需要更多的硬件特定代碼(如設備樹),而這在PC硬件上通常是不需要的。

1.4 BIOS和UEFI的介紹

BIOS(基本輸入輸出系統)UEFI(統一可擴展固件接口) 都是存儲在計算機硬件上的一種軟件,它們負責在計算機啟動時初始化硬件設備,并加載操作系統。

BIOS 是早期的一種固件接口,它存在于計算機主板上的一個特殊的閃存芯片中。BIOS在計算機啟動時運行,執行以下主要任務:

  1. 硬件初始化:BIOS 會檢查并初始化計算機的硬件設備,包括 CPU,內存,鍵盤,鼠標,顯示設備等。
  2. 自檢:BIOS 進行一系列的自檢(POST,Power-On Self Test),以確保硬件設備工作正常。
  3. 引導加載:BIOS 會查找一個可啟動設備(如硬盤,USB驅動或網絡),并從該設備加載操作系統的引導加載程序。

盡管 BIOS 非常可靠并且被廣泛使用,但是它有一些限制,例如它不能直接引導超過 2TB 的硬盤,不支持預引導環境的網絡連接等。

UEFI 是一個現代的固件接口,設計用來取代 BIOS。UEFI 提供了更多的功能和更大的靈活性。UEFI 的主要功能包括:

  1. 硬件初始化和自檢:就像 BIOS 一樣,UEFI 在計算機啟動時檢查并初始化硬件設備,然后執行自檢。
  2. 引導管理:UEFI 有一個更先進的引導管理器,可以支持多個操作系統并從多個設備引導。UEFI 可以直接引導超過 2TB 的硬盤。
  3. 預引導環境:UEFI 提供了一個預引導環境,可以在操作系統加載之前運行其他的程序或驅動。這可以用來進行系統恢復,固件更新,網絡引導等。

UEFI 還支持安全引導(Secure Boot),這是一種技術,可以在引導過程中驗證操作系統的引導加載程序的簽名,以防止惡意軟件的啟動。

總的來說,BIOS 和 UEFI 都是計算機啟動過程中的關鍵部分,它們負責硬件的初始化并加載操作系統。盡管 BIOS 已經被廣泛使用了幾十年,但是現代的計算機系統越來越多地轉向使用 UEFI,由于其提供的更多的功能和靈活性。

1.5 BIOS和UEFI的作用

對于具有BIOS或UEFI的設備,主板的固件(BIOS或UEFI)在引導過程中負責初始化硬件設備,設置內存空間,初始化CPU,檢測硬件配置等。在完成這些任務后,固件將控制權交給操作系統的引導加載程序,引導加載程序再將控制權交給操作系統內核。

在這個過程中,固件通過提供一些標準接口(例如,ACPI)來幫助操作系統內核理解硬件配置。ACPI(Advanced Configuration and Power Interface)是一個開放標準,它定義了操作系統如何發現和配置硬件設備,以及如何管理電源和系統事件。通過ACPI,操作系統可以在不知道具體硬件實現細節的情況下,與硬件設備進行交互。

此外,固件也會初始化各種硬件接口,如USB和PCIe,并將它們設置為一個已知的、標準化的狀態。這就使得操作系統可以使用標準的協議和接口與這些設備進行通信,而不需要知道具體的硬件細節。例如,Linux內核包含了通用的USB和PCIe驅動,這些驅動使用標準協議與設備進行通信。

總的來說,對于具有BIOS或UEFI的設備,固件在系統啟動時進行硬件初始化,然后提供了標準接口(如ACPI)和初始化的硬件設備(如USB和PCIe)供操作系統使用。這就使得操作系統內核可以在不知道具體的硬件細節的情況下,與硬件設備進行交互。這一設計可以增加硬件的兼容性,降低操作系統支持多種硬件的復雜性。

對于傳統的BIOS(基本輸入/輸出系統),它本身并不能直接引導Linux或任何其他操作系統。相反,它會初始化硬件(如CPU、內存和硬盤驅動器),然后尋找一個可引導的設備(如硬盤、CD/DVD或USB存儲設備)并運行存儲在其中的引導加載程序的第一階段。

這個引導加載程序通常是像GRUB(GRand Unified Bootloader)這樣的工具,用于Linux系統。引導加載程序然后將內核加載到內存中并開始運行。內核接著會繼續初始化系統并啟動操作系統。

然而,UEFI(統一可擴展固件接口),這是現代的BIOS替代品,可以直接加載和執行Linux內核,前提是內核已構建了EFI引導存根支持。它通過一個名為EFI系統分區(ESP)的機制來實現,ESP是硬盤上的一個特殊分區,用來保存EFI兼容的引導加載器和內核映像。這就是UEFI比傳統BIOS更靈活、更強大的部分原因。

這只是引導過程的高級概述。具體的細節可能會更復雜,并且可能會根據具體的硬件和軟件配置而變化。

1.6 設備樹的作用

在Linux中,設備樹(Device Tree,DT)是一種數據結構,用于描述非自發現硬件的信息。自發現硬件,如USB或PCI設備,可以在運行時被系統自動檢測和配置。相反,許多嵌入式系統的硬件設備需要在引導時被明確地配置。

在引導過程中,引導加載器將設備樹傳遞給Linux內核。設備樹包含了有關系統硬件的信息,如設備的內存映射、中斷號和引腳配置。內核使用這些信息來正確地配置和初始化硬件設備。

設備樹允許單個Linux內核映像在多個硬件配置上運行。例如,兩個不同的嵌入式板可能使用相同的處理器,但具有不同的內存大小、I/O引腳配置和連接的外設。通過使用不同的設備樹,相同的內核映像可以在這兩個板上運行。

設備樹是以一種稱為設備樹源(Device Tree Source,DTS)的格式編寫的,然后被編譯成設備樹二進制(Device Tree Binary,DTB)形式,以便引導加載器和內核使用。設備樹源文件通常按照硬件平臺或板級規格進行組織,可以通過包含和覆蓋技術來共享公共定義,這樣可以減少重復的工作并提高可維護性。

總的來說,設備樹在Linux系統中起著至關重要的作用,特別是在嵌入式系統中。通過描述硬件配置,它使得單個內核映像能夠在多種硬件平臺上運行。

2. buildroot編譯環境搭建

Buildroot可以在Linux系統上運行。雖然Buildroot自己將構建它進行編譯所需的大多數主機包,但某些標準的Linux實用程序預計已經安裝在主機系統上。下面是強制性包和可選包的概述(請注意,包名可能在不同的發行版中有所不同)。

2.1 必須要安裝的軟件包

以下是必備的各種構建工具的簡要介紹:

  1. which: which 是一個在Unix和Unix-like操作系統中用于定位可執行文件的實用程序。它會在系統的PATH環境變量中定義的目錄中查找文件。

  2. sed: sed 是一個流式文本編輯器,用于在命令行中處理和轉換文本。它可以非交互地執行文本替換,刪除和其他操作。

  3. make: make 是一種用于編譯和構建項目的工具,它讀取名為 Makefile 的文件,該文件描述了如何構建一個或多個目標。(version 3.81 or any later)

  4. binutils: binutils 是GNU項目的一部分,包含一組二進制工具,如 ld (鏈接器)、as (匯編器)、objdump (顯示二進制信息)等。

  5. build-essential: build-essential 是Debian和Ubuntu等Linux發行版提供的一個軟件包,包含編譯和安裝軟件所必需的一些基本的工具,如 makegcc 等。

  6. diffutils: diffutils 是一個包含 diffdiff3sdiffcmp 等工具的軟件包,用于比較文件和目錄。

  7. gcc: gcc 是GNU編譯器套裝(GNU Compiler Collection)的簡寫,是一種開源的編譯器,可以編譯C、C++、Java等多種語言。(version 4.8 or any later)

  8. g++: g++ 是GNU C++編譯器的命令行接口,它是gcc的一部分,用于編譯C++代碼。(version 4.8 or any later)

  9. bash: bash 是一個Unix shell,由GNU項目開發。它是Bourne shell的替代品,支持命令行編輯,shell函數,shell變量等。

  10. patch: patch 是一個Unix工具,用于將由diff生成的差異應用到一個或多個原始文件中,從而更新或創建文件。

  11. gzip: gzip 是一個在Unix和Unix-like系統上用于文件壓縮的工具。

  12. bzip2: bzip2 是一個開源的數據壓縮工具,它通常提供比gzip更高的壓縮率,但壓縮和解壓速度較慢。

  13. perl: perl 是一種高級、通用、解釋型、動態的編程語言。在系統管理,網絡編程,GUI開發和更多其他領域中被廣泛使用。(version 5.8.7 or any later)

  14. tar: tar 是一個在Unix和Unix-like系統上用于文件歸檔的工具,它可以將多個文件和目錄組合成一個歸檔文件。

  15. cpio: cpio 是一個在Unix和Unix-like系統上用于創建和提取歸檔文件的工具。

  16. unzip: unzip 是一個在Unix和Unix-like系統上用于解壓縮ZIP文件的工具。

  17. rsync: rsync 是一個在Unix和Unix-like系統上用于同步文件和目錄的工具,它可以在本地或者兩臺計算機之間復制和同步文件。

  18. file: file 是一個在Unix和Unix-like系統上用于確定文件類型的工具。(must be in /usr/bin/file)

  19. bc: bc 是一種命令行計算器程序,它支持任意精度的算術運算和許多其他數學函數。

  20. findutils: findutils 是一個包含 findxargs 等工具的軟件包,用于在文件系統中搜索和處理文件。

  21. wget: wget 是一個自由的,非交互的網絡下載器。它在Unix和類Unix系統(例如 Linux,BSD,macOS)中廣泛使用,用于從網絡上下載文件。wget 支持通過HTTP,HTTPS和FTP協議下載,并能夠遞歸地下載整個網站或者任何HTTP或FTP服務。

2.2 可選的軟件包

(1) Python支持,Buildroot中的一些特性或實用程序,如法律信息或圖形生成工具,有額外的依賴關系。

(2) 配置接口工具,在許多Linux發行版中,運行時庫(runtime libraries)和開發庫(development libraries)通常會被分別打包。運行時庫包含了程序運行所需的共享庫,而開發庫包含了額外的頭文件、靜態庫等,用于編譯使用到這些庫的新程序。開發包通常以 -dev-devel 為后綴。包含以下配置接口工具:

  • ncurses5: 這是一個控制臺界面庫,它允許程序員在沒有鼠標的情況下在文本模式下創建用戶接口。這是許多經典的文本模式工具(如菜單配置)的基礎。
  • qt5: 這是一個廣泛使用的跨平臺應用框架,它用于創建具有圖形用戶界面的應用程序。對于xconfig界面,qt5提供了豐富的圖形用戶界面組件和功能。
  • glib2, gtk2, glade2: 這些是用于創建圖形用戶界面的庫和工具。GLib是一組低級別的程序庫,包括數據結構、輸入/輸出和字符串處理函數。GTK(GIMP Toolkit)是一個用于創建圖形用戶界面的庫,而Glade是一個GTK+用戶界面設計工具。對于gconfig界面,這些庫提供了創建和管理窗口、按鈕、滑塊等圖形元素的方法。

(3) 源碼拉取工具,一般情況下wget就夠用,但是也支持版本控制工具和一些同步工具,如下:

  • Bazaar: Bazaar是一種分布式版本控制系統,它易于使用并且靈活。它使得開發者可以在無需服務器的情況下進行協作,也可以輕松地與其他版本控制系統一起使用。
  • CVS (Concurrent Versions System): CVS是一種舊的中心化版本控制系統。盡管其已被更現代的工具(如Git和Mercurial)所取代,但在某些舊的項目中仍可能會遇到。
  • Git: Git是當前最流行的分布式版本控制系統,由Linux內核的創建者Linus Torvalds開發。它提供了高效的本地分支和合并策略,使得開發者可以輕松地進行并行開發。
  • Mercurial: Mercurial是一個易于學習和使用的分布式版本控制工具。它的設計目標是處理大型項目,并提供高度的性能和可靠性。
  • rsync: rsync是一個用于同步文件和目錄的工具,可以在本地或者通過網絡進行操作。它使用了一種高效的算法來僅傳輸文件中發生變化的部分。
  • scp (Secure Copy): scp是一個基于SSH的命令行工具,用于在本地和遠程主機之間安全地復制文件。
  • sftp (SSH File Transfer Protocol): sftp是一個安全的文件傳輸協議,它使用SSH來加密所有傳輸的數據。它提供了一個交互式的接口,開發者可以用該接口瀏覽遠程文件系統并進行文件操作。
  • Subversion (svn): Subversion是一個中心化的版本控制系統,它提供了比CVS更強大和靈活的功能,包括版本化的文件和目錄重命名。盡管其已被許多開發者用Git替代,但在許多企業和大型項目中仍然廣泛使用。

(4) Java相關的包:

  • javac編譯器: javac 是 Java 的官方編譯器,用于將Java源代碼編譯成Java字節代碼,字節代碼可以運行在Java虛擬機(JVM)上。
  • jar工具: jar 是Java的歸檔工具,用于打包和解壓Java類文件、元數據和資源文件到一個JAR文件。

(5) 文檔生成工具:

  • asciidoc: Asciidoc是一個用于編寫文檔和演示的文本文檔格式,它易于閱讀并且可以轉換為多種格式,包括HTML、PDF和EPUB。版本8.6.3及以上被需要。
  • w3m: w3m是一個文本模式的web瀏覽器,也可以用作HTML轉文本的工具。
  • python的argparse模塊: argparse模塊是Python的一個標準庫,用于編寫命令行解析器。它在Python 2.7+和3.2+中默認存在。
  • dblatex: dblatex是一個將DocBook格式轉換為LaTeX,然后再轉換為PDF的工具。它僅在需要生成PDF手冊時才需要。

(6) 圖形生成工具:

  • graphviz: Graphviz是一個開源的圖形可視化軟件,用于在應用程序中表示結構信息。graph-depends<pkg>-graph-depends工具使用它來生成依賴圖。
  • python-matplotlib: Matplotlib是一個Python繪圖庫,用于生成各種靜態、動態、交互式的圖表。graph-build工具使用它來生成構建圖。
2.3 開發環境

可以直接用Vagrant搭建虛擬開發環境。Buildroot源代碼樹中的support/misc/Vagrantfile提供了一個Vagrantfile,可以快速設置一個帶有所需依賴項的虛擬機,以便開始使用。

Vagrantfile 是 Vagrant 項目的核心組成部分。Vagrant 是一個用于構建和管理虛擬機環境的工具,特別適用于開發和測試。Vagrantfile 是一個描述 Vagrant 環境配置的文本文件,它是由 Ruby 語言編寫的。

Vagrantfile 中,你可以設置許多參數,包括:

  • 虛擬機的基礎鏡像(box)
  • 網絡設置,如端口映射、私有網絡、公共網絡等
  • 共享文件夾設置
  • 啟動虛擬機后需要執行的自動化腳本(provisioning scripts)
  • 虛擬機的硬件配置,如 CPU、內存大小等

一個基本的 Vagrantfile 示例如下:

Vagrant.configure("2") do |config|config.vm.box = "hashicorp/precise64"config.vm.network "forwarded_port", guest: 80, host: 8080config.vm.synced_folder "../data", "/vagrant_data"config.vm.provider "virtualbox" do |vb|vb.memory = "1024"end
end

上述 Vagrantfile 做了以下配置:

  • 使用名為 “hashicorp/precise64” 的 box 作為虛擬機的基礎鏡像
  • 將虛擬機的80端口映射到宿主機的8080端口
  • 將宿主機的 “…/data” 目錄映射到虛擬機的 “/vagrant_data” 目錄
  • 設置虛擬機的內存為1024MB

Vagrant 的目標是通過 Vagrantfile 提供一致的,可移植的,易于使用的開發環境。一旦設置好 Vagrantfile,其他開發人員只需要運行 vagrant up 就可以啟動和配置完全相同的虛擬機環境。

如果你想在Linux或Mac Os X上設置一個隔離的Buildroot環境,請在你的終端上粘貼這行代碼:

curl -O https://buildroot.org/downloads/Vagrantfile; vagrant up

如果你在Windows上,把這個粘貼到你的powershell:

(new-object System.Net.WebClient).DownloadFile(
"https://buildroot.org/downloads/Vagrantfile","Vagrantfile");
vagrant up

如果你想跟蹤開發,你可以使用每日快照或者克隆Git倉庫。

Buildroot每三個月發布一次,分別在2月、5月、8月和11月。發布編號的格式為 YYYY.MM,發布的tar包可以在 http://buildroot.org/downloads/ 獲取。

2.4 獲取源碼

一般而言,只需在普通用戶權限下編譯即可,不需要在root權限,這樣也能保護Linux環境不被破壞

首先下載源碼,直接從gitlab上面下載源碼,然后切換到對應分支:

onceday->buildroot:$ git clone https://gitlab.com/buildroot.org/buildroot.git
Cloning into 'buildroot'...
remote: Enumerating objects: 524162, done.
remote: Counting objects: 100% (255/255), done.
remote: Compressing objects: 100% (151/151), done.
remote: Total 524162 (delta 110), reused 229 (delta 103), pack-reused 523907
Receiving objects: 100% (524162/524162), 123.46 MiB | 2.21 MiB/s, done.
Resolving deltas: 100% (372434/372434), done.
onceday->buildroot:$ git checkout 2023.05
Note: switching to '2023.05'.
2.5 生成配置config文件

make menuconfig, make nconfig, make xconfig, 和 make gconfig 是 Linux 內核源代碼編譯時常用的配置命令,用于配置內核的功能選項。它們都是用來創建 .config 文件的,這個文件定義了要在內核中包含哪些模塊和功能。

這些命令的主要區別在于它們的用戶界面和依賴庫的不同:

make menuconfig: 這個命令提供了一個基于文本的菜單驅動的用戶界面,允許用戶在不同的配置選項中導航和選擇。它依賴于 ncurses 庫。

make nconfig: 這個命令提供了一個改進版的基于文本的用戶界面,具有更強的導航和搜索功能。它也依賴于 ncurses 庫。

make xconfig: 這個命令提供了一個基于圖形的用戶界面,允許用戶在不同的配置選項中使用鼠標導航和選擇。它依賴于 Qt 庫。

make gconfig: 這個命令也提供了一個基于圖形的用戶界面,但它依賴于 GTK+ 庫。

所以你可以根據你的環境和需求選擇適合的命令。例如,如果你在沒有圖形界面的服務器上,你可能會選擇 make menuconfig 或 make nconfig。如果你在具有圖形界面的桌面環境上,你可能會選擇 make xconfig 或 make gconfig,以便利用鼠標和圖形界面提供的更直觀的交互。

無論你選擇哪個命令,都會生成一個 .config 文件,這個文件將會被用于驅動內核的編譯過程。

在ubuntu上,可以分別按照對應的支持庫:

  • sudo apt install libncurses-dev,可以滿足menuconfig和nconfig。
  • sudo apt-get install libgtk2.0-dev libglib2.0-dev libglade2-dev,滿足gconfig。
  • sudo apt-get install qtbase5-dev,安裝QT5,支持xconfig。
2.6 編譯流程

開始全部編譯流程很簡單,直接輸入make命令即可。也可以使用make help查看幫助信息,如下:

Cleaning:clean                  - delete all files created by builddistclean              - delete all non-source files (including .config)Build:all                    - make worldtoolchain              - build toolchainsdk                    - build relocatable SDKConfiguration:menuconfig             - interactive curses-based configuratornconfig                - interactive ncurses-based configuratorxconfig                - interactive Qt-based configuratorgconfig                - interactive GTK-based configuratoroldconfig              - resolve any unresolved symbols in .configsyncconfig             - Same as oldconfig, but quietly, additionally update depsolddefconfig           - Same as syncconfig but sets new symbols to their default valuerandconfig             - New config with random answer to all optionsdefconfig              - New config with default answer to all options;BR2_DEFCONFIG, if set on the command line, is used as inputsavedefconfig          - Save current config to BR2_DEFCONFIG (minimal config)update-defconfig       - Same as savedefconfigallyesconfig           - New config where all options are accepted with yesallnoconfig            - New config where all options are answered with noalldefconfig           - New config where all options are set to defaultrandpackageconfig      - New config with random answer to package optionsallyespackageconfig    - New config where pkg options are accepted with yesallnopackageconfig     - New config where package options are answered with noPackage-specific:<pkg>                  - Build and install <pkg> and all its dependencies<pkg>-source           - Only download the source files for <pkg><pkg>-extract          - Extract <pkg> sources<pkg>-patch            - Apply patches to <pkg><pkg>-depends          - Build <pkg>'s dependencies<pkg>-configure        - Build <pkg> up to the configure step<pkg>-build            - Build <pkg> up to the build step<pkg>-show-info        - generate info about <pkg>, as a JSON blurb<pkg>-show-depends     - List packages on which <pkg> depends<pkg>-show-rdepends    - List packages which have <pkg> as a dependency<pkg>-show-recursive-depends- Recursively list packages on which <pkg> depends<pkg>-show-recursive-rdepends- Recursively list packages which have <pkg> as a dependency<pkg>-graph-depends    - Generate a graph of <pkg>'s dependencies<pkg>-graph-rdepends   - Generate a graph of <pkg>'s reverse dependencies<pkg>-dirclean         - Remove <pkg> build directory<pkg>-reconfigure      - Restart the build from the configure step<pkg>-rebuild          - Restart the build from the build step<pkg>-reinstall        - Restart the build from the install stepDocumentation:manual                 - build manual in all formatsmanual-html            - build manual in HTMLmanual-split-html      - build manual in split HTMLmanual-pdf             - build manual in PDFmanual-text            - build manual in textmanual-epub            - build manual in ePubgraph-build            - generate graphs of the build timesgraph-depends          - generate graph of the dependency treegraph-size             - generate stats of the filesystem sizelist-defconfigs        - list all defconfigs (pre-configured minimal systems)Miscellaneous:source                 - download all sources needed for offline-buildexternal-deps          - list external packages usedlegal-info             - generate info about license complianceshow-info              - generate info about packages, as a JSON blurbpkg-stats              - generate info about packages as JSON and HTMLprintvars              - dump internal variables selected with VARS=...show-vars              - dump all internal variables as a JSON blurb; use VARS=...to limit the list to variables names matching that patternmake V=0|1             - 0 => quiet build (default), 1 => verbose buildmake O=dir             - Locate all output files in "dir", including .configFor further details, see README, generate the Buildroot manual, or consult
it on-line at http://buildroot.org/docs.html

默認情況下,buildroot不支持頂層級別的并行編譯,make -jN并無必要,不過存在一個實驗性質的功能,用于支持并行構建

通常,Make編譯流程執行以下步驟:

  1. 下載源代碼(如果需要的話),可通過指定不同獲取方式,wget、git、svn、rsync等等。
  2. 配置、編譯、安裝交叉工具鏈,或者簡單的導入一個外部的工具鏈。
  3. 配置、編譯、安裝指定的目標軟件包。
  4. 可選編譯一個內核鏡像包。
  5. 可選編譯一個bootloader鏡像包。
  6. 創建一個指定格式的根文件系統。
2.7 編譯輸出

Buildroot輸出存儲在單個目錄下面output/,即默認的輸出目錄,包括數個子目錄

  • images/用于存儲所有的放在目標系統上面的文件,包括內核鏡像、bootloader。根文件系統鏡像等等。
  • build/用于存儲所有編譯之后的組件包,包括buildroot用于host的編譯輸出以及目標設備上的編譯輸出文件。對于每個組件包,都有一個單獨的子目錄文件夾一一對應。
  • Host/包含為主機構建的工具和目標工具鏈的根目錄sysroot。前者用于安裝主機編譯的工具,這些工具是正確執行Buildroot所需的,包括交叉編譯工具鏈。后者是一個類似于根文件系統層次結構的目錄。它包含所有用戶空間包的頭文件和庫,這些包提供和安裝其他包使用的庫。然而,這個目錄并不打算作為目標的根文件系統:它包含許多開發文件、未剝離的二進制文件和庫,這些文件對于嵌入式系統來說太大了。這些開發文件用于為依賴于其他庫的目標編譯庫和應用程序
  • staging/一個鏈接到host/目錄里目標工具鏈根目錄sysroot的符號鏈接,用于保持舊版本的兼容性。
  • target/包含編譯目標的幾乎完整的根文件系統:除了/dev/中的設備文件(Buildroot不能創建它們,因為Buildroot不以root身份運行,也不想以root身份運行)。此外,它沒有正確的權限(例如,busybox二進制文件的setuid)。因此,不應該在你的編譯目標上使用該目錄。相反,您應該使用images/目錄中構建的映像之一。如果需要根文件系統的提取映像以便通過NFS引導,那么可以使用images/中生成的tarball映像,并將其作為根提取。staging/相比,target/只包含運行所選目標應用程序所需的文件和庫:開發文件(頭文件等)不存在,二進制文件被剝離

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165925.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165925.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165925.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

企業數字化轉型轉什么?怎么轉?這份攻略請收好

目錄 -01-數字化轉型“是什么” -02-數據驅動推動企業數字化轉型 -03-企業數字化轉型的行動路線圖 數字化轉型&#xff0c;轉什么&#xff1f;怎么轉&#xff1f;這些問題仍在困擾不少企業&#xff0c;也是每個企業轉型升級不得不思考的重要問題。對此&#xff0c;中關村數字…

Python潮流周刊#1:如何系統地自學Python?

這里記錄每周值得分享的 Python 及通用技術內容&#xff0c;部分內容為英文&#xff0c;已在小標題注明。&#xff08;本期標題取自其中一則分享&#xff0c;不代表全部內容都是該主題&#xff0c;特此聲明。&#xff09; 文章&教程 1、編程語言的錯誤處理模式 文章討論…

requests請求django接口跨域問題處理

參考&#xff1a; https://zhuanlan.zhihu.com/p/416978320 https://blog.csdn.net/SweetHeartHuaZai/article/details/130983179 使用httpx代替requests import httpxheaders {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.3…

銷售為什么會選擇使用電銷這種方式 ?

在網絡經濟時代的大環境下&#xff0c;網絡營銷作為一種新型營銷模式和營銷理念&#xff0c;已經搶占了大部分市場。 網絡營銷&#xff0c;是指利用互聯網技術和現代信息技術&#xff0c;以及社交媒體平臺&#xff0c;進行產品宣傳、銷售、服務、品牌傳播等活動的一種營銷模式。…

MySQL-進階

存儲引擎 MySQL體系結構 連接層&#xff1a; 最上層是一些客戶端和連接服務&#xff0c;主要完成一些類似于連接處理、授權認證、及相關的安全方案。服務器也會為安全接入的每個客戶端驗證它所具有的操作權限。服務層&#xff1a; 第二層架構主要完成大多數的核心服務功能&…

財報解讀:三季度的美國零售,“沃爾瑪效應”仍在持續

經濟學中常用“沃爾瑪效應”來指代“消費者減少消費時&#xff0c;會選擇每種類別中價格最低的商品”這一現象。作為全球最大的零售商&#xff0c;沃爾瑪一定程度上成為了消費市場的風向標。 近日&#xff0c;沃爾瑪發布的2024財年第三季度財報顯示&#xff0c;其相較去年同期…

虛擬機(Linux)系統知識普及:什么是Linux發行版 以及各發行版的區別

什么是Linux發行版 以及各發行版的區別 一. 什么是linux發行版簡單來說正式定義區別資料1區別資料2區別資料3區別資料4注意事項二. Linux發行版:CentOS、Ubuntu、RedHat、Android、Tizen、MeeGoLinux 發行版:RedhatDebianUbuntuGentooFreeBSD

22款奔馳S400L升級主動式氛圍燈 光影彰顯奔馳的完美

新款奔馳S級原車自帶64色氛圍燈&#xff0c;還可以升級原廠的主動式氛圍燈&#xff0c;增加車內的氛圍效果。主動式環境氛圍燈包含263個LED光源&#xff0c;每隔1.6厘米就有一個LED光源&#xff0c;照明效果較過去明亮10倍&#xff0c;視覺效果更加絢麗&#xff0c;它還可結合智…

Python中的下劃線使用教程:單下劃線、雙下劃線和頭尾雙下劃線詳解

概要 Python是一種簡單、易學、功能強大的編程語言&#xff0c;被廣泛應用于各種領域。在Python中&#xff0c;下劃線的使用有其特殊的含義和用途。本文將詳細介紹Python中的單下劃線、雙下劃線和頭尾雙下劃線的使用教程&#xff0c;幫助讀者更好地理解和應用這些特性。 一、單…

干貨!ERP軟件如何幫助企業實現信息化管理?

ERP即企業資源規劃&#xff08;Enterprise Resource Planning&#xff09;系統&#xff0c;其核心是物料的追蹤流轉。而在物料追蹤流轉的基礎上&#xff0c;又衍生出一系列各類資源計劃的管理和追蹤。因此ERP發展成為一款集成各類資源計劃&#xff0c;也就是集成企業核心業務流…

化學氣相沉積(CVD)中的TEOS

在半導體制程中&#xff0c;薄膜的沉積是核心的步驟之一&#xff0c;有接觸過CVD的小伙伴應該或多或少聽過TEOS這種物質&#xff0c;TEOS作為一種重要的沉積源&#xff0c;尤其在低溫氧化硅的生成過程中&#xff0c;發揮了無可替代的角色。今天我們就來聊聊這種物質。 什么是TE…

ES開啟安全認證

elasticsearch開啟安全認證步驟 1.創建證書 進入到es主目錄下執行 ./bin/elasticsearch-certutil ca Elasticsearch開啟安全認證詳細步驟 第一個證書名稱默認&#xff0c;直接回車 第二個輸入密碼&#xff0c;直接回車 完成后會生成一個文件&#xff1a;elastic-stack-ca.p12…

創新研報|順應全球數字化,能源企業以“雙碳”為目標的轉型迫在眉睫

能源行業現狀及痛點分析 挑戰一&#xff1a;數字感知能力較弱 挑戰二&#xff1a;與業務的融合度低 挑戰三&#xff1a;決策響應速度滯后 挑戰四&#xff1a;價值創造有待提升 挑戰五&#xff1a;安全風險如影隨形 能源數字化轉型定義及架構 能源行業數字化轉型體系大體…

windows電腦定時開關機設置

設置流程 右擊【此電腦】>【管理】 【任務計劃程序】>【創建基本任務】 gina 命令 查看 已經添加的定時任務從哪看&#xff1f;這里&#xff1a; 往下滑啦&#xff0c;看你剛才添加的任務&#xff1a;

2015年8月19日 Go生態洞察:Go 1.5版本發布

&#x1f337;&#x1f341; 博主貓頭虎&#xff08;&#x1f405;&#x1f43e;&#xff09;帶您 Go to New World?&#x1f341; &#x1f984; 博客首頁——&#x1f405;&#x1f43e;貓頭虎的博客&#x1f390; &#x1f433; 《面試題大全專欄》 &#x1f995; 文章圖文…

C++學習之路(二)C++如何實現一個超簡單的學生信息管理系統?C++示例和小項目實例

這個示例實現了一個簡單的學生信息管理系統。它包括了學生類的定義&#xff0c;可以添加學生信息、顯示所有學生信息&#xff0c;將學生信息保存到文件并從文件加載信息。通過這個示例&#xff0c;你可以了解到如何使用類、函數和文件操作來構建一個基本的信息管理系統。 一個簡…

【數據結構/C++】棧和隊列_鏈隊列

#include <iostream> using namespace std; // 鏈隊列 typedef int ElemType; typedef struct LinkNode {ElemType data;struct LinkNode *next; } LinkNode; typedef struct {LinkNode *front, *rear; } LinkQueue; // 初始化 void InitQueue(LinkQueue &Q) {Q.fron…

【Unity實戰】零代碼實現物理2d繩子和繩橋效果——Hinge Joint 2D的使用

文章目錄 最終效果前言一、繩子1. 方法一簡單的實現問題&#xff0c;當我們想移動它時&#xff0c;所有節點就都斷開了 2. 方法二精靈骨骼編輯使用精靈骨骼簡單制作繩子效果限制每個節點旋轉角度更大的質量添加穩定性 二、繩橋補充參考完結 最終效果 前言 本文使用Hinge Joint…

使用ListenableFuture進行異步任務執行并進行線程切換

文章目錄 一、前言二、關鍵代碼三、參考鏈接 一、前言 在程序中會經常需要做一些異步任務&#xff0c;但是由于部分操作其實很簡單&#xff0c;僅僅是短暫的進行異步操作&#xff0c;然后在結果成功或失敗的時候切換回主線程進行下一步處理&#xff0c;這期間不能阻塞主線程。…

被動接受需求

以下所說的運維是指傳統運維&#xff0c;比如集成項目&#xff0c;軟件實施駐場運維這類。 1. 主動一點困難多一點體驗多一點 我作為駐場運維人員&#xff0c;我大多數時候都在被動的等待、被迫接受需求。 這種方式 好處是 有時候有空閑的時間。 壞處是 干著干著不僅是把系統…