BeagleBoneBlackで学ぶYoctoLinuxの基礎 (1) ~ Ubuntuインストールからbitbakeまで ~　

## あらまし

数年ぶりに組み込みLinuxに触ったので、その内容をメモしたいと思う。

環境は以下の通り、Bitbake等はVMware上で動作するUbuntuで実行した。

| 項目 | 内容 |
| :--- | :--- |
| HostOS | Win10 |
| GuestOS | Ubuntu 18.04.5 LTS |
| ボード | BeagleBoneBlack |
| Boot Device | SDカード |

## Ubuntu Setup

まずは、VMware上でUbuntuに必要な環境一式をインストールする。

- [Yocto Project Reference Manual](https://www.yoctoproject.org/docs/2.6.1/ref-manual/ref-manual.html)に書かれているパッケージ一式をインストールする。
- このほかに、リモートデバッグ環境構築用に`cmake-qt-gui`、`sshpass`、`Wireshark`、`VSCode`等をインストールした。
- シリアルコンソール用に`picocom`をインストールした。Windowsでシリアルコンソールを使う場合は不要となる。
- `vi`が苦手なのでエディタは`nano`を利用したが、お好みで。

```console:Ubuntu
> sudo apt install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev xterm python-crypto cpio python python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping libssl-dev
> sudo apt install cmake-qt-gui picocom sshpass wireshark
> sudo apt install nano htop mc tree
> sudo snap install --classic code
```

## Bitbakeの準備

### gitで各環境を取得する

まずは、`~/`以下に作業フォルダ`BBB`を作成する。

```console:Ubuntu
> cd ~
> mkdir BBB
```

Yoctoのバージョンは[Yocto Release](https://wiki.yoctoproject.org/wiki/Releases)を参照し、LTSとなっている`Dunfell`を選択した。

```console:Ubuntu
> git clone git://git.yoctoproject.org/poky.git -b dunfell
> cd ./poky
> git clone git://git.yoctoproject.org/meta-security.git -b dunfell 
> git clone git://git.openembedded.org/meta-openembedded -b dunfell
> git clone git://git.yoctoproject.org/meta-ti -b dunfell 
> git clone git://git.yoctoproject.org/meta-arm -b dunfell 
```

まずは、`source ~/BBB/poky/oe-init-build-env`で実施する。これにより、環境変数一式が読み込まれ、なければBuildディレクトリ等が作成される。

### `local.conf`の作成

`~/BBB/poky/build/conf`以下に`local.conf`のひな形が作成されるので、以下の通り変更した。 (コメントアウト部分は割愛)

| 設定項目 | 概要 |
| :--- | :--- |
| MACHINE | `beaglebone`を設定した。ネットの情報等によると、`beaglebone-yocto`でも可能とのこと。 |
| DL_DIR / SSTATE_DIR | お作法的に設定した。 |
| ##configure username and password | ログインパスワードの設定。 |
| IMAGE_FSTYPES | SDカードに直接書き込むことを想定したため、`wic`を選択した。標準では、`wic.tar`が出力された。 |
| 追加Image | gdbserver / ssh-server 等を追加。 |
| # add sdk on Yocto / not for kernel build | Yocto側でセルフビルドしたくなった時のためにあらかじめ追加しておいた。ただし、KernelのセルフビルドはYoctoは非対応らしい。 |

```console:local.conf
MACHINE ??= "beaglebone"
DL_DIR ?= "/home/user/Yocto/downloads"
SSTATE_DIR ?= "/home/user/Yocto/sstate"
#TMPDIR = "${TOPDIR}/tmp"
DISTRO ?= "poky"
PACKAGE_CLASSES ?= "package_rpm"
EXTRA_IMAGE_FEATURES ?= "debug-tweaks"
USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
BB_DISKMON_DIRS ??= "\
    STOPTASKS,${TMPDIR},1G,100K \
    STOPTASKS,${DL_DIR},1G,100K \
    STOPTASKS,${SSTATE_DIR},1G,100K \
    STOPTASKS,/tmp,100M,100K \
    ABORT,${TMPDIR},100M,1K \
    ABORT,${DL_DIR},100M,1K \
    ABORT,${SSTATE_DIR},100M,1K \
    ABORT,/tmp,10M,1K"

CONF_VERSION = "1"

## configure username and password
INHERIT_append = " extrausers"
EXTRA_USERS_PARAMS = "usermod -P root root; useradd -P user user;"

# configure build image to wic
IMAGE_FSTYPES = "wic"

# add additional image
## gdbserver for remote debugging
IMAGE_INSTALL_append = " gdbserver"

## ssh server for remote login
EXTRA_IMAGE_FEATURES += "ssh-server-openssh"

## text editor and mc
IMAGE_INSTALL_append = " nano"
IMAGE_INSTALL_append = " mc"

# add sdk on Yocto / not for kernel build
IMAGE_FEATURES += "dev-pkgs tools-debug"
IMAGE_INSTALL_append = " packagegroup-core-buildessential "
TOLLCHAIN_HOST_TASK += "nativesdk-cmake"
```

### `bblaypers.conf`

BBLAYERSのパスは絶対パス指定が必要。

```console:bblayers.conf
# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
  /home/user/BBB/poky/meta \
  /home/user/BBB/poky/meta-poky \
  /home/user/BBB/poky/meta-yocto-bsp \
  /home/user/BBB/poky/meta-openembedded/meta-oe \
  /home/user/BBB/poky/meta-openembedded/meta-python \
  /home/user/BBB/poky/meta-openembedded/meta-networking \
  /home/user/BBB/poky/meta-ti \
  /home/user/BBB/poky/meta-arm/meta-arm \
  /home/user/BBB/poky/meta-arm/meta-arm-toolchain \
  "
```

## Kernel Buildの実行

YoctoのイメージとSDKの作成。

```console:Ubuntu
> bitbake core-image-minimal
> bitbake core-image-minimal -c populate_sdk
```

Bitbakeが成功すると、`~/BBB/poky/build/tmp/deploy/beaglebone/images`以下に各イメージが生成され、`~/BBB/poky/build/tmp/deploy/sdk`にSDKが生成される。

```console:Ubuntu
user@ubuntu:~/BBB/poky/build/tmp/deploy$ tree -L 1
.
├── images
├── licenses
├── rpm
└── sdk
```

## まとめ

BBB上で動作するYocto環境を構築した。
標準のレシピに対して、デバッグ環境等を追加した。