使用 Yocto Project 構建自定義嵌入式 Linux 發行版

from:

http://www.ibm.com/developerworks/cn/linux/l-yocto-linux/



簡介: Yocto Project™ 是一個開源項目,設立該項目是爲了使嵌入式 Linux® 開發更簡單,更易於在不同架構間進行移植。本文將介紹該項目並提供如何開始使用該項目的分步指導


概述

Yocto Project 是一個開源協作項目,它提供了一些模板、工具和方法來支持面向嵌入式產品的自定義 Linux 系統,不管硬件架構是什麼。我想要告訴那些對 yocto 這個名稱不甚理解的用戶的是,術語 yocto 是最小的 SI 單元。最爲一個前綴,yocto 表示 10^-24。

本文將提供一個分步指導,向您介紹如何使用 Yocto Project 的行業標準開源工具爲嵌入式設備創建自定義的 Linux 操作系統,並使用 QEMU 在一臺虛擬機中啓動操作系統。Yocto Project 是由大型硬件公司和操作系統供應商資助的、由 Linux 基金會贊助的開源項目,提供了一些行業領先的工具、方法和元數據來構建 Linux 系統。

Yocto Project 的兩大主要組件由 Yocto Project 和 OpenEmbedded 項目一起維護,這兩個組件是 BitBake 和 OpenEmbedded-Core,前者是構建引擎,後者是運行構建過程所使用的一套核心配方 (recipe)。下一節會介紹所有項目組件。

Yocto Project 簡介

作爲一個協作項目,Yocto Project 有時也稱爲 “umbrella” 項目,它吸納了許多不同的開發流程部分。在整個 Yocto Project 中,這些部分被稱爲項目,包括構建工具、稱爲核心配方 的構建指令元數據、庫、實用程序和圖形用戶界面 (GUI)。

Poky

Poky 是 Yocto Project 的一個參考構建系統。它包含 BitBake、OpenEmbedded-Core、一個板卡支持包 (BSP) 以及整合到構建過程中的其他任何程序包或層。Poky 這一名稱也指使用參考構建系統得到的默認 Linux 發行版,它可能極其小 (core-image-minimal),也可能是帶有 GUI 的整個 Linux 系統 (core-image-sato)。

您可以將 Poky 構建系統看作是整個項目的一個參考系統,即運行中進程的一個工作示例。在下載 Yocto Project 時,實際上也下載了可用於構建默認系統的這些工具、實用程序、庫、工具鏈和元數據的實例。這一參考系統以及它創建的參考發行版都被命名爲 Poky。您還可以將此作爲一個起點來創建您自己的發行版,當然,您可以對此發行版隨意命名。

所有構建系統都需要的一個項目是工具鏈:一個編譯器、彙編程序、鏈接器以及爲給定架構創建二進制可執行文件所需的其他二進制實用程序。Poky 使用了 GNU Compiler Collection (GCC),不過您也可以指定其他工具鏈。Poky 使用了一種名爲交叉編譯 的技術:在一個架構上使用工具鏈爲另一個架構構建二進制可執行文件(例如,在基於 x86 的系統上構建 ARM 發行版)。開發人員常常在嵌入式系統開發中使用交叉編譯來利用主機系統的高性能。

元數據集

元數據集按 進行排列,這樣一來每一層都可以爲下面的層提供單獨的功能。基層是 OpenEmbedded-Core 或 oe-core,提供了所有構建項目所必需的常見配方、類和相關功能。然後您可以通過在 oe-core 之上添加新層來定製構建。

OpenEmbedded-Core 由 Yocto Project 和 OpenEmbedded 項目共同維護。將 Yocto Project 與 OpenEmbedded 分開的層是 meta-yocto 層,該層提供了 Poky 發行版配置和一組核心的參考 BSP。

OpenEmbedded 項目本身是一個獨立的開源項目,具有可與 Yocto Project 交換的配方(大部分)以及與 Yocto Project 類似的目標,但是兩者具有不同的治理和範圍。

板卡支持包

BSP 包含爲特定板卡或架構構建 Linux 必備的基本程序包和驅動程序。這通常由生產板卡的硬件製造商加以維護。BSP 是 Linux 操作系統與運行它的硬件之間的接口。注意,您也可以爲虛擬機創建 BSP。

BitBake

BitBake 是一個構建引擎。它讀取配方並通過獲取程序包來密切關注它們、構建它們並將結果納入可引導映像。BitBake 由 Yocto Project 和 OpenEmbedded 項目共同維護。

Hob

爲了讓嵌入式 Linux 開發更容易,Yocto Project 提供了幾種不同的圖形工作方法。項目的一個較新的添加項叫作 Hob,它向 BitBake 和構建過程提供一個圖像前端。兩者的開發工作仍在繼續,包含社區用戶研究。

