LeavaTailの日記

LeavaTailの日記

Linuxエンジニアを目指した技術者の備忘録

組込みLinuxディストリビューションを構築する(Yocto編)

はじめに

前回の記事で、QEMUx86_64アーキテクチャ上でARM用にビルドしたLinuxカーネルを起動させることに成功した。

leavatail.hatenablog.com

その時はLinuxシステムの構築にBuildRootを使用したが、今回はYoctoを使用してLinuxシステムを構築する。

Yoctoについて

Yocto Projectは、開発者がLinuxディストリビューションを構築する仕組みを提供するプロジェクトである。 Yoctoの特徴としては、以下のようなものがあげられる。

Yoctoは複数のコンポーネントから構成されている。下図はコンポーネントについて簡略に表したものである。

f:id:LeavaTail:20200222231606p:plain
Yoctoの全体像イメージ

  • poky : リファレンス・ビルド・システム
    独自のLinuxディストリビューションを構築するためのシステム。 (厳密には違うが) pokyはYocto専用のLinuxディストリビューションであり、ここでカーネルイメージやrootfsを生成する。 記事によっては、yocto=pokyのことを指していることもある。

  • bitbake: ビルドツール
    Yocto(poky)上で利用される組込みLinuxシステム向けのビルドツール。 Makeのようなもので、依存関係を解決したうえでイメージ(カーネルイメージやrootfsなど)を生成する。
    具体的にbitbakeでは、「レシピの解析」「ソースコードのダウンロード」「パッチ適用」「ビルド」を一括で実施してくれる。

  • レシピ: ソフトウェアのビルド定義
    ソフトウェアのビルドやインストール方法が書かれたファイル。

  • レイヤー: メタ情報の集合
    レシピなどを含めた情報を集めた層。レイヤーは重ねることで機能を追加することができ、アーキテクチャによる依存を最小限にすることができる。
    レイヤーやレシピの詳細な説明については、参考資料を参照。

  • 構成情報: ターゲットマシンの構成定義
    CPUアーキテクチャなどのターゲットマシンごとの定義。

環境構成

前回の記事で作成した環境を利用する。

f:id:LeavaTail:20200223133854p:plain
実行環境

仮想マシンの構築にはVagrantVirtualBox、BoxイメージにはUbuntu /bionic64を利用する。

今回使用するホスト環境は下記の通り。

テスト環境 詳細
CPU intel core i7-9700
メモリ DDR4-2666 32G
ストレージ M.2 SSD(500GB)
Virtualbox v6.0.18

準備

Yoctoの要件として空きディスク容量が50Gであることが求められる。 しかし、Vagrantのデフォルト仮想マシンのディスク容量は10Gであるので、Vagrantの定義ファイルを修正する必要がある。

今回は、vagrant-disksizeを使用して、ディスク容量を拡張する。 またyoctoではイメージ生成時間が長くなる傾向があるので、CPU数とメモリ容量も拡張しておく。 Vagrantfileの修正箇所は下記の通りである。

$ git diff
diff --git a/Vagrantfile b/Vagrantfile
index 1c4ee1e..bb5337f 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -45,17 +45,20 @@ Vagrant.configure("2") do |config|
   # argument is a set of non-required options.
   # config.vm.synced_folder "../data", "/vagrant_data"
 
+  config.ssh.forward_x11 = true
+
   # Provider-specific configuration so you can fine-tune various
   # backing providers for Vagrant. These expose provider-specific options.
   # Example for VirtualBox:
   #
-  # config.vm.provider "virtualbox" do |vb|
-  #   # Display the VirtualBox GUI when booting the machine
+  config.vm.provider "virtualbox" do |vb|
+    # Display the VirtualBox GUI when booting the machine
   #   vb.gui = true
-  #
-  #   # Customize the amount of memory on the VM:
-  #   vb.memory = "1024"
-  # end
+
+    # Customize the amount of memory on the VM:
+    vb.cpus = 8
+    vb.memory = "16384"
+  end
+
+  config.disksize.size = '200GB'
   #
   # View the documentation for the provider you are using for more
   # information on available options.

Yoctoを使用するにあたってX11転送は必須ではないが、デスクトップ環境イメージを利用する際に不便なので設定している。

最小限のシステムを構築する

1. 必要なパッケージをインストールする。

vagrant@ubuntu-bionic:~$ sudo apt-get install 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 \
                         pylint3 xterm

2. Pokyリポジトリをクローンする。(執筆時点の最新バージョンyocto-3.0にチェックアウトする)

vagrant@ubuntu-bionic:~$ git clone git://git.yoctoproject.org/poky
vagrant@ubuntu-bionic:~$ cd poky/
vagrant@ubuntu-bionic:~/poky$ git fetch --tag
vagrant@ubuntu-bionic:~/poky$ git tag
vagrant@ubuntu-bionic:~/poky$ git checkout tags/yocto-3.0 -b yocto-3.0

3. ビルド環境の初期化する。

