はじめに
前回dnfについて書いたが、今回はaptについて紹介する。
YoctoProjectではレシピからパッケージを作成しそれらをルートFSにインストールすることでディストリビューションを構築している。
IMAGE_FEATURESにpackage-management
が含まれている場合、パッケージデータベースがルートFSに含まれるようになるため、
rpmやdpkgなどのパッケージ管理ツールでパッケージ情報を参照できる。
bitbakeで作成したパッケージファイルを実機にコピーし、rpm -i
やdpkg -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の下準備
下準備として下記のことを行う。
- ルートFSのサイズ変更
- package-managementの有効化
- 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パッケージをビルドし、ターゲットに追加することを考える。
ビルドホスト
- bitbakeでnanoパッケージをビルドする
- bitbake package-indexでリポジトリを更新する
nanoはmeta-oeに含まれているため、meta-oeを追加する。
$ bitbake-layers layerindex-fetch meta-oe $ bitbake nano $ bitbake package-index
ターゲット
- ターゲットの時刻を補正する
- apt updateでターゲットのデータベースを更新する
- 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をちゃんと書いておくと、ターゲット側でいちいちリポジトリ情報を設定しないくて済むのも便利。 署名検証のプロセスを省略しているのでリリース環境に持っていくにはもう一手間以上必要。