天天看點

【i.MX8 Linux】建構 i.MX8 Yocto Project 映像

本文所使用的建構主機是 i5 四核 8GB 記憶體的 Ubuntu 20.04,建構目标系統為 Linux 5.4 版本(Yocto 3.0 Zeus)。官方建議在 Ubuntu 18.04 上操作,不過實測都 OK!

Tips:本文主要介紹建構 i.MX8 Yocto Project 映像的步驟,限于篇幅不能詳細介紹 Yocto 和 BitBake 等工具的詳細用法,關于 Yocto 的更多介紹請參見我的另一個專欄《​​Yocto 最佳實踐​​》。

Yocto 概述

什麼是 Yocto

Yocto Project 起源于一群年輕人想給他們自己的 PDA 編寫一個作業系統,當時沒有一家公司給 PDA 編寫作業系統,于是這些人便想自己寫一個。他們采用了 Linux Gentoo 桌面的幾個工具,尤其是采用了編譯工具 bitbake。剛開始 bitbake 和中繼資料是打包在一起的,但幾年後 bitbake 從中繼資料中分離出來,形成了現在的 OpenEmbedded。當時有些公司采用了 OpenEmbedded 作為他們的工具,但大多數的嵌入式系統廠商依然采用自己的工具和流程來裁剪 Linux。

到了2010年,由于看到大多數公司花費大量的人力和财力幹相同的事情,Wind River Systems 和 Intel 開源技術中心牽頭成立了一個開源項目,旨在開發一套标準的建構工具,這套工具采用了 OpenEmbedded 的幾個關鍵元件,任何人都可以使用,任何人都可以貢獻。這個項目不以盈利為目的,而是保持開放和中立,為需要他們的社群提供工具和支援,是以這個項目開始與 Linux 基金會合作,由此誕生了 Yocto Project。

如今,Yocto Project 已經成為嵌入式 Linux 系統建立的标準方式,有18個組織和社群成員,這包括了數十家公司、數百名貢獻者,以及超過140個國家的開發人員。這是世界上最大的合作開源軟體項目之一。

官方網站:​​https://www.yoctoproject.org/​​

為什麼要用 Yocto

使用 Yocto Project 建構 i.MX8 Linux 系統的原因包括:

  1. Yocto Project 是一個由許多專家和半導體企業組織的開源項目,發展至今已經相當可靠;
  2. NXP 是 Yocto Project 項目的重要成員,旗下的 i.MX 系列處理器(i.MX6、i.MX7、i.MX8)均采用該方式建構系統,我們選擇 Yocto 方式便于與 Linux 和 NXP 社群同步。
  3. Yocto Project 可以幫助您建立定制的 Linux 系統和嵌入式産品,不必過于關心硬體體系,簡化了客制化 Linux 的開發過程。
  4. 通過建立和維護自己的 layer,可以實作不同硬體平台、不同産品的相容與管理,提高代碼複用率。

下載下傳資源包

點選 ​​這裡​​ 找到并下載下傳資料包,本專欄使用 L5.4.47_2.2.0_LINUX_DOCS 版本。下載下傳解壓後會看到一個《i.MX Yocto Project User’s Guide》文檔(簡稱 IMXLXYOCTOUG),本文部分内容就是參考該文檔的,建議仔細閱讀哦~

【i.MX8 Linux】建構 i.MX8 Yocto Project 映像

主機設定

安裝依賴

$ sudo apt install -y gawk wget git-core diffstat unzip texinfo gcc-multilib \
 build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
 xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \      

安裝 repo 工具

Repo 是基于 Git 的一個建構工具,便于管理多個 Git 倉庫。Repo 很好地補充了 Yocto 項目的分層性質,使使用者更容易将自己的層添加到 BSP 中。

安裝 repo 工具的步驟:

  1. 在家目錄中建立 bin 目錄
$ mkdir ~/bin # this step may not be needed if the bin folder already exists
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod      
  1. 在 .bashrc 檔案中添加下面一行,確定 ~/bin 目錄在 PATH 變量中
export PATH=~/bin:$PATH      

另外一種安裝方式是使用 Ubuntu 的包管理系統,指令如下:

$ sudo apt-get install      
提示:repo 自 Ubuntu 16.04 後開始支援,但 Ubuntu 20.04 不支援!使用 apt 方式安裝不需要建立 ~/bin 目錄和修改 .bashrc 檔案。

Git 配置

Repo 工具依賴 Git,是以使用之前需要確定已經配置好 Git 賬戶。

$ git      
$ git config --global user.name "Your Name"
$ git config --global user.email "Your Email"      

