aimdevel’s blog

勉強したことを書きます

yoctoのレシピでkernel configを変更する方法

概要

yoctoでlinux kernelをビルドする際にconfigを変更する方法は複数あり、
どの方法を使えばよいのか迷うことがある。
そこでいくつかの方法を実際に使用してみて、どれが使いやすいか考えた。

実験環境

  • 対象ハード : raspberrypi4-64 (meta-raspberrypi + poky)
  • yoctoバージョン : kirkstone

  • 今回試した方法

    • KERNEL_FEATURESを設定する方法
    • 独自のcfgファイルを使用する方法
    • defconfigをレシピから渡す方法

使用結果

1. KERNEL_FEATURESを設定する方法

linux-yoctoの標準で用意されている設定を、機能ごとに指定して反映できる。
指定できる設定は以下のリポジトリなどに格納されており、
この中のcssファイルをyocto設定のKERNEL_FEATURES変数に指定できる。

yocto-kernel-cache - Patches and configuration for the linux-yocto kernel tree

設定例:

KERNEL_FEATURES += "features/uprobe/uprobe.scc"

上記の設定を行うとビルド時に.configに以下設定が追加される。

CONFIG_UPROBES=y
CONFIG_UPROBE_EVENTS=y

KERNEL_FEATURESに既存の設定を指定するだけなので簡単に使いたい機能を有効にできる。
ただし、細かい設定はできないように見える。

上記のような特徴から、単純に目的の機能が有効になればよい場合に使用するのが良いと思われる。
ユーザが細かい設定を行えないので、kernelの機能を制限したい場合などでは使いにくそうだと感じた。

また、sccファイルではconfigの変更以外も可能なようだが、今回は詳細を確認しない。 sccについては以下の公式ドキュメントを参照。

3 Working with Advanced Metadata (yocto-kernel-cache) — The Yocto Project ® 4.0.13 documentation

2. 独自のcfgファイルを使用する方法

SRC_URIに自作した.cfgファイルを指定すると、ベースになるconfigを変更できる。
.cfgの記述はkernelのconfigと同様に以下のような形式。

CONFIG_WILC1000_SPI=m

これを.bb/bbappendのSRC_URI変数に追加すると、ここに書かれた設定が追加される。
kernelのconfigを直接指定できるので、ピンポイントで必要な設定を行えるが、kernelのconfigを知っている必要があり、知識がないと作成するのが難しい。

上記の特徴のように、kernelのconfigを直接に記述できるので、目的の設定を確実に行うことができる。
ただし、基本的には機能追加で使用するので、これも最小のkernelをビルドしたい場合には、ベースにしたconfigを確認して不要な機能が有効化されていないか見る必要がある。

3. defconfigをレシピから渡す方法

独自に作成したdefconfigファイルをrecipeで渡す方法。
レシピの記述例は以下。レシピから渡したdefconfigを使用するようにbbappendファイルを作成する。

KBUILD_DEFCONFIG:raspberrypi4-64 = ""
SRC_URI += " file://defconfig "

1行目で既存のdefconfigの設定を削除し、2行目でdefconfigを指定している。  

この方法では、kernelのconfigをほとんどコントロールすることができるので、ユーザが必要な機能だけを有効にしやすい。
ただし、defconfig全体を作成するので、cfgファイルの作成以上にkernelの知識が必要である。
また、yoctoの設定によっては、自動的にkernelのconfigを有効にするものがあるので、ビルド後に.configを確認して不要なconfigがされていないか確認するのが良いと思う。

比較

簡単さで言うと、
「KERNEL_FEATURESを設定 > 独自のcfgファイルを使用 > defconfigをレシピから渡す」
となる。 ラズパイなどを自分用にカスタマイズして遊ぶ分には方法1と2で十分だが、製品向けにビルドするとなると、方法3を行ったうえで、yoctoのほかの設定から有効になってしまう機能を調べるなどの対応が必要そうだ。

使用した資材は以下に格納した。

GitHub - aimdevel/meta-my-raspberrypi: Yocto layer of my raspberrypi

まとめ

yoctoでkernelのconfigを変更する方法を3つ試して比較した。
個人で楽しむ分には方法1と2で十分だと感じた。
それ以上にkernelの細かい設定を行いたいとなると、方法3を使うか、もしくはkernelをforkして個人用のリポジトリを作って、yoctoでもそこを参照するなどの方法をとる方がよい気がする。

参考情報

https://docs.yoctoproject.org/4.0.13/kernel-dev/advanced.html#