リネオブログ

Yocto よもやま話 第 1 回「Yocto 最新バージョン Yocto Project 4.0 Kirkstone」

2022 年 05 月 23 日   Yocto Project よもやま話

2022 年 4 月 27 日、Yocto Project として 2 番目の LTS となる Yocto Project 4.0 Kirkstone リリースのアナウンスがありました。 当初は、バージョン 3.5 として開発が行われていましたが、過去のバージョンで動作していたメタデータがそのままでは動かなくなるほどの大きな変更が行われたこともあり、Yocto Project のバージョンは 4.0 に、 bitbake のブランチもバージョン 2.0 に変更されてのリリースとなっています。

アジェンダ

  1. Yocto 4.0 で新規に追加・拡張された機能
  2. 過去のリリースからの変更点
  3. 今後のサポートに関して
  4. Yocto 4.0 を使ってみた
  5. 過去バージョンからの移植にあたって

1. Yocto 4.0 で新規に追加・拡張された機能

基本ソフト
  1. kernel
    linux-5.10(LTS) 及び 15(LTS)
    注意すべき点として、5.10 は 2026/12 までメンテナンスがおこなわれますが、5.15 に関しては 2023/10 迄となっており poky のサポート期間中に EOL となってしまいます。
  2. glibc
    2.35
  3. その他
    300 以上のレシピのアップグレード
機能拡張
  1. 構築の再現性、100% の実現
    構築の再現性が実現できていなかった rust-llvm 及び golang の問題を解消したことにより、poky で配布するすべてのレシピにおいて、構築の再現性が実現されました。構築の再現性が実現できたため、従来オプションとして reproducible.bbclass で提供されていた機能は、base.bbclass に統合されました。
  2. YoctoProject の autobuilder が生成する Shared State Cache の公開
    build の再現性が実現できたため、Yocto Project で日々構築確認を行っている autobuider が生成する Shared State Cash が利用できるようになりました。
    Shared State Cash を利用するとことで、Yocto Project のサーバーとの帯域幅が十分確保できる状況においては、レシピをソースから構築する場合より早くなる場合があります。
    Shared State Cache とハッシュ等価性の設定を conf 内で以下の指定を行うことで、autobuilder 上の構築結果を再利用できるようになります。
BB_SIGNATURE_HANDLER = "OEEquivHash"
BB_HASHSERVE = "auto"
BB_HASHSERVE_UPSTREAM = "typhoon.yocto.io:8687"
SSTATE_MIRRORS ?= "file://.* https://sstate.yoctoproject.org/4.0/PATH;downloadfilename=PATH"

2. 過去のリリースからの変更点

本セクションでは、Yocto4.0 で変更となった点に関して、直前の Yocto3.4 からの変更点と、ひとつ前の LTS である Yocto3.1LTS 以降の変更点に分けて紹介します。

リリース 3.4 からの変更点