準備 i.MX Yocto 工程

下面給出我的操作示例,在這個示例中,我們建立一個名為 imx-yocto-bsp 的工程目錄,您可以根據需要修改它。接着設定 manifest 填充 Yocto Project 層源。

$ mkdir imx-yocto-bsp
$ cd imx-yocto-bsp
$ repo init -u https://source.codeaurora.org/external/imx/imx-manifest -b imx-linux-zeus -m imx-5.4.47-2.2.0.xml
$ repo sync      
Tips:​​https://source.codeaurora.org/external/imx/imx-manifest/tree/?h=imx-linux-zeus​​ 列出了此發行版中支援的所有清單檔案(manifest files)。

執行完上述步驟,源代碼将檢出到 imx-yocto-bsp/sources 目錄。

您可以執行 ​

​repo sync​

​ 指令同步倉庫,周期性地執行可以更新到最新代碼。

如果倉庫初始化過程出現錯誤,請嘗試删除 .repo 目錄,然後再次運作初始化指令。

上面 ​

​repo init​

​​ 一行使用最新的更新檔進行配置,按照 ​​index: imx-manifest.git​​ 中的訓示檢索原始 GA。否則,預設情況下會提取 GA plus 更新檔。要從 zeus base 擷取以前的發行版,請在 repo 初始化行的末尾添加 -m(加上 release manifest 名字),它将檢索以前的發行版。上面提供的連結中的 README 檔案中提供了示例。

以下是我的目錄結構:

imx-yocto-bsp$ tree -L 1
.
├── imx-setup-release.sh -> sources/meta-imx/tools/imx-setup-release.sh
├── README -> sources/base/README
├── README-IMXBSP -> sources/meta-imx/README
├── setup-environment ->      

建構系統映像

建構配置

i.MX 提供了一個 imx-setup-release.sh 腳本,用于簡化 i.MX 機器的配置過程。要使用腳本,需要指定要為其建構的特定計算機的名稱(MACHINE)以及所需的圖形後端(DISTRO)。該腳本為指定的計算機和後端設定目錄和配置檔案。

使用 imx-setup-release.sh 腳本進行配置的文法如下:

DISTRO=<distro name> MACHINE=<machine name> source imx-setup-release.sh -b <build dir>      

可以看到,您可以根據實際情況設定 DISTRO、MACHINE 和 build 目錄。build 目錄的名稱可以随便指定(隻要能認出來即可,因為後面可能會有多個 build 目錄),是以關鍵在于 DISTRO 和 MACHINE 的設定。

在 meta-imx 層中,i.MX 提供了覆寫 meta-freescale 機器配置的新的或更新的機器配置。這些檔案通過 imx-setup-release.sh 腳本複制到 meta-freescale/conf/machine 目錄中。

$ ls      

以下是可以選擇的 i.MX 機器配置檔案。您可以檢查發行說明或計算機目錄中的最新内容。

i.MX6 i.MX7 i.MX8

imx6qpsabreauto

imx6qpsabresd

imx7dsabresd

imx7ulpevk

imx8qmmek

imx8qxpmek

imx8mqevk

DISTRO 主要指定發行版的圖形後端,包括 Frame Buffer、Wayland 和 XWayland 都具有發行版配置,如果沒有指定,那麼預設使用 XWayland 發行版。發行版配置儲存在 DISTRO 設定的 local.conf 檔案中,并在運作 bitbake 時顯示。

這裡列出 DISTRO 的配置清單,需要注意的是 i.MX 8 不支援 fsl-imx-fb,并且不再支援 fsl-imx-x11。

  • fsl-imx-wayland - Wayland weston graphics.
  • fsl-imx-xwayland - Wayland graphics and X11. X11 applications using EGL are not supported.
  • fsl-imx-fb - Frame Buffer graphics - no X11 or Wayland. Frame Buffer is not supported on i.MX 8.

比如對于 i.MX8MQ-EVK 平台,我們可以這樣配置:

DISTRO=fsl-imx-wayland MACHINE=imx8mqevk source      

注意:每個建構檔案夾必須以僅使用一個發行版的方式進行配置。每次 ​

​DISTRO_FEATURES​

​ 變量改變了,都需要重新指定一個幹淨的 build 目錄。

執行完成,您會看到如下資訊,并且已經進入 build-wayland 目錄。

Welcome to Freescale Community BSP

The Yocto Project has extensive documentation about OE including a
reference manual which can be found at:
    http://yoctoproject.org/documentation

For more information about OpenEmbedded see their website:
    http://www.openembedded.org/