開源許可證合規性

遵守開源許可證是任何 Linux 開發工作的一個極其重要的部分。Yocto Project 的一個目標是儘可能容易地實現合規性。可以極爲輕鬆地使用 Yocto Project 工具來創建清單(甚至構建整個源存儲庫)和過濾構建過程,用它們排除使用特定許可證的程序包。該項目使用了 Linux 基金會的 “開放遵守計劃” (Open Compliance Program),該計劃包含一個 Software Package Data Exchange® (SPDX™) 規範。

EGLIBC

嵌入式 GLIBC (EGLIBC) 是 GNU C Library (GLIBC) 的一個變體,旨在能夠在嵌入式系統上運行。EGLIBC 的目標包括減少內存佔用、讓組件可配置、更好地支持交叉編譯和交叉測試。EGLIBC 是 Yocto Project 的一部分,但在它自己的治理結構內加以維護。

應用程序開發工具包

應用程序開發工具包 (ADT) 能夠讓系統開發人員爲他們使用 Yocto Project 工具創建的發行版提供軟件開發工具包 (SDK),爲應用程序開發人員提供了一種針對系統開發人員提供的軟件棧進行開發的方法。ADT 包含一個交叉編譯工具鏈、調試和分析工具,以及 QEMU 仿真和支持腳本。ADT 還爲那些喜歡使用集成開發環境 (IDE) 的人提供了一個 Eclipse 插件。

Yocto Project 旗下的其他工具

屬於 Yocto Project 一部分的若干其他工具:

  • Autobuilder:不斷自動構建 Yocto Project 工具,啓用自動化的 Quality Assurance (QA) 活動。
  • Cross-Prelink:爲交叉編譯開發環境提供預鏈接,並改進性能。
  • Pseudo:模擬 root 訪問,是構建可引導最終映像的一個不可或缺的部分。
  • Swabber:檢測交叉編譯版本何時會受到主機組件影響而無法使用。
  • Build Appliance:是一臺運行 Hob 的虛擬機,使那些使用非 Linux 版本主機的人能親眼看到 Yocto Project 進程。(注意:Yocto Project 構建工具目前僅在 Linux 上受支持。)

治理和社區

對於任何開源項目來說,一個重要部分是開發和支持其組件的社區。Yocto Project 有一個活躍社區,部分由組織機構組成,包括硬件製造商、操作系統提供商、工具提供商和電子器件製造商,全方位覆蓋了嵌入式開發,部分由個人組成,其中許多人爲這些組織機構工作。

該項目由有一個首席架構師和一系列維護人員和技術主管(制定所有技術決策)管理。成員組織(很多通常是彼此競爭的)共同協作成立了一個顧問小組,顧名思義,他們的工作是顧問性質的。該小組管理項目資源,包括基礎架構、宣傳、推廣和財務。

構建 Linux 發行版

本節將展示如何使用 Poky(參考構建系統)構建一個基本的嵌入式 Linux 系統。這裏描述的流程構建參考了發行版以及構建該發行版所需的所有工具。如果您願意的話,也可以下載預編譯好的二進制文件,以避免編譯的需要。請閱讀 Yocto Project Quick Start Guide(參見 參考資料),瞭解有關的更多信息。

工具本身僅在 Linux 平臺上受支持,特別是 Ubuntu、Fedora、CentOS 和 openSUSE。注意,雖然這些系統的最新發行版尚未列入受支持之列,但它們通常是支持該工具的,其他許多 Linux 發行版可能也支持該工具。

如果您的主機系統沒有運行 Linux,或者如果您希望不安裝任何東西就能繼續運作,那麼您可以下載 Yocto Project Build Appliance。這臺虛擬機預安裝了最新的官方 Yocto Project 發行版。Build Appliance 可在 VMWare Player 或 VirtualBox 中運行,並直接啓動到 Hob GUI。如果您使用的是 Build Appliance,那麼下面的大部分步驟已經完成,您可以直接跳到 測試插件 Hob 一節。不過,我建議您還是閱讀一下中間部分的內容,以便了解 Hob 在做些什麼。另外,應該閱讀 Yocto Project 網站上的一些 Hob 文檔,參見 參考資料

下載 Yocto Project 工具