レシピ関連
  1. 使用することが推奨されない単語を含んだ変数名の変更

    Yocto 3.4 まで使われていた以下の変数名が、変更および廃止となっています。

  2. 変更前 変更後

    BB_ENV_WHITELIST

    BB_ENV_PASSTHROUGH

    BB_ENV_EXTRAWHITE

    BB_ENV_PASSTHROUGH_ADDITIONS

    BB_HASHBASE_WHITELIST

    BB_BASEHASH_IGNORE_VARS

    BB_HASHCONFIG_WHITELIST

    BB_HASHCONFIG_IGNORE_VARS

    BB_HASHTASK_WHITELIST

    BB_TASKHASH_IGNORE_TASKS

    BB_SETSCENE_ENFORCE_WHITELIST

    BB_SETSCENE_ENFORCE_IGNORE_TASKS

    CVE_CHECK_PN_WHITELIST

    CVE_CHECK_SKIP_RECIPE

    CVE_CHECK_WHITELIST

    CVE_CHECK_IGNORE

    ICECC_USER_CLASS_BL

    ICECC_CLASS_DISABLE

    ICECC_SYSTEM_CLASS_BL

    ICECC_CLASS_DISABLE

    ICECC_USER_PACKAGE_WL

    ICECC_RECIPE_ENABLE

    ICECC_USER_PACKAGE_BL

    ICECC_RECIPE_DISABLE

    ICECC_SYSTEM_PACKAGE_BL

    ICECC_RECIPE_DISABLE

    LICENSE_FLAGS_WHITELIST

    LICENSE_FLAGS_ACCEPTED

    MULTI_PROVIDER_WHITELIST

    BB_MULTI_PROVIDER_ALLOWED

    PNBLACKLIST

    SKIP_RECIPE

    SDK_LOCAL_CONF_BLACKLIST

    ESDK_LOCALCONF_REMOVE

    SDK_LOCAL_CONF_WHITELIST

    ESDK_LOCALCONF_ALLOW

    SDK_INHERIT_BLACKLIST

    ESDK_CLASS_INHERIT_DISABLE

    SSTATE_DUPWHITELIST

    SSTATE_ALLOW_OVERLAP_FILES

    SYSROOT_DIRS_BLACKLIST

    SYSROOT_DIRS_IGNORE

    UNKNOWN_CONFIGURE_WHITELIST

    UNKNOWN_CONFIGURE_OPT_IGNORE

    BB_STAMP_WHITELIST

    廃止

    BB_STAMP_POLICY

    廃止

    INHERIT_BLACKLIST

    廃止

    TUNEABI_WHITELIST

    廃止

    上記変数を使用していた既存のレシピやコンフィグレーションファイルの変換用に、scripts/contrib/convert-variable-renames.pyスクリプトが poky に同梱されます。

  3. SRC_URI で指定する git:// gitsm:// におけるブランチ名の指定

    git リポジトリにおける将来のデフォルトブランチ名が不明確なため、SRC_URI で指定する git:// 及び gitsm:// エントリで記述された全ての URI でブランチ名の指定が必要になりました。
    既存のレシピでブランチ未指定の場合に、branch=master を付加する変換スクリプト
    scripts/contrib/convert-srcuri.py が、poky に同梱されます。

  4. GitHub アクセス時のプロトコルの変更

    https://github.blog/2021-09-01-improving-git-protocol-security-github/ にあるよう、GitHub にアクセスする際には、https のプロトコルを使用するように変更する必要があります。do_fetch から呼び出されるスクリプトの中で、GitHub にアクセスする際の protocol を https に置き換える回避策が実装されていますが、前項で紹介したスクリプトを通すことで書き換え可能となっています。

  5. タスク内でのネットワークアクセスの原則禁止

    ネットワークアクセスを無効にする機能が有効化された kernel が提供されている CentOS8 や Debian といった最新のディストリビューションに合わせて、do_fetch を除いたタスクでは、ネットワークアクセスが無効となりました。
    タスク内でネットワークアクセスが必要な場合は、レシピ内で以下の記述をおこない、明示的にネットワークアクセスを有効にします。

    do_mytask[network] = "1"
  6. レシピ解析中の変数の変更の無効化

    TOPDIR 変数及び current working dir 変数は、レシピ解析中に変更されなくなりました。書き換えに依存していたレシピは動作しなくなります。

  7. append / prepend / remove と組み合わせる演算子を限定

    上記演算子と組み合わせる演算子は、"=" と ":=" のみとなります。

  8. allarch パッケージグループの依存処理の変更

    allarch パッケージグループのレシピは、debian.bbclass のように PKG 変数を用いて名前を変更するパッケージへの依存はできなくなります。

  9. LICENSE 定義は SPDX 識別子を使用

    従来の記述を変換するスクリプト scripts/contrib/convert-spdx-licenses.py が、poky に同梱されます。

  10. Crate Fetcher のサポート

    Rust Package 向けに、SRC_URI で指定するスキームに "crate://" が追加されました。

CLASSの変更
  1. distutils*.bbclass のレイヤー移動

    distutils*.bbclasses は、meta-openembedded/meta-python レイヤーに移動となりました。この移動により、classes 及び DISTUTILS 変数に関するドキュメントないの記述は削除されました。

  2. bbclass の削除

    blacklist.bbclass は削除され、提供されていた機能は base.bbclass に SkipRecipe() 関数として実装されています。
    従来 BLACKLIST 変数に設定していた記述は、以下の例のように変更する必要があります。

    PNBLACKLIST[my-recipe] = "Not supported by our organization."

    SKIP_RECIPE[my-recipe] = "Not supported by our organization."
  3. Python パッケージの構築方法の変更

    Python パッケージの構築は wheels が使用されるようになり、以下の新しいパッケージングクラスが追加されています。
    python-flit_core, setuptools_python-build_meta ,python_poetry_core.

  4. image-prelink.bbclass の削除

    既に多くの未可決のバグが残っており、ロードアドレスのランダム化や PIE 実行可能ファイルを無効にしないと動作しない prelink について glibc_2.36 から削除となることが判明したため、サポートを続ける利点がないとの判断から削除されています。

  5. OverlayFS をサポートするクラスの追加

    read-only filesystems に対する上書きファイルシステムを提供する OverlayFS の導入を容易にする新規のクラス overlayfs 及び overlayfs-etc が提供されています。

