概述
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 工具
使 用兩種方法中的任意一種下載 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 更新它。
初始化環境
要初始化您的工作環境,請遵循以下步驟:
首先 ,從您的主機系統的軟件庫中選擇並安裝所有必需的開發包。如果已經以前在主機上開發過軟件,那麼 有可能已經安裝好了大部分開發包。清單 3、4、5 和 6 顯示了如何在各種發行版上安裝所需的程序包 。
清單 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
使用所提供的腳本設置您的 shell 環境。運行該腳本之後,您的工作目錄是 build 子目錄,您可以 從該位置運行您的版本。
$ cd poky $ . ./oe-init-build-env
檢查主配置文件 (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 recipes 或 View packages。圖 2 中的界面顯示了 View packages 中的滾動 列表。您可以選擇或取消選擇復選框,以包含程序包或將其移出構建項目。單擊列標題,根據該列進行 排序。
圖 2. Hob 包
 
在 Packages 選項卡上可以注 意到,Python 沒有包含在最低版本中。您可以通過選擇 python-2.7.2-r2.14 復選框將其添加進來,如 圖 3 所示。所有依賴項和子包也會立即包含在其中。
圖 3. 在 Hob 中添加程序包
單擊 Build image,Hob 會根據您的選擇構建一個新映像。在構建過程中,您可以查看日志,了解進展 如何,或者單擊 Issues 選項卡,看看是否存在任何問題。
然後您可以單擊 Run Image,在 QEMU 仿真器中運行生成的映像,如 圖 4 所示。
圖 4. Hob 映像細節
現在您可以通過檢查確保 Python 已經包含在構建項目中,如 圖 5 所示。
圖 5. 驗證添加成功
結束語
了解如何有效使用 Yocto Project 工具需要花費一些時間,但這是值得的。工具的靈 活工作流、可移植配置和高度的可配置性使我們能夠在構建過程的各個級別進行定制。Yocto Project 代表一個商業工作流,它由專業的嵌入式系統開發人員設計和實現。在撰寫本文之時,幾個操作系統工 具制造商正在基於項目調整其產品的方向。試用一下該工具,然後看看效果,如果您喜歡所看到的,那 麼就加入社區吧。