はじめに
LTSではないバージョンのYoctoProjectなどで開発を始めたり、プロダクトで使用したためバージョンを固定する必要があったりして、SRC_URIで取得するソースコードをミラーしたいケースがあると思う。
また、企業のネットワークなどでは、そもそもインターネットへの接続に制限があったり、ソースコードも社内で管理されているミラーサーバからの取得が要求される場合もある。
YoctoProjectでは管理を継続しているがアップストリームがそのバージョンのソースコードの公開をやめてしまうこともある。
そのような色々な事情からYoctoProject(というかOpenEmbeddedのビルドシステム)では、下記の順番でソースコードの参照を試みる。
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_MACHINE
、COMPATIBLE_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を使用することができるかもしれない。