You can now run 'bitbake <target>'      

建構映像

Yocto Project 使用 bitbake 指令進行建構。例如,​

​bitbake <component>​

​ 建構對應的元件。每個元件的建構都包含多個任務,比如拉取(fetching)、配置(configuration)、編譯(compilation)、打包(packaging)以及釋出(deploying)到目标 rootfs 中。bitbake image 建構會收集映像所需的所有元件,并按每個任務的依存關系進行建構。第一個建構是工具鍊以及建構元件所需的工具。

值得注意的是,Yocto Project 提供了一些可在不同層上使用的映像,Poky 也提供了一些映像,meta-freescale 和 meta-freescale-distro 提供了一些映像,并且在 meta-imx 層中提供了其他映像配方。i.MX Yocto project 映像如下表所示。

Image name Target Provided by layer
core-image-minimal A small image that only allows a device to boot. Poky
core-image-base

A console-only image that fully supports the target device

hardware.

Poky
core-image-sato

An image with Sato, a mobile environment and visual

style for mobile devices. The image supports a Sato

theme and uses Pimlico applications. It contains a

terminal, an editor and a file manager.

Poky
imx-image-core

An i.MX image with i.MX test applications to be used for

Wayland backends. This image is used by our daily core

testing.

meta-imx/meta-sdk
fsl-image-machine-test

An FSL Community i.MX core image with console

environment - no GUI interface.

meta-freescale-distro
imx-image-multimedia Builds an i.MX image with a GUI without any Qt content. meta-imx/meta-sdk
imx-image-full

Builds an opensource Qt 5 image with Machine Learning

features. These images are only supported for i.MX SoC

with hardware graphics. They are not supported on the

i.MX 6UltraLite, i.MX 6UltraLiteLite, i.MX 6SLL, and i.MX

7Dual.

meta-imx/meta-sdk

您可以根據實際情況選擇一個 image,不同的 image 包含不同層次内容,是以最終建構的大小和所需的時間都不一樣。針對産品級應用來說,當然建議使用官方提供的 meta-imx 層的 image。

比如我這裡選擇不帶 Qt 的 imx-image-multimedia 映像進行建構:

$ bitbake imx-image-multimedia      
【i.MX8 Linux】建構 i.MX8 Yocto Project 映像

等待完成

接下來就是漫長的等待… 你可以去喝杯茶、看份報紙、睡一覺,再回來看看。我大概經過 12 個小時才建構完成的 😄

對啦,如果你在重新開機電腦或退出終端後想重新進入配置環境,在 imx-yocto-bsp 目錄執行下面指令即可。

source  setup-environment <build dir>      

釋出映像

曆盡艱辛,終于建構完了!完整的檔案系統映像已部署到 ​

​<build directory>/tmp/deploy/images​

​。

映像在大多數情況下是特定于環境設定中設定的機器的。每個映像建構都基于計算機配置檔案中定義的 ​

​IMAGE_FSTYPES​

​ 建立一個 U-Boot,一個核心和一個映像類型。大多數機器配置都提供 SD 卡映像(.wic)和 rootfs 映像(.tar)。

$ cd tmp/deploy/images/imx8mqevk/
$ ls      

燒寫 SD 卡映像

SD 卡映像(.wic)包含适用于引導相應硬體的分區映像(具有 U-Boot,核心,rootfs 等)。使用如下指令燒寫 SD 卡映像:

$ bunzip2 -dk -f imx-image-multimedia-imx8mqevk.wic.bz2
$ sudo dd if=imx-image-multimedia-imx8mqevk.wic of=/dev/sdb bs=1M conv=fsync      
bunzip2 指令是 .bz2 檔案的解壓縮程式。bunzip2 可解壓縮 .bz2 格式的壓縮檔案。bunzip2 實際上是 bzip2 的符号連接配接,執行 bunzip2 與 bzip2 -d 的效果相同。

注意:確定您的 SD 卡是否為 /dev/sdb,如果不是請自行修改!

從 SD 卡啟動系統

如果您的硬體平台與 MCIMX8M-EVK 闆相容,将 SD 卡插入闆卡,選擇從 SD 卡啟動,上電即可啟動我們剛剛制作好的映像!

root@imx8mqevk:~# uname -a
Linux imx8mqevk 5.4.47-g94d6dc139-dirty #3 SMP PREEMPT Thu Mar 4 14:50:32 CST 2021 aarch64 aarch64 aarch64 GNU/Linux      

參考資料

  • ​​Yocto Project WiKi​​
  • ​​FSL Community BSP​​

繼續閱讀