vagrant@ubuntu-bionic:~/poky$ source oe-init-build-env

You had no conf/local.conf file. This configuration file has therefore been
created for you with some default values. You may wish to edit it to, for
example, select a different MACHINE (target hardware). See conf/local.conf
for more information as common configuration options are commented.

You had no conf/bblayers.conf file. This configuration file has therefore been
created for you with some default values. To add additional metadata layers
into your configuration please add entries to conf/bblayers.conf.

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/


### Shell environment set up for builds. ###

You can now run 'bitbake <target>'

Common targets are:
    core-image-minimal
    core-image-sato
    meta-toolchain
    meta-ide-support

You can also run generated qemu images with a command like 'runqemu qemux86'

Other commonly useful commands are:
 - 'devtool' and 'recipetool' handle common recipe tasks
 - 'bitbake-layers' handles common layer tasks
 - 'oe-pkgdata-util' handles common target package tasks

4. 構成ファイルlocal.confを修正する。

  • MACHINE ?=でターゲット対象アーキテクチャをarm64に変更する。
  • BB_NUMBER_THREADS:で並列処理するレシピ数を8に変更する。
  • PARALLEL_MAKE:コンパイル時に使用するコア数を8に変更する。
diff --git a/build/conf/local.conf b/build/conf/local.conf
index 2e0bb41e64..1941917154 100644
--- a/build/conf/local.conf
+++ b/build/conf/local.conf
@@ -18,7 +18,7 @@
 # of emulated machines available which can boot and run in the QEMU emulator:
 #
 #MACHINE ?= "qemuarm"
-#MACHINE ?= "qemuarm64"
+MACHINE ?= "qemuarm64"
 #MACHINE ?= "qemumips"
 #MACHINE ?= "qemumips64"
 #MACHINE ?= "qemuppc"
@@ -265,3 +265,6 @@ PACKAGECONFIG_append_pn-qemu-system-native = " sdl"
 # track the version of this file when it was generated. This can safely be ignored if
 # this doesn't mean anything to you.
 CONF_VERSION = "1"
+
+BB_NUMBER_THREADS = '8'
+PARALLEL_MAKE = '-j 8'

5. 最小限のシステムをビルドする。

vagrant@ubuntu-bionic:~/poky/build$ bitbake core-image-minimal

6. QEMUで生成したイメージをエミュレートする。(nographicを指定することで、現在のターミナルからシリアル接続することができる)

vagrant@ubuntu-bionic:~/poky/build$ runqemu qemuarm64 nographic

f:id:LeavaTail:20200223000818p:plain f:id:LeavaTail:20200223000826p:plain

デスクトップ環境を構築する

1. デスクトップ環境をビルドする

vagrant@ubuntu-bionic:~/poky/build$ bitbake core-image-sato

2. QEMUで生成したイメージをエミュレートする。

vagrant@ubuntu-bionic:~/poky/build$ runqemu qemuarm64

f:id:LeavaTail:20200213230755p:plain
Yoctoの起動画面

f:id:LeavaTail:20200213231153p:plain
アプリケーション選択画面

Terminalを選択する。

f:id:LeavaTail:20200213231226p:plain
シェル起動画面

ツールチェインの生成

1. ツールチェインをビルドする。

vagrant@ubuntu-bionic:~/poky/build$ bitbake meta-toolchain

2. ツールチェインをインストールする。

vagrant@ubuntu-bionic:~/poky/build $ ls -l tmp/deploy/sdk/
total 105432
-rw-r--r-- 2 vagrant vagrant      8864 Feb 22 15:33 poky-glibc-x86_64-meta-toolchain-aarch64-qemuarm64-toolchain-3.0+snapshot.host.manifest
-rwxr-xr-x 2 vagrant vagrant 107725598 Feb 22 15:36 poky-glibc-x86_64-meta-toolchain-aarch64-qemuarm64-toolchain-3.0+snapshot.sh
-rw-r--r-- 2 vagrant vagrant      1628 Feb 22 15:32 poky-glibc-x86_64-meta-toolchain-aarch64-qemuarm64-toolchain-3.0+snapshot.target.manifest
-rw-r--r-- 2 vagrant vagrant    214032 Feb 22 15:32 poky-glibc-x86_64-meta-toolchain-aarch64-qemuarm64-toolchain-3.0+snapshot.testdata.json
vagrant@ubuntu-bionic:~/poky/build $ ./poky-glibc-x86_64-meta-toolchain-aarch64-qemuarm64-toolchain-3.0+snapshot.sh

おわりに

Linuxシステムを構築するツールYoctoを使用して、組込みLinuxディストリビューションを構築した。 YoctoはBuildRootなどと比較して、設定が複雑な印象があるが、純正性の高いディストリビューションを作成することができそうだ。またレイヤーによる概念により、再利用性が高くなっている。

参考

Yocto Projectの公式ガイド

Yoctoについて解説している記事

Yoctoのレシピ/レイヤーについて解説

BitBakeの解説