VIA VAB-5000向けのYocto ProjectをビルドしてYocto 4.0.17 OSと拡張開発環境(eSDK)を入手する

# 最小のフットプリントを実現できる可変なLinuxディストリビュージョン開発環境「Yocto Project」を利用してVIAのVAB-5000上に最適なLinux環境を構築しよう

前回の記事では、VIA社のエッジAI向けシングルボードコンピュータ「VAB-5000」のLinux環境について紹介しました。前回はDebian OSについて紹介したのですが、Yocto Projectを利用することにより、小さなフットプリントで動作するLinux環境を手に入れることができます。Yoctoのバイナリイメージは公式サイトにて配布されているのですが、今回はYoctoをカスタマイズすることも視野にいれてソースコードからビルドする手順について解説します。

https://qiita.com/xtrizeShino/items/cf2d44adea29a0b31050

https://www.viatech.com/ja/edge-ja/vab-5000/

![VIA VAB-5000 board all_front.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/d0f23ea0-7579-4de6-b7d4-6db1ae779d4d.jpeg)

#### バイナリ形式のYocto OSを入手する場合は...

Yoctoのバイナリイメージは以下のサイトからダウンロードできます。

https://www.viatech.com/ja/edge-ja/vab-5000/

![スクリーンショット 2025-03-13 165405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/b34943da-7995-457e-b791-6b702e70680e.png)

## 事前準備

事前に、以下の手順の **「DebianをVAB-5000に書き込むツールをインストールする (ホストPC)」** を例に、VIA VAB-5000にOSを書き込める環境を構築する必要があります。

https://qiita.com/xtrizeShino/items/cf2d44adea29a0b31050

## 必要な機材（ターゲット）

開発には以下の機材が必要になります。ターゲットのストレージは、16GBのeMMCストレージがボード上に搭載されていますので、別途micro-SDカードなどを用意する必要はありません。 <font color="red">**ひとつ注意が必要なのは、VAB-5000へOSを書き込む環境で利用したUbuntu22.04でなく、YoctoのビルドにはUbuntu18.04が必要ということです。そしてUbuntu 18.04の環境はVirtual Machineで構築しないでください。Yoctoのビルドには多くのリソースが必要なため、十分なメモリを備えたリアルPCをご準備ください。**</font>

https://www.viatech.com/ja/edge-ja/vab-5000/

- **開発用PC(Ubuntu18.04)** ... ホストPC本体 <font color="blue">**（リアルPC）**</font>
- **VIA Technologies社 VAB-5000** ... ターゲット本体
- **micro-USBケーブル** ... ホストとターゲットを接続するためのケーブル
- **4Kモニタ、HDMIケーブル、キーボード(US配列)、マウス** ... 操作用のUI
- **LANケーブル** ... ターゲットをネットワークへ接続するために利用

![DSC01554.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/2c5261ee-8ff9-4eff-889b-d87a3055da55.jpeg)

## ホストPC上に開発環境を準備をする

まず、 OSのインストールや開発に便利なツールなどのインストールを行い、 **VAB-5000の開発ツールをインストールするための土台** を組み上げていきます。

- Core i7-6700 (4cores, 8threads)
- RAM 32GB
- On-Board Graphics (CPU)
- Ubuntu 18.04 LTS
  - Yocto Project 4.0.17の要件にあわせます

## Ubuntu 18.04 LTSをインストールする

まず、ホストPCに「Ubuntu18.04 LTS」をインストールします。以下のインストーラーを利用し、インストールしました。今回はGPUを搭載せず、マザーボード上のオンボードのHDMIポートを利用しました。 **Core i5-14500のPCではインストーラーのGUIが起動しなかったため、Core i7-6700のPCを準備しました...同じ現象になっている方、いらっしゃいますでしょうか...？**

https://releases.ubuntu.com/18.04.6/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/96074c3f-0d8b-4411-9fcd-77e86772501a.png)

Ubuntu18.04を上記のサイトからダウンロードし、rufusでUSBフラッシュメモリへと書き込み、インストールメディアとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/5ce41ee1-622c-4ad1-89cb-aed54f372a98.png)

インストールは通常通りの手順で問題ありません。