Yocto3.1(LTS) リリース以降 3.4 までの変更点

3.2 での変更点 (詳細情報
レシピ関連
  1. bjam-native
    boost-build-native に置き換え
  2. avahi-ui
    avahi に統合
  3. build-compare
    packagefeed-stability.bbclass の廃止に伴い不要となったため削除
  4. dhcp
    古くなったため、dhcpcd 及び kea に置き換え
  5. libmodulemd-v1
    libmodulemd に置き換え
  6. packagegroup-core-device-devel
    qemu* マシン用に自動的に追加されていましたが、必要な場合に明示的に個々のパッケージを追加すべきとのことで削除されています。
クラス関連
削除されたクラス
  1. spdx
    時代遅れな実装となったため削除されています。
    同等な機能が必要な場合は、meta-sdpxscanner レイヤーを組み込むこと。
  2. packagefeed-stability
    ハッシュの等価性と再現性のあるビルドの実現により時代遅れとなったため

パッケージの変更
  1. python3
    urllib パッケージは core パッケージに含まれるようになりました。
  2. iptables
    iptables-apply / ip6tables-apply パッケージが iptables パッケージから分離して生成するようになりました。
その他の変更

file:// 内での "*" "?" の使用不可
SRC_URI で file:// 内で指定するパスでのワイルドカード(* 及び ?) の使用は、ファイルチェックサムを適切にサポートできておらず、ソースファイルの変更時のタスクチェックサムが変化しませんでした。変更したファイルが以降のビルドに確実に組み込まれていなかったため、ワイルドカードのサポートを削除することになりました。

3.3 での変更点 (詳細情報
ライセンスファイル名の変更

SPDX の命名規則に準拠するため meta/files/common-licenses 以下のファイル名の変更が行われています。

従来のファイル名 新しいファイル名
AGPL-3.0 AGPL-3.0-only
GPL-1.0 GPL-1.0-only
GPL-2.0 GPL-2.0-only
GPL-3.0 GPL-3.0-only
LGPL-2.0 LGPL-2.0-only
LGPL-2.1 LGPL-2.1-only
LGPL-3.0 LGPL-3.0-only
レシピ関連
  1. go-dep
    go modules の出現によって廃止となっています。
  2. obsolete with the advent of go modules
    gst-devtools に置き換え。
  3. vulkan-demos
    vulkan-samples に置き換え。
  4. adwaita-icon-theme
    最新版のレシピ 3.38 が提供されているが、依存する librsvg が openembedded-core で未提供の rust に依存するものがあり、この時点では構築不能なため、dunfell で提供されている 3.34.3 が復活し、conf/distro/include/default-version.inc 内で PREFERRED_VERSION で 3.34.3 が指定されている。(Yocto4.0 で最新版が使用可能に)
パッケージ関連
  1. dbus
    dbus-common, dbus-tools を分離
  2. iproute2
    ip を分離
  3. net-tols
    mii-tools を分離
  4. props
    ps 及び sysctl を分離
  5. rpm
    構築用のパッケージと展開用のパッケージに分離
  6. sudo
    実行形式ファイルを含んだ sudo-sudo とライブライを含んだ sudo-lib に分離
  7. systemtap
    examples や python のスクリプトを分離
  8. util-linux
    libuuid は、util-linux-libuuid レシピに分離
3.4 での変更点 (詳細情報
上書き演算子の変更

このリリースから、上書き参照を行う演算子で指定する文字は、"_" から ":" に変更になっています。
以下、qemux86 での変更例となります。

バージョン 3.4 より前

SRC_URI_append = " file://somefile"
SRC_URI_append_qemux86 = " file://somefile2"
SRC_URI_remove_qemux86-64 = " file://somefile3"
SRC_URI_prepend_qemuarm = "file://somefile4 "
FILES_${PN}-ptest = "${bindir}/xyz"
IMAGE_CMD_tar = "tar"
BASE_LIB_tune-cortexa76 = "lib"
SRCREV_pn-bash = "abc"
BB_TASK_NICE_LEVEL_task-testimage = '0'

バージョン 3.4 以降

SRC_URI:append = " file://somefile"
SRC_URI:append:qemux86 = " file://somefile2"
SRC_URI:remove:qemux86-64 = " file://somefile3"
SRC_URI:prepend:qemuarm = "file://somefile4 "
FILES:${PN}-ptest = "${bindir}/xyz"
IMAGE_CMD:tar = "tar"
BASE_LIB:tune-cortexa76 = "lib"
SRCREV:pn-bash = "abc"
BB_TASK_NICE_LEVEL:task-testimage = '0'

従来の書式で作成されたレイヤー内のメタデータを変換するスクリプト <oe-core>/scripts/contrib/convert-overrides.py が提供されており、

<oe-core>/scripts/contrib/convert-overrides.py <layerdir>
上記のようにレイヤーディレクトリを指定して一括変換が可能です。ただし、完全な自動処理ではないため、スクリプトの注意事項を確認の上で実行して下さい。

開発ホストで必要なパッケージの追加

lz4c,pzstd.zstd の各パッケージが開発ホスト上にインストールされていることが必要になりました。

レシピ関連(主要なもの)
  1. rust の提供
    rust が openembedded-core に統合され、クロスコンパイラー及び SDK の中で利用が可能となりました。
  2. clutter の削除
    clutter に関連するレシピは、meta-openembedded/meta-gnome に移動しました。
  3. cog の削除
    こちらも古いレシピとなったため、meta-openembedded/meta-gnome に移動しました。
  4. mklibs-native の削除
    非アクティブな状態でテストも行われず、python2 への依存も残っているため削除されました。
  5. mx-1.0 の削除
    古くなり、よく利用されているレイヤー内からの依存もないため削除されました。
クラス関連
  1. clutter の削除
    meta-openembedded/meta-gnome に移動しました。
  2. image-mklibs の削除
    非アクティブな状態でテストも行われず、python2 への依存も残っているため削除されました。
  3. meta の削除
    パッケージのインストールを省略する必要があるレシピは、代わりに nopackages クラスを継承します。

3. 今後のサポートについて

本セクションでは、Yocto4.0 のサポート体制、スケージュールについて説明します。
Yocto4.0LTS (kirkstone) は、Yocto3.1 (Dunfell) と同様、Yocto Project から業務委託を受けている Steve Sakoman 氏がメンテナーとして、最短 2024 年 4 月まで LTS として保守を行います。
今後のリリース予定は以下のようになっています。

version build Release
4.0.1 2022/05/16 2022/05/27
4.0.2 2022/06/27 2022/07/08
4.0.3 2022/08/08 2022/08/19
4.0.4 2022/09/19 2022/09/30
4.0.5 2022/10/31 2022/11/11

ポイントリリースの 1 月後に次のバージョンの構築を行なうという定期的なリリースが予定されています。

4. Yocto4.0 を使ってみた

本セクションでは、実際に Yocto4.0 で構築を行ない、過去バージョンとの相違や、キャッシュの利用による利点を紹介します。

Applications

最近はあまりデモで使われなくなった core-image-sato ですが、今も提供されています。

rust がいよいよ本格的に使用可能に

core-image-sato に含まれる adwaita-icon-theme は、41.0 にバージョンが上がり、依存する librsvg は rust-llvm を使って構築を行う 2.52.7 にバージョンが上がっています。

rust の構築が入ったことによる構築時間の変化

同一のマシンにて、3.1 / 3.3 / 4.0 で core-image-sato の build を 行った際の構築時間、CPU 使用率は以下となります。

バージョン 3.1.16 3.3.6 4.0.1
構築時間 5326.96 秒 5675.20 秒 9828.61 秒
CPU 使用率 83.7% 85.3% 86.7%

CPU Core i7-9750H 2.60GHz x 12 スレッド
メモリ 32GB
※本ブログを執筆している 2022/05/16 現在 、branch kirkstone は既に Yocto4.0.1 となっていまして、こちらのバージョンで計測しています。

公開 SSTATE_CACHE を使ってみた

本リリースより公開された Yocto Project の autobuilder の SSTATE_CACHE を使用する設定を行った結果です。

SSTATE_CACHE デフォルト 外部指定
構築時間 9828.61 秒 968.89 秒
CPU 使用率 86.7% 5.0%

conf/local.conf に以下の指定を追加しています。

BB_SIGNATURE_HANDLER = "OEEquivHash"
BB_HASHSERVE = "auto"
BB_HASHSERVE_UPSTREAM = "typhoon.yocto.io:8687"
SSTATE_MIRRORS ?= "file://.* https://sstate.yoctoproject.org/4.0.1/PATH;downloadfilename=PATH"

CPU の使用率が非常に低くなり、殆どの時間は SSTATE_CACHE サーバーに保存されたデータのダウンロードにかかっています。

5. 過去バージョンからの移植にあたって

本セクションでは、従来のバージョンで使用していたレイヤーを Yocto4.0 で使う上での注意点を紹介します。

レシピの変換を行う
Yocto3.4 での上書き演算子の変更、Yocto4.0 での変数名の変更といった過去のバージョンと互換性の取れない変更が行われているので、変換スクリプトを実行します。
Yocto4.0 では、レシピ・コンフィグレーションファイルの変換用に、meta/scripts/contrib 内に以下のスクリプトが提供されています。
  • convert-overrides.py
    Yocto3.4 で提供開始。3.4 で変更となった上書き演算子の変更に対応。
  • convert-spdx-licenses.py
    Yocto3.3 で変更となった、SPDX に準拠したファイル名に対応する変換をおこなう。(Yocto4.0 で提供開始)
  • convert-srcuri.py
    Yocto3.4.1 で提供開始。git:// gitsm:// におけるブランチ名未指定時に master を付加し、github の場合 protocol に https を使用するように書き換えを行う。
  • convert-variable-renames.py
    Yocto4.0 で変更された変数名を変換するスクリプト。上記の 4 スクリプトをカスタムレイヤーを指定して変換を行う。
削除されたレシピ・クラスに依存していないか確認

Yocto 3.4 から提供された移行ガイドを確認します。
Yocto4.0 への移行ガイドをはじめとして、3.4 向け 3.3 より前のバージョンは、リリースマニュアルを参考にします。
3.3 向け 3.2 向け 3.1 向け

上記を参考にして解決しない場合は、弊社で運用する YoctoBBQ にご登録の上でお問い合わせください。

この記事の著者
伊東 孝康
伊東 孝康

リネオソリューションズ株式会社 ソリューション統括部 テクニカルエキスパート。
ウィンドウシステム X10 の時代からオープンソースに関わり、リネオでカーネル層からアプリケーション層まで幅広い組込みの開発を行う。
2020 年 10 月 Yocto Project Ambassador に就任

Yocto Project 公式実践講座 7 月 ~ 9 月 開催分 受講お申込み受付中!
Yocto Project よもやま話
Yocto よもやま話 第 2 回「Yocto Project SUMMIT 2022/05」
Yocto よもやま話 第 2 回「Yocto Project SUMMIT 2022/05」

2022 年 06 月 20 日 Yocto Project よもやま話

新企画「Yocto Project よもやま話」の連載を始めます
新企画「Yocto Project よもやま話」の連載を始めます

2022 年 04 月 28 日 Yocto Project よもやま話

Linux 技術ネタ
イベントレポート
ET & IoT 2021 レポート
ET & IoT 2021 レポート

2021 年 12 月 01 日 イベントレポート

組込み総合技術展 Embedded Technology 2019 レポート
組込み総合技術展 Embedded Technology 2019 レポート

2019 年 12 月 13 日 イベントレポート

組込み総合技術展 関西 ETWest2019 レポート
組込み総合技術展 関西 ETWest2019 レポート

2019 年 06 月 20 日 イベントレポート

リクルート
新卒採用、絶賛募集中!
新卒採用、絶賛募集中!

2022 年 06 月 06 日 リクルート

違うズラ
違うズラ

2018 年 10 月 26 日 リクルート

信州で人生がかわる
信州で人生がかわる

2018 年 07 月 24 日 リクルート

北小野通信
入笠山ハイキング その 2
入笠山ハイキング その 2

2019 年 10 月 09 日 北小野通信

入笠山ハイキング その 1
入笠山ハイキング その 1

2019 年 10 月 09 日 北小野通信

氷の世界
氷の世界

2019 年 01 月 22 日 北小野通信

ソリューション統括部
シリコンバレー探検記 2019 ~番外編~
シリコンバレー探検記 2019 ~番外編~

2019 年 12 月 10 日 ソリューション統括部

シリコンバレー探検記 2019 ~後編~
シリコンバレー探検記 2019 ~後編~

2019 年 12 月 10 日 ソリューション統括部

シリコンバレー探検記 2019 ~前編~
シリコンバレー探検記 2019 ~前編~

2019 年 12 月 10 日 ソリューション統括部

マーケティング統括部
大成功決起大会!!(ET2019)
大成功決起大会!!(ET2019)

2019 年 12 月 13 日 マーケティング統括部

ESEC 2019 決起大会
ESEC 2019 決起大会

2019 年 04 月 25 日 マーケティング統括部

シリコンバレー探検記 その 2
シリコンバレー探検記 その 2

2018 年 12 月 18 日 マーケティング統括部