Yoctoを試す（その１：はじめに）

# Yoctoを用いてRaspberryPi用Linuxを作成
３年以上前に一度だけトライしBuild自身はできたが、うまく動作できずでほっておいた。久しぶりにやる気がでたのでリトライした結果、動作したのでここに記録する。その２の予定はあるが、その次もあるか現段階では不明。

## 開発環境とターゲット
### PC
CPU: Core i5-4460 3.2GHz
RAM: 16GB
OS: Lubuntu 18.04.3 LTS
Buildに相当な時間がかかるので、高スペックがベター。

### RaspberryPi
Raspberry Pi 1 Model B+
大昔に買ったもの。

## 準備
ここでは、[本家ページの古い（？）情報](https://www.yoctoproject.org/docs/2.4.2/yocto-project-qs/yocto-project-qs.html#the-linux-distro)をもとに、必要なパッケージをインストールした。最新状況は[こちら](https://docs.yoctoproject.org/brief-yoctoprojectqs/index.html)から確認すべきであろう。

```
~/proj/yocto$ 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 libsdl1.2-dev xterm
```

## Build前の環境設定
検索すると非常に多くの情報が見つかるが、ここでは同じターゲット（Raspberry Pi 1 Model B+）の[この記事](https://tewarid.github.io/2014/09/16/embedded-linux-system-for-raspberry-pi-with-yocto-project.html)をベースに進める。

### Pokyや必要なレイヤなどをGet
```
~/proj/yocto$ git clone http://git.yoctoproject.org/git/poky
~/proj/yocto$ git clone http://git.yoctoproject.org/git/meta-raspberrypi
~/proj/yocto$ git clone git://git.openembedded.org/meta-openembedded
```

### PATH追加
Bitbake実行のため、PATHに追加を行う。

```
~/proj/yocto$ PATH=~/proj/yocto/poky/bitbake/bin:$PATH
```

### 実行前の環境設定
```
~/proj/yocto$ source poky/oe-init-build-env build
```
「build」は好きな名前でよい。これを実行すると、「build」ディレクトリに移動し、次のメッセージが表示される。

```
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-full-cmdline
    core-image-sato
    core-image-weston
    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
```
最初はエラーかと思ったが、要するに、「conf/local.conf」と「conf/bblayers.conf」とがない（正確に言うとConfigurationされていない）ので編集、、、と「bitbake <target>」でBuild、、ということ。

### conf/local.conf
修正部分のみ記載。所持するモデル「Raspberry Pi 1 Model B+」には、次の設定がベターらしい。

```
MACHINE ?= "raspberrypi"
```

### conf/bblayers.conf（1回目）
関連部分のみ記載。まずは、「meta-openembedded」を除いてBuildする。

```
BBLAYERS ?= " \
  /home/undeux3/proj/yocto/poky/meta \
  /home/undeux3/proj/yocto/poky/meta-poky \
  /home/undeux3/proj/yocto/poky/meta-yocto-bsp \
  /home/undeux3/proj/yocto/meta-raspberrypi \
  "
```

## Build
### bitbake
「bitbake」でBuildを実施する。

```
~/proj/yocto/build$ bitbake core-image-base
```

「core-image-base」は作成するイメージのターゲットのひとつ。他には、上述した「oe-init-build-env」実行時に表示されるものや、本家サイトの[ここ](https://docs.yoctoproject.org/ref-manual/images.html)にターゲットが見つかる。この違いについては、理解できれば、別途調べることとする。

### つまづき（Fetch Error）
Fetch Errorが発生。例えば、次のようなもの。

```
ERROR: eudev-3.2.10-r0 do_fetch: Fetcher failure
ERROR: qemu-native-5.2.0-r0 do_fetch: Fetcher failure
```

単にうまくDownloadできないだけらしい。解決方法を探すと、[これ](https://jsdkk.com/blog/mugita/?p=606)や[これ](https://stackoverflow.com/questions/41058204/how-to-do-fetch-by-hand-in-a-yocto-project)を参考に、downloadsディレクトリに直接パッケージをDownloadすることがベターと判断。

```
~/proj/yocto/build/downloads$ https://dev.gentoo.org/~blueness/eudev/eudev-3.2.10.tar.gz
~/proj/yocto/build/downloads$ touch eudev-3.2.10.tar.gz.done

~/proj/yocto/build/downloads$ https://download.qemu.org/qemu-5.2.0.tar.xz
~/proj/yocto/build/downloads$ touch qemu-5.2.0.tar.xz.done
```

### 結果
Build時間は上記エラー対応も含めて4時間くらい、50GBもの容量を要した。

## マイクロSDカードへの書き込み
「build/tmp/deploy/images/raspberrypi」にイメージが作成される。bmaptoolを使って書き込む。

```
~/proj/yocto/build$ sudo apt install bmap-tools

~/proj/yocto/build/tmp/deploy/images/raspberrypi$ 
sudo bmaptool copy --bmap core-image-base-raspberrypi.wic.bmap core-image-base-raspberrypi.wic.bz2 /dev/sdd
```

「/dev/sdd」は環境により異なる。

## ログイン
Raspbianなどとは異なり、パスワードなしの「root」でログインできる。

## 次に
上記設定における「core-image-base」にsshが入っていなかったので、種々トライ。

### conf/bblayers.conf（2回目）
「meta-openembedded」も一部加えてみた。

```
BBLAYERS ?= " \
  /home/undeux3/proj/yocto/poky/meta \
  /home/undeux3/proj/yocto/poky/meta-poky \
  /home/undeux3/proj/yocto/poky/meta-yocto-bsp \
  /home/undeux3/proj/yocto/meta-raspberrypi \
  /home/undeux3/proj/yocto/meta-openembedded/meta-oe \
  /home/undeux3/proj/yocto/meta-openembedded/meta-networking \
  /home/undeux3/proj/yocto/meta-openembedded/meta-python \
  "
```

これで、「bitbake core-image-base」の結果として作成されるイメージにも、sshは含まれておらず。その時は詳細を調べる気がなかったので、別のターゲット（イメージ）を対象とした。

```
~/proj/yocto/build$ bitbake core-image-sato
```

これには、sshが含まれていた。

### 上記2回目のBuild（core-image-sato）はそれほど時間かからず
```
~/proj/yocto/build/tmp
```
このディレクトリ配下にダウンロード済のパッケージや「core-image-base」用にBuildした結果が残されており、10−30分（記憶は定かでない）でBuildが完了したような気がする。

## その後、sshについて調べる
### conf/local.confへ設定追加でOK
「IMAGE_FEATURES_append」や「IMAGE_INSTALL_append」に適切な追加を行うと、オプションで様々パッケージが追加できることが判明。本家サイトにも情報があるが、たとえば、[この記事](https://qiita.com/tall-rock/items/9a99b27781964590ec2b)に「conf/local.conf」の設定例がわかりやすく記載されている。

```
IMAGE_FEATURES_append = " ssh-server-openssh"
IMAGE_INSTALL_append = " openssh openssh-sftp-server"
```

ダブルクオーテーション（”）の次の空白は大事らしい。上記を「conf/local.conf」に記載後、

```
~/proj/yocto/build$ bitbake core-image-base
```

で作成されたイメージに、sshが含まれていた。

「IMAGE_FEATURES_append」や「IMAGE_INSTALL_append」で検索すると、追加できるパッケージについて、有益な情報が見つかるようだ。

## 調査する中で有益と感じた情報
### Yoctoとは
[この](https://qiita.com/AngryMane/items/61d2fa47246a9f9217f5)説明がナイスだった。

### レシピ一覧を確認するコマンド

```
~/proj/yocto/build$ bitbake-layers show-recipes
```

### bitbakeで指定可能なターゲット（イメージ）
[ここ](https://docs.yoctoproject.org/ref-manual/images.html)に情報あり。

## おわりに
その２に続く（続きたい）。