![WIN_20250303_19_39_49_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/adc41d8d-88e3-425b-949e-71078171a4ba.jpeg)

## リモートから開発できるように環境を整える

まず `apt upgrade` コマンドにより、パッケージを最新の状態へと更新し `openssh-server` をインストールすし、リモートからyoctoのソースコード一をビルドできるようにします。

```bash
###　リポジトリ情報を最新にする
$ sudo apt update

### 最新の状態へと更新する
$ sudo apt upgrade

### SSHサーバを起動する
$ sudo apt install openssh-server vim
$ sudo systemctl start ssh
$ sudo systemctl enable ssh

### sudo実行時にパスワードを聞かれないようにする
$ sudo vim /etc/sudoers

### 念のため再起動する
$ sudo reboot

### Ubuntu上での操作
$ mkdir -p /home/shino/.ssh
$ touch /home/shino/.ssh/authorized_keys
$ sudo chmod 700 /home/shino/.ssh
$ sudo chmod 640 /home/shino/.ssh/authorized_keys

### 公開鍵を登録する
$ vi /home/shino/.ssh/authorized_keys
# -->> Windows上の "id_rsa.pub" の内容を書き込む

```

## Yoctoに必要なパッケージをインストールする

Yocto Projectのソースコードをビルドするために必要なパッケージを以下の手順でインストールします。また `git config`を利用してgitコマンドの初期設定を行います。

```bash
### リポジトリを最新の状態にする
$ sudo apt-get update

### bitbakeに必要なパッケージをインストールする
$ 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 gcc g++ tar libpulse-dev libevent-dev ninja-build rpm2cpio python3-ply libc-dev-bin git python3-subunit mesa-common-dev curl liblz4-tool zstd

### gnコマンドをインストールする
$ wget -O gn http://storage.googleapis.com/chromium-gn/3fd43e5e0dcc674f0a0c004ec290d04bb2e1c60e
$ sudo chmod 777 gn
$ sudo mv gn /usr/bin/

### repoコマンドをインストールする
$ mkdir -p ~/bin
$ PATH=~/bin:$PATH
$ vi ~/.bashrc
# 最後の行に以下を追加
export PATH="/home/shino/bin:$PATH"
$ source ~/.bashrc
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+rx ~/bin/repo

### gitを利用するための設定
$ git config --global user.name "xxx xxx"
$ git config --global user.email "xxx@xxx.xxx"

```

## VIAのサポートデスクにVAB-5000を購入した旨を連絡し、VIA VAB-5000用のYoctoのソースコード一式を入手してホストPC上にソースコードを展開する

VIA VAB-5000向けのYoctoのソースコードは、VIAのサポートデスクから入手することができます。VIA VAB-5000を購入した旨を伝え、Yoctoのソースコードを入手してください。入手後、ホストPC上に `unzip` コマンドによりファイルを展開します。

```bash
### ビルド用ディレクトリを作成する
$ cd ~
$ mkdir vab-5000
$ cd vab-5000

######
### Download 
### VIA_SOM-5000_Yocto_4.0.17_BSP_v1.0.0_241004.zip
### from VIA Support Desk
######
$ ls 
# VIA_SOM-5000_Yocto_4.0.17_BSP_v1.0.0_241004.zip

### BSPパッケージを展開する
$ unzip ./VIA_SOM-5000_Yocto_4.0.17_BSP_v1.0.0_241004.zip
$ cd 

$ mkdir build
$ cd build

### OSを構成するソースコードを展開する
$ cp ~/vab-5000/VIA_SOM-5000_Yocto_4.0.17_BSP_v1.0.0_241004/Source_Code/VIA_SOM-5000_Yocto_4.0.17_BSP.tgz ${PWD}
$ tar zxvf VIA_SOM-5000_Yocto_4.0.17_BSP.tgz
# ...
$ ls
# VIA_SOM-5000_Yocto_4.0.17_BSP.tgz  yocto4.0.17

### ビルドディレクトリへ移動する
$ cd yocto4.0.17/
$ pwd
# /home/shino/vab-5000/build/yocto4.0.17
```

## Yoctoをビルドする

早速ビルドしてみましょう。

### 環境変数を設定し、ビルドの準備をする

