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向けの野良パッケージをインストールするのに使えるかなぁという感じ。