使用兩種方法中的任意一種下載 Yocto Project。確保使用一個至少有 50GB 空閒空間的磁盤。建議空閒空間是 100GB。

  • 您可以從 Yocto Project 下載頁面下載最新測試完畢的發行版的一個 tar 文件。下載 tar 文件,然後將其解壓到一個目錄,如 清單 1 所示。

    清單 1. 下載 poky
    						
    $ wget \
    http://downloads.yoctoproject.org/releases/yocto/yocto-1.2/poky-denzil-7.0.tar.bz2
    $ tar xjf poky-denzil-7.0.tar.bz2
    $ cd poky-denzil-7.0
    

  • 您可以使用 git 獲取最新發行版(或任何特定分支),儘管主開發分支可能不如 tar 文件中測試過的發行版穩定。清單 2 顯示瞭如何使用 git 下載最新版本。

    清單 2. 使用 git 獲取 poky
    						
    $ git clone git://git.yoctoproject.org/poky.git
    $ cd poky
    

    注意,本例中的子目錄簡單地使用了 poky 這一名稱,不帶版本號,因爲隨時可以使用 git 更新它。

初始化環境

要初始化您的工作環境,請遵循以下步驟:

  1. 首先,從您的主機系統的軟件庫中選擇並安裝所有必需的開發包。如果已經以前在主機上開發過軟件,那麼有可能已經安裝好了大部分開發包。清單 3456 顯示瞭如何在各種發行版上安裝所需的程序包。



    清單 3. 在 Ubuntu 上安裝必備組件
    						
         $ sudo apt-get install sed wget subversion git-core coreutils \
         unzip texi2html texinfo libsdl1.2-dev docbook-utils fop gawk \
         python-pysqlite2 diffstat make gcc build-essential xsltproc \
         g++ desktop-file-utils chrpath libgl1-mesa-dev libglu1-mesa-dev \
         autoconf automake groff libtool xterm libxml-parser-perl
    



    清單 4. 在 Fedora 上安裝必備組件
    						
         $ sudo yum groupinstall "development tools"
         $ sudo yum install python m4 make wget curl ftp tar bzip2 gzip \
         unzip perl texinfo texi2html diffstat openjade \
         docbook-style-dsssl sed docbook-style-xsl docbook-dtds fop xsltproc \
         docbook-utils sed bc eglibc-devel ccache pcre pcre-devel quilt \
         groff linuxdoc-tools patch cmake \
         perl-ExtUtils-MakeMaker tcl-devel gettext chrpath ncurses apr \
         SDL-devel mesa-libGL-devel mesa-libGLU-devel gnome-doc-utils \
         autoconf automake libtool xterm
    



    清單 5. 在 CentOS 上安裝必備組件
    						
         $ sudo yum -y groupinstall "development tools"
         $ sudo yum -y install tetex gawk sqlite-devel vim-common redhat-lsb xz \
           m4 make wget curl ftp tar bzip2 gzip python-devel \
           unzip perl texinfo texi2html diffstat openjade zlib-devel \
           docbook-style-dsssl sed docbook-style-xsl docbook-dtds \
           docbook-utils bc glibc-devel pcre pcre-devel \
           groff linuxdoc-tools patch cmake \
           tcl-devel gettext ncurses apr \
           SDL-devel mesa-libGL-devel mesa-libGLU-devel gnome-doc-utils \
           autoconf automake libtool xterm
    



    清單 6. 在 openSUSE 上安裝必備組件
    						
         $ sudo zypper install python gcc gcc-c++ libtool fop \
         subversion git chrpath automake make wget xsltproc \
         diffstat texinfo freeglut-devel libSDL-devel
    

  2. 使用所提供的腳本設置您的 shell 環境。運行該腳本之後,您的工作目錄是 build 子目錄,您可以從該位置運行您的版本。

    $ cd poky 
    $ . ./oe-init-build-env
    

  3. 檢查主配置文件 (conf/local.conf)。默認情況下,建立配置文件是爲了創建 qemux86 映像,即模擬 32 位 x86 處理器的一個 QEMU 實例。如果您有一個多處理器主機,強烈建議您取消註釋以下並行性選項來加速編譯。目前暫時將這兩個值設置爲處理器核心數的兩倍(例如,對於一個 4 核處理器,應該將該值設置爲 8)。

    BB_NUMBER_THREADS = "8"
    PARALLEL_MAKE = "-j 8"
    

執行初始構建

初始構建使用主機的編譯器來構建交叉編譯工具鏈和其他任何所需的構建工具。BitBake 還需要下載所有軟件包,因此這可能需要花費一段時間。完成這些下載之後,您可以在 tmp/deploy/images 子目錄中找到生成的映像。


清單 7. 初始構建映像
				
$ ls tmp/deploy/images
bzImage-3.2.11+gi...1.bin
bzImage-qemux86.bin
core-image-minimal-qemux86-20120506194741.rootfs.ext3
core-image-minimal-qemux86-20120506194741.rootfs.tar.bz2
core-image-minimal-qemux86.ext3
core-image-minimal-qemux86.tar.bz2
modules-3.2.11-yocto-standard-r1-qemux86.tgz
README_-_DO_NOT_DELETE_FILES_IN_THIS_DIRECTORY.txt

另外,查看一下 tmp/deploy/IMAGE/license.manifest 中的內容。這是整個映像中使用的所有許可的列表。