以下のコマンドを `yocto4.0.17` ディレクトリ内で実行し、yoctoのビルドに必要な環境変数を設定します。

```bash
### OSイメージを作成する準備を行う
$ TEMPLATECONF=${PWD}/src/meta-rity/meta/conf source src/poky/oe-init-build-env; export BUILD_DIR=`pwd`
# You had no conf/local.conf file. This configuration file has therefore been
# created for you from /home/shino/vab-5000/build/yocto4.0.17/src/meta-rity/meta/conf/local.conf.sample
# 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 from /home/shino/vab-5000/build/yocto4.0.17/src/meta-rity/meta/conf/bblayers.conf.sample
# 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:
#     https://docs.yoctoproject.org
# 
# For more information about OpenEmbedded see the website:
#     https://www.openembedded.org/
```

### ビルドに含めるパッケージを追加する

`conf/local.conf` に以下の設定を追加し、yoctoのイメージに含めるパッケージを追加します。この設定により、yocto OS上で `g++` と `opencv` のライブラリとヘッダをOSに含めることができます。 **Yocto OSから`tensorflow` を利用する設定については、後日追記します。**

```bash
$ find ../src -name tensorflow*.bb
# ../src/meta-tensorflow/recipes-framework/tensorflow/tensorflow-native_2.14.0.bb
# ../src/meta-tensorflow/recipes-framework/tensorflow/tensorflow-estimator_2.14.0.bb
# ../src/meta-tensorflow/recipes-framework/tensorflow/tensorflow-lite_2.14.0.bb
# ../src/meta-tensorflow/recipes-framework/tensorflow/tensorflow_2.14.0.bb
# ../src/meta-tensorflow/recipes-model/googlecodelabs/tensorflow-for-poets_2.bb
# ../src/meta-nn/recipes-tensorflowlite-prebuilt/tensorflowlite-prebuilt/tensorflowlite-prebuilt_2.14.0.bb
```

#### OpenCVのヘッダとOpenSSH serverを含める設定

```bash
$ vim conf/local.conf
# 以下の行を追加する

######
### APPEND CONFIGRATION
######
IMAGE_INSTALL:append = " abseil-cpp"
IMAGE_INSTALL:append = " packagegroup-core-buildessential"
IMAGE_INSTALL:append = " opencv opencv-samples opencv-dev"
IMAGE_INSTALL:append = " libopencv-core libopencv-imgproc libopencv-highgui libopencv-videoio libopencv-imgcodecs"

######
### Add User
######
INHERIT:append = " extrausers"
IMAGE_FEATURES:append = " ssh-server-openssh"
IMAGE_INSTALL:append = " openssh openssh-sftp-server"

# 追記したら保存する
```

### bitbakeによりOSイメージを作成する

`bitbake rity-vis-image` コマンドにより、OSをビルドします。

```bash
### bitbakeしてOSイメージを生成する
$ time bitbake rity-vis-image
# ...
# Loading cache: 100% |                                                                                   | ETA:  --:--:--
# Loaded 0 entries from dependency cache.
# NOTE: /home/shino/vab-5000/build/yocto4.0.17/src/poky/../meta-mediatek-bsp/recipes-bsp/u-boot/u-boot_git.bb: UBOOT_FW_ENV_FILE set to fw_env-mmc-boot.config
# Parsing recipes: 100% |##################################################################################| Time: 0:00:56
# Parsing of 2966 .bb files complete (0 cached, 2966 parsed). 4513 targets, 367 skipped, 0 masked, 0 errors.
# NOTE: Resolving any missing task queue dependencies
# 
# Build Configuration:
# BB_VERSION           = "2.0.0"
# BUILD_SYS            = "x86_64-linux"
# NATIVELSBSTRING      = "ubuntu-18.04"
# TARGET_SYS           = "aarch64-poky-linux"
# MACHINE              = "som-5000"
# DISTRO               = "rity-vis"
# DISTRO_VERSION       = "24.0-release"
# TUNE_FEATURES        = "aarch64 armv8a crc"
# TARGET_FPU           = ""
# ...
# Currently  7 running tasks (128 of 8988)   1% |#                                                                       |
# 0: gmp-native-6.2.1-r0 do_fetch - 26s (pid 18227)  84% |###############################################         | 169K/s
# 1: binutils-cross-aarch64-2.38-r0 do_fetch - 21s (pid 19634)   4% |#                                            | 182K/s
# 2: gcc-source-11.4.0-11.4.0-r0 do_fetch - 8s (pid 25107)   2% |                                                 | 100K/s
# 3: gperf-native-3.1-r0 do_fetch - 4s (pid 26901)  16% |########                                                | 65.8K/s
# 4: glibc-2.35-r0 do_fetch - 4s (pid 26999)   0% |                                                              | 96.0K/s
# 5: zstd-native-1.5.2-r0 do_compile - 2s (pid 27785)
# 6: m4-native-1.4.19-r0 do_compile - 2s (pid 27833)
# ...
```

