Yoctoの使い方

オープンソースのビルドシステムであるyoctoの使い方を簡単に紹介します。Ubuntu 12.04 LTS 64bitを使用しました。

 

1. ダウンロード

yoctoのビルドツールであるpokyを取得します。

$ git clone http://git.yoctoproject.org/git/poky

2. ビルド

$ . oe-init-build-env
$ emacs conf/local.conf
$ bitbake core-image-sato

2.1. oe-init-build-env

ビルド環境構築スクリプトのoe-init-build-envを実行するとbuildディレクトリに自動的に移動されます。

$ . oe-init-build-env

buildディレクトリ以外を指定したい場合は引数にディレクトリ名を与えます。

$ . oe-init-build-env mybuilds

2.2. conf/local.conf

CPUアーキテクチャ、スレッド数、make -jの数等の指定が可能です。

BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"
MACHINE ?= "beaglebone"

MACHINEにボード(基盤)が設定され、MACHINEで設定されたファイル内でカーネルの設定、CPUアーキテクチャの設定等、ボード依存の設定項目が選ばれていきます。
YoctoはハードウェアベンダのBSP(Board Support Package)の作成を意識している為にこのような柔軟な構成になっています。

作成可能なボードの設定を確認するにはmachineディレクトリ直下のファイル を見れば良いでしょう。

$ ls ./meta-yocto-bsp/conf/machine
beaglebone.conf  edgerouter.conf  genericx86-64.conf  genericx86.conf
include  mpc8315e-rdb.conf
$ ls meta/conf/machine
include  qemuarm.conf  qemumips64.conf  qemumips.conf  qemuppc.conf
qemux86-64.conf  qemux86.conf

これらはあくまでYocto pokyのgitに含まれるものです。Yoctoで公開している他のリポジトリには他のボード用の設定も公開されています。

 

2.2.1. conf/bblayers.confとmetaディレクトリ

machineディレクトリがmetaディレクトリとmeta-yocto-bspディレクトリの二つあることが不思議に思われた方がいらっしゃるかもしれません。

conf/bblayers.confでmeta-xxxというディレクトリ郡とmetaディレクトリの設定を読み込みます。

# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
LCONF_VERSION = "6"
 
BBPATH = "${TOPDIR}"
BBFILES ?= ""
 
BBLAYERS ?= " \
  /<path-to>/poky/meta \
  /<path-to>/poky/meta-yocto \
  /<path-to>/poky/meta-yocto-bsp \
  "
BBLAYERS_NON_REMOVABLE ?= " \
  /<path-to>/poky/meta \
  /<path-to>/poky/meta-yocto \
  "

例えばyoctoのリポジトリ群にmeta-intelというリポジトリがあり、 meta-intel/conf/machineというディレクトリを持っています。 

$ ls meta-intel/conf/machine/
include  intel-core2-32.conf  intel-corei7-64.conf  README

このintel-core2-32.confとintel-corei7-64.confをMACHINEに設定し、bblayers.confでmeta-intelを読み込むようにエントリを追加することで、外部から追加したボードの設定を利用することが可能となります。

ボードを提供するハードウェアベンダはmeta-xxxディレクトリのみを提供すれば良いことになります。

 

2.3. bitbake

ビルドに必要なパッケージはbitbakeを実行した段階で分かるので、適時イン ストールします。

$ bitbake core-image-sato
ERROR:  OE-core's config sanity checker detected a potential
misconfiguration.
    Either fix the cause of this error or at your own risk disable the
    checker (see sanity.conf).
    Following is the list of potential problems / advisories:
 
    Please install the following missing utilities: C++ Compiler
    (g++),diffstat,makeinfo,gawk,chrpath
 
ERROR: Execution of event handler 'check_sanity_eventhandler' failed
ERROR: Command execution failed: Exited with 1
 
Summary: There were 3 ERROR messages shown, returning a non-zero exit code.

Ubuntu 12.04ではmakeinfoはtexinfoに含まれます。

 

3. core-image-satoについて

yoctoはレシピというファイル単位でパッケージを管理おり、各レシピは依存関係があります。

例えば、glibcを必要とするパッケージはレシピにglibcを依存することを記述します。
core-image-satoはLinuxシステムを構築するのに必要なパッケージ郡を依存するレシピです。

core-image-satoを指定するとbitbakeがレシピを解析していき、基本となるglibc等をビルドしていきます。

 

4. QEMUの起動

oe-init-build-envを実行した後、runqemuコマンドでQEMUが起動できます。

$ runqemu qemux86
 
Continuing with the following parameters:
KERNEL:
[/<path-to>/poky/build/tmp/deploy/images/qemux86/bzImage-qemux86.bin]
ROOTFS:
[/<path-to>/poky/build/tmp/deploy/images/qemux86/core-image-sato-qemux86-20140416162134.rootfs.ext3]
FSTYPE: [ext3]
Setting up tap interface under sudo
Acquiring lockfile for tap0...
Running qemu-system-i386...
/<path-to>/Sources/poky/build/tmp/sysroots/i686-linux/usr/bin/qemu-system-i386
-kernel
/<path-to>/Sources/poky/build/tmp/deploy/images/qemux86/bzImage-qemux86.bin
-net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=no,downscript=no
-cpu qemu32 -hda
/<path-to>/Sources/poky/build/tmp/deploy/images/qemux86/core-image-sato-qemux86-20140416162134.rootfs.ext3
-show-cursor -usb -usbdevice wacom-tablet -vga vmware -no-reboot -m
256 --append "vga=0 uvesafb.mode_option=640x480-32 root=/dev/hda rw
mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 oprofile.timer=1 "
VNC server running on `127.0.0.1:5900'

VNCビューアで接続すると以下の画面が得られます。

 

runqemu
runqemu

4. 容量

buildディレクトリ配下の容量は以下のようになりました。30GByteほど必要なようです。

0       bitbake.lock
2.4M    cache
28K     conf
2.2G    downloads
2.4G    sstate-cache
2.2M    task-depends.dot
23G     tmp

5. 参考