啓動新映像

完成構建之後,就可以使用模擬 32 位 x86 處理器的 QEMU 來啓動映像。爲此,只需運行:

$ runqemu qemux86

您可以作爲 root 用戶登錄到機器,無需輸入密碼。祝賀您!您已成功構建了一個嵌入式 Linux 發行版。

您可以對最終映像、組成最終映像的程序包以及進程本身進行許多定製。構建系統是使用 Python 編寫的,具有完整的文檔記錄。

測試插件 Hob

Hob 是幫助自動化前面描述的一些過程的 GUI。Hob 的目標在於讓構建過程更可見且易於理解。實際上,Hob 是一個 BitBake 前端,在 Hob 中可以執行的操作也可以從命令行執行(和腳本化)。不過,Hob 以圖形方式顯示了決策制定過程,描述了哪些程序包會構建到最終映像中。Hob 的一些其他功能包括修改現有映像、將自定義映像保存爲模板、使用 QEMU 運行映像、將映像部署到某個 Universal Serial Bus (USB) 磁盤,以便在目標設備上實時啓動。針對功能性和易用性的其他許多功能目前正在開發中。

要運行 Hob,只需從您的構建目錄輸入 hob,然後主界面會出現。首選選擇一個架構(在本例中是 qemux86),然後 Hob 會解析可用配方,如 圖 1 所示。


圖 1. 圖 1 Hob 映像配置
屏幕截圖顯示了運行中的映像配置界面

然後您可以選擇一個基本映像(前面的示例構建了 core-image-minimal,因此這些二進制文件已經存在)。選擇 core-image-minimal,然後單擊 View recipesView packages圖 2 中的界面顯示了 View packages 中的滾動列表。您可以選擇或取消選擇複選框,以包含程序包或將其移出構建項目。單擊列標題,根據該列進行排序。


圖 2. Hob 包
屏幕截圖顯示了 HOB 中的程序包選擇界面

在 Packages 選項卡上可以注意到,Python 沒有包含在最低版本中。您可以通過選擇 python-2.7.2-r2.14 複選框將其添加進來,如 圖 3 所示。所有依賴項和子包也會立即包含在其中。


圖 3. 在 Hob 中添加程序包
將程序包添加到 HOB 的屏幕截圖

單擊 Build image,Hob 會根據您的選擇構建一個新映像。在構建過程中,您可以查看日誌,瞭解進展如何,或者單擊 Issues 選項卡,看看是否存在任何問題。

然後您可以單擊 Run Image,在 QEMU 仿真器中運行生成的映像,如 圖 4 所示。


圖 4. Hob 映像細節
屏幕截圖顯示了映像細節的 HOB

現在您可以通過檢查確保 Python 已經包含在構建項目中,如 圖 5 所示。


圖 5. 驗證添加成功
屏幕截圖顯示了已成功添加 python 的提示的控制檯

更多信息、教程和視頻可在 Yocto Project 網站(參見 參考資料)上找到。

結束語

瞭解如何有效使用 Yocto Project 工具需要花費一些時間,但這是值得的。工具的靈活工作流、可移植配置和高度的可配置性使我們能夠在構建過程的各個級別進行定製。Yocto Project 代表一個商業工作流,它由專業的嵌入式系統開發人員設計和實現。在撰寫本文之時,幾個操作系統工具製造商正在基於項目調整其產品的方向。試用一下該工具,然後看看效果,如果您喜歡所看到的,那麼就加入社區吧。


參考資料

學習

獲得產品和技術

  • The Yocto Project 網站提供了官方 Yocto Project 文檔、描述性文本、視頻、會議幻燈片、會議記錄和治理信息。

  • The Yocto Project Build Appliance 是不安裝任何軟件查看 Yocto Project 運行的一種好方法。

  • EGLIBC 是 GNU C 庫 GLIBC 的一個變體,旨在能夠在嵌入式系統上運行。EGLIBC 是 Yocto Project 的一部分。

  • 以最適合您的方式 IBM 產品評估試用版軟件:下載產品試用版,在線試用產品,在雲環境下試用產品,或者在 IBM SOA 人員沙箱 中花費幾個小時來學習如何高效實現面向服務的架構。

討論

關於作者

作者照片:Jeffrey Osier-Mixon

Jeff "Jefro" Osier-Mixon 有 20 多年的開源和嵌入式系統方面的從業經驗,擔任過技術作家、開發人員、開放源碼的擁護者和社區管理員,他爲 IBM developerWorks 寫了多篇文章,包括 在 BeagleBoard-xM 上引導 Linux開放硬件:原理及成因。Jeff 目前在英特爾公司擔任 Yocto Project 社區管理員,他通過其 博客 維護了一個開源會議日程表。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章