`vulkan-cts-1.2.6.0-r0` のビルドが多くのリソースを消費するらしく、bitbakeに失敗することがありますが、bitbakeを再実行することにより、エラーを回避することができます。

### ビルドの成果物を確認する

ビルドが完了したら、以下の手順でビルドの成果物を確認します。

```bash
### bitbakeの成果物を確認する
$ ls tmp/deploy/images/som-5000/
# ... (この成果物をVAB-5000へflashする)

### イメージを圧縮する
$ cat compress.sh
######
### 以下のスクリプトを作成する
######
#!/bin/bash
rm -rf som-5000.tar
tar -cvf som-5000.tar ./tmp/deploy/images/som-5000

### VAB-5000へ書き込むイメージを圧縮する
$ ./compress.sh
$ ls som-5000.tar
# som-5000.tar
```

## VIA VAB-5000にイメージを書き込む設定をする

VIA VAB-5000にイメージを書き込むために **Ubuntu22.04** をインストールしたマシンで以下の手順のうち、書き込みに関する手順を実施して、OSイメージを書き込む準備をしてください。

https://qiita.com/xtrizeShino/items/cf2d44adea29a0b31050

- VAB-5000にOSを書き込むためのツールをインストールする
- 必要なパッケージをインストールする 
- DebianをVAB-5000に書き込むツールをインストールする
- Genio Toolsをインストールする

### VIA VAB-5000にyoctoのOSイメージを書き込む 

最後に生成したYocto OSをVAB-5000へ書き込みます。

```bash
### 書き込み用のUbuntuでの作業
$ mkdir ~/yocto_mybuild
$ cd ~/yocto_mybuild
$ cat flash.sh
######
### 以下のスクリプトを作成する
######
#!/bin/bash
rm -rf ./tmp
tar -xvf som-5000.tar
cd tmp/deploy/images/som-5000
genio-flash

### ビルドした際のsom-5000.tarを展開する
$ ls som-5000.tar
# som-5000.tar

### VAB-5000にイメージを書き込む
$ ./flash.sh
# Genio Tools: v1.5
# Yocto Image:
#         name:     VIA Intelligent Solutions Image (rity-vis-image)
#         distro:   VIA Intelligent Solutions Layer 24.0-release (rity-vis)
#         codename: kirkstone
#         machine:  som-5000
#         overlays: ['gpu-mali.dtbo', 'apusys.dtbo', 'video.dtbo']
# 
# WARNING:root:No 'ftdi-cbus' device found
# WARNING:root:Unable to find and reset the board. Possible causes are:
# 1. This is not a Genio 350/700 EVK, nor a Pumpkin board.
# 2. The board port UART0 is not connected.
# 3. The UART0 port is being opened by another tool, such as TeraTerm on Windows.
# You can now manually reset the board into DOWNLOAD mode.
# 
# INFO:root:Continue flashing...
```

書き込み開始のメッセージが表示されたら、 **VAB-5000上の **`SW1`** を押した状態で、ACアダプタを抜去し、再度接続します。** この操作によりVAB-5000がOSを書き込める状態となります。 <font color="red">**`SW1` は `Erasing 'mmc0'` の表示が出る前押し続けてください。**</font>

![DSC01559.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/329de4d3-de03-45af-8d4a-0d3562fd2d4b.jpeg)

