This service is available only in Japanese-language.

イメージのフットプリント削減について

Yocto Project 公式実践講座 (LFD461-JP)の講座中よくいただく質問について紹介します。

■イメージのフットプリント削減について

bitbakeコマンドによって作成されたルートファイルシステムのフットプリントを削減するにはどうしたらよいか?
という質問が比較的多いためいくつかのポイントを説明します。

考え方としては以下の2通りの方法に分けることができます。

1. 小さいイメージに必要なパッケージを追加していく方法
2. 大きいイメージから不要なパッケージを削除していく方法

筆者としては1番目の小さいイメージ必要なパッケージを追加していく方法をおすすめしています。

最大の理由は「パッケージの選定が大変」だからなのですが、選定が大変な理由をいくつか列挙します。

* パッケージが本当に不要かどうか判断が難しい
* 削除対象のパッケージの依存関係の精査が難しい

まず、何を持って不要とするか?という判断基準が明確である必要がありますし、
その基準を満たして削除しようとした場合でも、別のパッケージから依存されている場合削除することができません。

■作業の流れ

上記どちらの方法を取る場合でも作業の流れは以下のようになります。

1. ベースとなるイメージの選定
2. パッケージの選定
3. メタデータの修正

■小さいイメージに必要なパッケージを追加していく方法

Pokyが提供している最小のイメージは「core-image-minimal」ですが、これは起動確認用の特殊なイメージとなるため、
ここから開発を進めることは筆者はおすすめしていません。

GUIが不要なイメージを選択する場合は「core-image-base」を使用するほうが良いと考えます。

自作のイメージレシピの中で以下のような記述をして必要なパッケージを追加していきます。

===
require recipes-core/images/core-image-base.bb

IMAGE_INSTALL += " ...."
===

■大きいイメージから不要なパッケージを削除していく方法

パッケージ単位での削除を検討する前に、筆者は「FEATURES」単位での削除をおすすめしています。

FEATURESは、機能単位で複数の単位をまとめて追加するための機能です。
基本的にはFEATURES同士で依存関係はないため、この単位であれば比較的簡単に機能を削除していくことが可能となります。

現在適用されているFEATURESを確認するには以下のようにします。

===
$ bitbake core-image-base -e | grep '^.*_FEATURES='
===

qemuarm64向けのcore-image-baseの初期状態では以下のようになっています。

===
COMBINED_FEATURES="bluetooth alsa vfat usbgadget"
DISTRO_FEATURES="acl alsa bluetooth debuginfod ext2 ipv4 ipv6 pcmcia usbgadget usbhost wifi xattr nfs zeroconf pci 3g nfc x11 vfat seccomp opengl ptest multiarch wayland vulkan systemd usrmerge pulseaudio gobject-introspection-data ldconfig"
EXTRA_IMAGE_FEATURES="debug-tweaks"
IMAGE_FEATURES="debug-tweaks splash"
KERNEL_EXTRA_FEATURES=" features/debug/debug-kernel.scc"
MACHINE_FEATURES="alsa bluetooth usbgadget screen vfat rtc qemu-usermode"
POKY_DEFAULT_DISTRO_FEATURES="opengl ptest multiarch wayland vulkan"
SDKIMAGE_FEATURES="dev-pkgs dbg-pkgs src-pkgs "
SDK_MACHINE_FEATURES="qemu-usermode"
TUNE_FEATURES="aarch64 crc cortexa57"
===

この内イメージのサイズに直接的に影響があるのは下記のものになります。

* DISTRO_FEATURES
* MACHINE_FEATURES
* COMBINED_FEATURES

COMBINED_FEATURESは上の2つに同じ値が存在する場合に自動的に設定されるようになっています。
つまりこの値が設定されている場合は、必ず何かしらのパッケージ群が追加されていることになります。

逆に、DISTRO_FEATURESやMACHINE_FEATURESはパッケージのコンパイルオプションに影響を与えるだけで
単体ではパッケージの追加に影響しないケースがあるのでこの値を削除してもイメージサイズが変わらないこともあります。

まず、「COMBINED_FEATURES="bluetooth alsa vfat usbgadget"」に注目します。
開発するハードウェアによっては、bluetoothが搭載されていない場合や、音声機能が搭載されていないUSBもデバイス側の機能は使用しないなどが考えられます。

「DISTRO_FEATURES="acl alsa bluetooth debuginfod ext2 ipv4 ipv6 pcmcia usbgadget usbhost wifi xattr nfs zeroconf pci 3g nfc x11 vfat seccomp opengl ptest multiarch wayland vulkan systemd usrmerge pulseaudio gobject-introspection-data ldconfig"」に関しても、イーサネットは使用するけどIPv6は不要などのケースがあるかもしれません。

local.confに下記を追加して、試しにいくつかのFEATURESを削除します。

===
DISTRO_FEATURES:remove = "bluetooth usbgadget alsa"
MACHINE_FEATURES:remove = "bluetooth usbgadget alsa"

DISTRO_FEATURES:remove = "ipv6 nfs pci 3g nfc wifi opengl pulseaudio"
MACHINE_FEATURES:remove = "rtc"
===

上2行はCOMBINED_FEATURESを削除しています。下2行はそれぞれのFEATURESを削除しています。

FEATURES削除前のイメージのサイズは以下の通り、157Mとなっています。

===
-rw-r--r-- 2 user user 157M 3月 28 10:26 core-image-base-qemuarm64.rootfs-20250328011752.ext4
===

local.confの変更を適用したあとのビルド結果は以下の通り123Mと30M程度、削減できました。

===
-rw-r--r-- 2 user user 123M 3月 28 14:29 core-image-base-qemuarm64.rootfs-20250328051910.ext4
===

local.confの変更をベースに、独自のDISTROやMACHINEを定義する際に、それぞれのFEATURESを定義します。
注意点としては「:remove」によるオーバーライドを行うと、あとから値を再追加できないため、デフォルト値を定義する際には避けたほうが良いです。

DISTROの定義の例ですと、my-distro.confなどを作成し以下のようにします。

===
require conf/distro/poky.conf

DISTRO = "my-distro"
DISTRO_VERSION = "0.0.1"

DISTRO_FEATURES="acl debuginfod ext2 ipv4 pcmcia usbhost xattr nfs zeroconf x11 vfat seccomp ptest multiarch wayland vulkan systemd usrmerge gobject-introspection-data ldconfig"
===