みつきんのメモ

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

YoctoProject PREMIRRORとown-mirror

はじめに

LTSではないバージョンのYoctoProjectなどで開発を始めたり、プロダクトで使用したためバージョンを固定する必要があったりして、SRC_URIで取得するソースコードをミラーしたいケースがあると思う。

また、企業のネットワークなどでは、そもそもインターネットへの接続に制限があったり、ソースコードも社内で管理されているミラーサーバからの取得が要求される場合もある。

YoctoProjectでは管理を継続しているがアップストリームがそのバージョンのソースコードの公開をやめてしまうこともある。

そのような色々な事情からYoctoProject(というかOpenEmbeddedのビルドシステム)では、下記の順番でソースコードの参照を試みる。

  1. ローカルのdownloadsディレクト
  2. PREMIRRORSに指定されたURL
  3. アップストリームのソースコードのURL
  4. MIRRORSに指定されたURL

PREMIRRORSはアップストリームのソースコードの前に参照され、MIRRORSはその取得に失敗した場合に参照される。

pokyのPREMIRRORS変数

https://docs.yoctoproject.org/singleindex.html#term-PREMIRRORSには下記のような記載がある。

Assuming your distribution (DISTRO) is “poky”, the default value for PREMIRRORS is defined in the conf/distro/poky.conf file in the meta-poky Git repository.

しかし実際にpoky.confを参照しても直接の記述は見つけられない。

bitbake -eでPREMIRRORSの内容を確認すると下記のように設定されていることが確認できる。

$ bitbake core-image-minimal -e | grep '^PREMIRRORS='
PREMIRRORS=" git://sourceware.org/git/glibc.git https://downloads.yoctoproject.org/mirror/sources/               git://sourceware.org/git/binutils-gdb.git https://downloads.yoctoproject.org/mirror/sources/"

own-mirrors.bbclass

own-mirrorsクラスを使うと、SOURCE_MIRROR_URLに指定したURLを独自のPREMIRRORSとして設定することができるようになる。 PREMIRRORSとSOURCE_MIRROR_URLの違いは、SOURCE_MIRROR_URLには1つしかURLを指定できない事。

https://docs.yoctoproject.org/singleindex.html#own-mirrorsで紹介されているown-mirrorsクラスの使用方法。

INHERIT += "own-mirrors"
SOURCE_MIRROR_URL = "http://example.com/my-source-mirror"

このクラスは独自のミラーを生成することはできない。

own-mirrors向けのミラーの作成手順

local.confに下記の内容を追加する。ここではダウンロード先を${HOME}/downloadsに指定している。

DL_DIR = "${HOME}/downloads"
BB_GENERATE_MIRROR_TARBALLS = "1"

下記コマンドを実行する。

$ bitbake <target> --runonly=fetch

own-mirrorを作ってみる

pokyの取得

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

環境変数の設定

$ source poky/oe-init-build-env

local.conf

MACHINEの設定

とりあえずターゲットとなるマシンを設定する。

MACHINE ?= "qemuarm64"

ミラー作成のための設定

own-mirrorを作成するための設定は下記。 ミラーは${HOME}/downloadsに作成される。

DL_DIR = "${HOME}/downloads"
BB_GENERATE_MIRROR_TARBALLS = "1"
SOURCE_MIRROR_FETCH = "1"

SOURCE_MIRROR_FETCHの行は必ずしも必要ではない。 この設定をするとCOMPATIBLE_MACHINECOMPATIBLE_HOSTの設定によらずに、すべてのソースがフェッチされるようになる。 これはミラーを作成する目的がある場合以外には設定しないように注意が必要となる。

下記コマンドでcore-image-sato-sdkで使用するレシピのすべてのdo_fetchタスクを実行する。 つまり、これでcore-image-sato-sdkで使用するソースのown-mirrorが作成される。

$ bitbake core-image-sato-sdk --runonly=fetch

(2024/02/24 追記)

現状のビルド対象の全てのレシピに対してfetchするには下記のようにworldを指定すると良い。

$ bitbake world --runall=fetch

fetchに関してはrunonlyでもいいと思う。

own-mirrorの参照

同じPCから参照する

作成したown-mirrorがビルドマシンに配置されている場合の手順を示す。 own-mirrorを作成する時のbuildディレクトリを使いまわすとdo_fetchでエラーになるので注意する。

別の端末で下記のコマンドを実行する。

$ source poky/oe-init-build-env build_qemu

local.confに下記を追加する。同じPCのデータを使用していることを確認するためBB_NO_NETWORKを設定する。 このフラグを設定するとbitbakeはネットワークにアクセスしなくなる。

INHERIT += "own-mirrors"
SOURCE_MIRROR_URL = "file://${HOME}/downloads"
BB_NO_NETWORK = "1"

この設定では、SOURCE_MIRROR_URLに設定されたミラーからDL_DIRにデータがダウンロードされる。

あとは普通にbitbakeを実行するとイメージが作成される。

$ bitbake core-image-base

別のPCから参照する

作成したown-mirrorがビルドマシンとは別のPCに配置されている場合の手順を示す。

own-mirrorを他のPCから参照できるようにhttpサーバでディレクトリを公開する。下記では8000番ポートを使用している。

$ cd ~/downloads
$ python3 -m http.server 8000

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

INHERIT += "own-mirrors"
SOURCE_MIRROR_URL = "http://<IPアドレス>:8000"

IPアドレスが192.168.0.1だった場合下記のようになる。

INHERIT += "own-mirrors"
SOURCE_MIRROR_URL = "http://192.168.0.1:8000"

まとめ

own-mirrorを使用すると、予めダウンロードしてあるディレクトリをPREMIRRORSに追加することができる。 PREMIRRORSはインターネット上のソースコードを探す前に参照されるため、 PREMIRRORSでソースコードが見つかった場合インターネットにアクセスする必要がなくなる。 そのため、ネットワークアクセスに制限がある状態でもbitbakeが可能になる。

予め --runonly=fetchなどでデータをダウンロードしておき、そのディレクトリをSOURCE_MIRROR_URLに指定することで own-mirrorとして使用することができる。

SOURCE_MIRROR_URLに指定したいディレクトリを予めhttpサーバなどで公開することで、 ローカルネットワーク内のミラーサーバのように使用することもできる。

長く続くプロジェクトではPREMIRRORSやown-mirrorを使用することでインターネット上のソースコードの公開が停止されてしまう場合に備えておくと、安心してYoctoProjectを使用することができるかもしれない。