```bash
### SW1を押し続けたまま電源を投入し、SW1は押し続ける

# ...
# INFO:root:Continue flashing...
# Looking for MediaTek SoC matching USB device 0e8d:0003
# Opening /dev/ttyACM0 using baudrate=115200
# Connected to MediaTek SoC: hw_code[0x8188]
# Sending bootstrap to address: 0x201000
# Jumping to bootstrap at address 0x201000 in AArch64 mode
# erasing mmc0
# < waiting for any device >
# Erasing 'mmc0'                                     (bootloader) request sz: 0x3a3e00000, real erase len: 0x0

### SW1を離して良い

# OKAY [  0.786s]
# Finished. Total time: 0.790s
# erasing mmc0boot0
# Erasing 'mmc0boot0'                                (bootloader) request sz: 0x1fe0000, real erase len: 0x1fe0000
# OKAY [  0.006s]
# Finished. Total time: 0.010s
# erasing mmc0boot1
# Erasing 'mmc0boot1'                                (bootloader) request sz: 0x1fe0000, real erase len: 0x1fe0000
# OKAY [  0.005s]
# Finished. Total time: 0.009s
# flashing mmc0=rity-vis-image-som-5000.wic.img
# Sending sparse 'mmc0' 1/15 (231652 KB)
# ...

# Sending sparse 'mmc0' 15/15 (175340 KB)            OKAY [  4.411s]
# Writing 'mmc0'                                     OKAY [  6.852s]
# Finished. Total time: 246.610s
# flashing mmc0boot0=bl2.img
# Sending 'mmc0boot0' (273 KB)                       OKAY [  0.009s]
# Writing 'mmc0boot0'                                OKAY [  0.024s]
# Finished. Total time: 0.039s
# Detected U-Boot env size: 4096
# flashing mmc0boot1=u-boot-env.bin
# Sending 'mmc0boot1' (4 KB)                         OKAY [  0.002s]
# Writing 'mmc0boot1'                                OKAY [  0.005s]
# Finished. Total time: 0.012s
# Rebooting                                          OKAY [  0.002s]
# Finished. Total time: 0.052s

# ...

# 以上で書き込みは完了です、自動的にVAB-5000が再起動します
```

インストールが完了すると、以下のGUIが表示されます。

![WIN_20250303_18_42_14_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/35f7827b-dea2-4727-b5de-18dcf0af1509.jpeg)


## 開発用のSDKを作成し、インストールする

yoctoではbitbakeに `-c populate_sdk_ext` を指定して実行することにより、x86-64上でyoctoの環境向けのバイナリを生成するクロスビルドのできる開発用SDKを作成することができます。以下の手順により、クロスビルドのできる開発用SDKを作成し、インストールできます。

```bash
### bitbakeでSDKを生成する
$ time bitbake rity-vis-image -c populate_sdk_ext
# ...

### 生成されたSDKを確認する
$ ls tmp/deploy/sdk/rity-vis-glibc-x86_64-rity-vis-image-armv8a-som-5000-toolchain-ext-24.0-release.sh 
# tmp/deploy/sdk/rity-vis-glibc-x86_64-rity-vis-image-armv8a-som-5000-toolchain-ext-24.0-release.sh

### SDKをインストールする
$ ./tmp/deploy/sdk/rity-vis-glibc-x86_64-rity-vis-image-armv8a-som-5000-toolchain-ext-24.0-release.sh
# armv8a-som-5000-toolchain-ext-24.0-release.sh
# VIA Intelligent Solutions Layer Extensible SDK installer version 24.0-release
# =============================================================================
# Enter target directory for SDK (default: ~/rity-vis_sdk): 
# You are about to install the SDK to "/home/shino/rity-vis_sdk". Proceed [Y/n]? Y
# Extracting SDK.....
# ...
# SDK has been successfully set up and is ready to be used.
# Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
#  $ . /home/shino/rity-vis_sdk/environment-setup-armv8a-poky-linux

### 開発環境を有効化する
$ . /home/shino/rity-vis_sdk/environment-setup-armv8a-poky-linux
```

----

以上がVIA VAB-5000向けのYocto OSをビルドし
開発ツールを生成してインストールする手順となります。

Yoctoでも色々試してみたいため
今後追記していくと思います、是非ご期待ください。

**お疲れ様でした！**

https://www.viatech.com/ja/edge-ja/vab-5000/

----