みつきんのメモ

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

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

はじめに

前回dnfについて書いたが、今回はaptについて紹介する。

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

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

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

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

dnfやipkを使用する場合と比較してBitBake + aptはなぜか情報が少ないため、実機を使用した少しだけ具体的な手順を示す。

ターゲットボードはラズベリーパイ4、使用するYoctoProjectのバージョンはkirkstone(4.0)とする。

環境構築

作業環境

$ mkdir -p ~/yocto/rpi-kirkstone
$ cd ~/yocto/rpi-kirkstone

pokyの取得

$ git clone -b kirkstone git://git.yoctoproject.org/poky.git

環境変数の設定

$ source poky/oe-init-build-env

レイヤの取得

$ bitbake-layers layerindex-fetch meta-raspberrypi

local.confを編集

conf/local.confに下記の部分を追加

MACHINE = "raspberrypi4-64"
DL_DIR = "${TOPDIR}/../downloads"
PACKAGE_CLASSES = "package_deb"

# enable uart
ENABLE_UART = "1"

PACKAGE_CLASSESにpackage_debを設定し、使用するパッケージ管理システムをdebパッケージに変更する。

aptの下準備

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

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

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

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

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

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

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

PACKAGE_FEED_URIS  = "http://<IPアドレス>:8000"

PACKAGE_FEED_URISにビルドホストのIPアドレスを指定する。

ビルドと書き込み

イメージをビルドし、マイクロSDに書き込む。

$ bitbake core-image-base
$ bmaptool copy ./tmp/deploy/images/raspberrypi4-64/core-image-base-raspberrypi4-64.wic.bz2 /dev/sdX

/dev/sdXは環境に応じて適宜読み替える。

このマイクロSDでラズベリーパイ4を起動する。

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

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

$ bitbake package-index
$ cd ./tmp/deploy/deb
$ 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. ターゲットの時刻を補正する
  2. apt updateでターゲットのデータベースを更新する
  3. apt install nanoでインストールする
# date -s date -s '2022-11-29 04:58'
# apt update
# apt install nano

ターゲットの時刻が大幅にずれているとaptコマンドが失敗するため時刻を補正する。 dateコマンドは実行時点の実際の時刻を設定すること。

古いバージョンのYoctoProjectの場合

kirkstoneではPACKAGE_FEED_URISによって生成される/etc/apt/sources.listリポジトリ設定に [trusted=yes]が入るようになったため、署名されていないリポジトリでも問題なくapt updateができるが、 古いバージョンのYoctoProjectでは、下記のようにする必要がある。

# apt update --allow-insecure-repositories

まとめ

実機を使用してaptコマンドを使用する場合の手順をまとめた。

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

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