みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

bitbakeで作成したパッケージをdnf(ただしデバッグ用途に限る)

はじめに

ただしイケメンに限る」ていで書き始める。

YoctoProjectではレシピからパッケージを作成しそれらをルートFSにインストールすることでディストリビューションを構築している。 IMAGE_FEATURESにpackage-managementが含まれている場合、パッケージデータベースがルートFSに含まれるようになるため、 rpmやdpkgなどのパッケージ管理ツールでパッケージ情報を参照できる。

bitbakeで作成したパッケージファイルを実機にコピーし、rpm -idpkg -iなどでインストールすることは可能だが、 dnfやaptなどのツールでネットワーク越しパッケージをインストールできるようにするためには、パッケージシステムのリポジトリを作成し、 そのデータをHTTPなどのサーバを経由してアクセス可能にする必要がある。

ルートFSをいちいち作り直さなくても良くなるため、dnfやaptが使えると便利ではあるが、リポジトリを作成するのが手間ではある。 しかし実はbitbakeではパッケージのインデックスを作成し、リポジトリの作成を支援する仕組みが存在する。

ここでは署名検証や署名自体のプロセスをスキップし、デバッグ用途に限ってのみ使用できるリポジトリの運用方法を紹介する。

下準備

下準備として下記のことを行う。

  1. ルートFSのサイズ変更
  2. package-managementの有効化
  3. PACKAGE_FEED_URISの設定

まず、通常ルートFSのパーティションサイズは必要最小限で作成されるため、 パッケージ追加に備えて少し余裕をもたせる。今回は2GiBとする。

次に、パッケージデータベースを含めるためIMAGE_FEATURESを修正する。

最後に、PACKAGE_FEED_URISを指定してリポジトリのURLをルートFSの含める。 この変数を設定することで/etc/yum.repos.d/oe-remote-repo.repoというファイルが追加され、 ターゲットから参照するリポジトリを指定することができる。

そのためにはlocal.confに下記を追加する。

IMAGE_ROOTFS_EXTRA_SPACE = "2097152"
EXTRA_IMAGE_FEATURES += "package-management" 

PACKAGE_FEED_URIS  = "http://192.168.7.1:8000"

192.168.7.1はrunqemuで実行する場合のホストPCのIPアドレスであるため、 実機を使用する場合は、実機から参照可能なビルドホストのIPアドレスを指定する。

このイメージでターゲットを起動する。

パッケージリポジトリを作成する

下記を実行しターゲットから参照可能なリポジトリを作成する。 HTTPサーバはpython3のhttp.serverモジュールを使用する。

$ bitbake package-index
$ cd ./tmp/deploy/rpm
$ python3 -m http.server 8000

パッケージ追加の例

例としてnanoパッケージをビルドし、ターゲットに追加することを考える。

ビルドホスト

  1. bitbakeでnanoパッケージをビルドする
  2. bitbake package-indexでリポジトリを更新する

nanoはmeta-oeに含まれているため、meta-oeを追加する。

$ bitbake-layers layerindex-fetch meta-oe
$ bitbake nano
$ bitbake package-index

ターゲット

  1. dnf makecacheでターゲットのデータベースを更新する
  2. dnf install nanoでインストールする
# dnf makecache
# dnf install nano

まとめ

bitbakeしながらルートFSを調整していくタイミングでは 毎回実機上のルートFSを書き直す必要がなくなるので便利。

PACKAGE_FEED_URISをちゃんと書いておくと、ターゲット側でいちいちリポジトリ情報を設定しないくて済むのも便利。 署名検証のプロセスを省略しているのでリリース環境に持っていくにはもう一手間以上必要。