Yoctoで作ったLinuxのパッケージをアップデートする(dnf)


Aptpod Advent Calendar 10日目の担当、矢部です。

Aptpod入社してまだ日が浅い私ですがいろいろと新しく知ることが多く、その中にYoctoがあります。
今回はYoctoで作成したLinuxパッケージをアップデートするための方法の一つである、パッケージマネージャの利用について説明します。

手順

Yoctoでパッケージマネージャを使う方法は非常に簡単です。設定ファイルであるlocal.confに以下を追加するだけ1です。

local.conf
IMAGE_FEATURES += " package-management "
PACKAGE_CLASSES ?= " package_rpm "

2行目のほうはパッケージにrpmを利用する場合で、ほかにも

  • package_deb
  • package_ipk
  • package_tar

が設定可能です。
設定ができたらイメージのビルド。

パッケージリポジトリの公開

作成したパッケージはローカルにrpmファイルをおいてアップデートする方法もありますが、リポジトリを作成してhttp公開するのが便利です。

$ createrepo /<build_dir>/<tmp_dir>/deploy/rpm

上記で作成したリポジトリディレクトリを、ApacheやらNginxやらお好きなもので公開します。

ボード側の設定

公開したリポジトリを利用するために、ボード側には最低限以下の設定が必要です。
設定ファイル(.repo)の名前はなんでもよいです。

$ mkdir /etc/yum.repos.d
/etc/yum.repos.d/yocto.repo
[yocto]
name=yocto
baseurl=http://<build machine>
gpgcheck=0

gpgcheckの設定については、以下の通り。

この方法では、リポジトリの検証用のgpgkeyを無効にしているが、ローカル接続であれば問題ない。外部公開の場合は適切に設定すること。
https://qiita.com/watatuki/items/4c3447a96309e19e7d5c

上記設定ができたら以下のコマンドを実行。

$ dnf makecache

正常に設定されていればリポジトリが読み込まれます。うまくいかない場合は設定ファイルや、リポジトリの公開設定などを見直してみてください。

動作確認

ここまでくれば、あとは

  • パッケージのインストール
$ dnf install <package name>
  • アップデート
$ dnf update
  • 自分が公開したパッケージの確認
$ dnf list --available

などなど、コマンド一発でいろいろ簡単に行えるようになります。

さいごに

組込み機器に限らずアップデートの機能はちゃんと作らないと苦労します(した)が、このように簡単に実装できてしまうのはすばらしいですね。

(おまけ)バージョンを変えずにアップデートしたい

デイリービルドなどバージョンナンバーを変えずにアップデートしたいケースはあるかと思いますが、dnfでは同一バージョンの強制アップデートが(素直には)できません2
Yoctoではレシピのリビジョン設定をする変数が用意されているため、その値を変更することでdnfに異なるバージョン(リビジョン)のSWとして認識されるようになります。
https://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-PR
ちなみに、自動でリビジョンを上げる方法もあるようです。
https://www.yoctoproject.org/docs/2.6/dev-manual/dev-manual.html#working-with-a-pr-service

参考


  1. 1行目はlocal.confよりも、イメージ用のレシピファイルに追加するほうが自然かもしれません 

  2. rpmコマンドを直接使用するとか、いくつか方法はある