FreeBSD ラズパイ用 pkg baseの作り方

Raspberry PIのFreeBSD では freebsd-upgradeが使えません。(2018年12月25日現在)

そこでソースからパッチが配布されたときなど、自分でビルドをしないといけません。当然 Raspberry PI上でのビルドは遅すぎて鼻血が出そうになるので別マシン(母艦)でビルドするのが常套手段ではないかと思います。

FreeBSDでのクロスコンパイルは簡単で makeのパラメータとして、 TARGET, TARGET_ARCH, KERNCONFなどの パラメータをソースツリーで適切に指定してやるだけです。例えば以下のリンクにはSDを母艦でmountして インストール(またはアプデート)するやり方が書いてあります。

Installing and updating FreeBSD 11.0 release on a Raspberry Pi – solence

このようなやりかたでもよいのですが、本ブログでは別のやり方を紹介します。 それは、FreeBSDに標準であるパッケージの管理を利用する方法です。

FreeBSDの pkgは実はシステムのbaseでも使えるようになっています。 そこで、母艦でクロスビルドしbaseのパッケージを作成し、Web上に配置し、 Raspberry PIで pkgコマンドでアップデートをするという作戦です。

作りかた

ソースのチェックアウト

とりあえずチェックアウト先のディレクトリは /home/hogehoge/releng/12.0としておきます

# svn checkout http://svn.freebsd.org/base/releng/12.0 /home/hogehoge/releng/12.0

違うバージョンをビルドしたいときは 12.0を適切なものに置き換えてください。

パッケージの作成

以下のコマンドで行います。

# cd /home/hogehoge/releng/12.0 
# make TARGET=arm TARGET_ARCH=armv6 KERNCONF=RPI2 buildworld 
# make TARGET=arm TARGET_ARCH=armv6 KERNCONF=RPI2 buildkernel
# make TARGET=arm TARGET_ARCH=armv6 KERNCONF=RPI2 packages

各コマンドの意味は説明するまでもないので省略します。母艦のSPECにもよりますが、問題がなければ数時間後に/usr/obj/home/hogehoge/releng/12.0/repo/FreeBSD:12:armv6 以下にbaseのパッケージのレポジトリが作成されます。

このbaseのパッケージレポジトリにあるファイルやリンク(latestというシンボリックリンクがあると思います)をhttpでアクセス可能な場所にコピーします。ここでは

https://pkgbase.guru.gr.jp/FreeBSD-base/FreeBSD:12:armv6

でアクセスできる場所に置いてみました。

Raspberry PIの設定

以下の設定ファイルをラズパイ側で作成します。

/usr/local/etc/pkg/repos/FreeBSD-base.conf:

FreeBSD-base: {
  url: "https://pkgbase.guru.gr.jp/FreeBSD-base/${ABI}/latest",
  enabled: yes
}

updateの実行

Raspberry PI側で

# pkg update -r FreBSD-base 
# pkg upgrade

をするとビルドしたものが(必要なら)インストールされます。 なお、以下のページを参考にしました

PkgBase - FreeBSD Wiki

面倒な点としてfreebsd-updateと違って設定ファイルがマージされないことがあること。 pkgのソースをみると pkg add で設定ファイルをmergeをする仕組みは入っているようですが、 うまい感じにマージをしてくれないファイルが多々ありました。3way mergeが必要なので、1つ前の設定ファイルがなんであるかわからないといけないので、それが分からない以上やむを得ないのかな?という気もします。実際上記wikiでは mergemasterまたは etcupdateを使えとあります。ただどちらの場合であっても /usr/srcが必須でしょう(未検証)

ただ実際は/etc以下でいじくるファイルはごく一部です。単純に上書きできない場合は当該ファイルが pkgnewという拡張子が付加されて保存されるようなので、私はfindでさがして手動で修正するということにしました。

またbaseに追加された/削除されたというのが判断できないので上記wikiに記述してあるコマンド

$ diff <(pkg rquery -r FreeBSD-base %n) <(pkg query -e '%o = base' %n) | grep "^[<>]"

で判断して手動で追加/削除をする必要もあります。

なお、上記URLは暫く残しておきます。興味がある方は自己責任でどうぞ。

Posted by issei

カテゴリ: BSD