みつきんのメモ

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

ラズベリーパイ3 Yoctoでdebパッケージを使用する

Yoctoでは、デフォルトでrpmを使用してレシピごとのパッケージを作成し、 OSイメージを作成する段階で、それらをインストールすることでソフトをインストールしている。

core-image-minimalやcore-image-base、rpi-basic-imageの最小構成のイメージでは、 パッケージのインストール情報がルートファイルシステムに保存されないため、 コマンドとしてrpmやdpkgをインストールしてあっても、パッケージを正しくあつかえない。

パッケージのインストール情報をルートファイルに保存し、 パッケージシステムをdebに変更して、 yoctoで作成したOSでRaspbian向けのパッケージを使用かどうかを調査したのでメモ。

結論を先に書くとdpkgは使用できるが、Raspbian向けのパッケージは実質使用できない。

armhfの野良debは使用できるかもしれない。

パッケージのインストール情報

パッケージのインストール情報をルートファイルシステムに保存するには、 (EXTRA_)IMAGE_FEATURES変数にpackage-managementを追加する。

この値を追加することで、パッケージのインストール情報と、パッケージシステムで使用するコマンド(rpmとかdpkg)も一緒にインストールされる。

local.confで設定する場合は次のようにする。

EXTRA_IMAGE_FEATURES_append = " package-management"

パッケージシステムをdebに変更

パッケージシステムをデフォルトのrpmからdebに変更するには、 PACKAGE_CLASSES変数の値をpackage_debに設定する。

local.confに次の行を追加する。

PACKAGE_CLASSES = "package_deb"

ルートファイルシステムの容量を拡張

デフォルトのままでは、ルートファイルシステムのイメージは、 必要最低限のサイズでパーティショニングされるため、少し余裕を持たせる。

local.confに次の内容を追加する。

IMAGE_ROOTFS_EXTRA_SPACE = "2097152"

これで、2GiBの容量でイメージが作成される。

core-image-baseで動作確認

いつもの手順でcore-image-baseをイメージを作成し、ラズベリーパイ3を起動する。

次のコマンドを実行しdebパッケージのインストール情報が保存されているかを確認する。

# dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  alsa-conf      1.1.6-r0     armhf        ALSA sound library
ii  alsa-state     0.2.0-r5     armhf        Alsa scenario files to enable als
ii  alsa-states    0.2.0-r5     armhf        Alsa scenario files to enable als
ii  alsa-utils-als 1.1.6-r0     armhf        Saves/restores ALSA-settings in /
ii  alsa-utils-als 1.1.6-r0     armhf        ncurses-based control for ALSA mi
ii  apm            3.2.2-15-r0  armhf        Utilities for Advanced Power Mana
...(snip)...

これでビルド済みのarmhf向けdebパッケージを使用することができる。

Raspbianのパッケージを使用できるか?

sources.listを追加

/etc/apt/sources.list.d/stretch.listを次の内容で作成する。

deb http://ftp.jaist.ac.jp/raspbian/ stretch main contrib non-free rpi

# deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://archive.raspbian.org/raspbian/ stretch main contrib non-free rpi

aptでパッケージを更新

パッケージを更新する。

# apt-get update
W: GPG error: http://ftp.jaist.ac.jp/raspbian stretch InRelease: Unknown error executing apt-key
W: The repository 'http://ftp.jaist.ac.jp/raspbian stretch InRelease' is not signed.
N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use.
N: See apt-secure(8) manpage for repository creation and user configuration details.

GPGのキー関連で警告が出ている。

# apt-get upgrade
...(snip)...
Do you want to continue? [Y/n]
...(snip)...
Install these packages without verification? [y/N] y
...(snip)...
Unpacking busybox (1:1.22.0-19) over (1.29.2-r0) ...
dpkg (subprocess): unable to execute rm command for cleanup (rm): No such file or directory
dpkg: error while cleaning up:
 subprocess rm command for cleanup returned error exit status 2
dpkg (subprocess): unable to execute rm command for cleanup (rm): No such file or directory
dpkg: error processing archive /var/cache/apt/archives/libusb-1.0-0_2%3a1.0.21-1_armhf.deb (--unpack):
 subprocess rm command for cleanup returned error exit status 2
Errors were encountered while processing:
 /var/cache/apt/archives/libusb-1.0-0_2%3a1.0.21-1_armhf.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

アップグレードを実行するとエラー。

結論

パッケージに収録されているファイルの構成などが異なっているため、 あると思って削除しに行ったら見つからないなどのエラーが発生する。

また、perl関連のパッケージなどで、yoctoとRaspbianでパッケージ名が一致しないものなどがあり、 ファイルがコンフリクトしたりするケースもある。

これらの結果から、Raspbian向けのパッケージを使用することは実質できないと思ったほうが良い。

armhf向けの野良パッケージをインストールするのに使えるかなぁという感じ。