Raspberry Piで FreeBSD 動かしてみた その3

Raspberry Piで make buildworldをしてみたら、24時間以上かかりました。こういう場合はクロスコンパイルのほうが現実的でしょう。

クロスコンパイルで make worldをするやり方は「ハンドブックを見れ」の一言で終わりといえば終わりなんですが、ざっとしたやり方を書いときます(自分も毎回ハンドブック読んでで思い出すのが面倒になってきたんで)

まず、クロスコンパイルは 別のFreeBSDを用意する必要があるわけですが、手元にamd64の 9.1-RELEASEがあるのでそれで挑戦。

ソース一式を展開したら(前のエントリ参照)いくつかのパラメータを設定してmakeするわけですが、これは三種類やり方があります。一つは/etc/make.confに記述する方法、もう一つはmakeのコマンドラインのオプションに指定する方法、もう1つは環境変数で定義しておく方法です。

どれを選ぶかは好みの問題。

とりあえず環境変数に定義する方法とコマンドラインのパラメータの双方でビルドすることにします。

絶対設定しないといけないのは

TARGET および TARGET_ARCH

です。これはビルドするアーキテクチャのタイプ。それぞれarmとarmv6に設定。tcshならこんな感じ。
setenv TARGET arm
setenv TARGET_ARCH armv6
sh大好きっ娘なら敢えて書くまでもないだろうけど、
export TARGET=arm
export TARGET_ARCH=armv6
あとはソースディレクトリのトップで次のようにビルドすればOK。
make MALLOC_PRODUCTION=yes buildworld
make WITH_FDT=yes KERNCONF=RPI-B buildkernel 
これで、/usr/obj 以下にオブジェクトが作成されていくと。 ちなみに、この/usr/objを変えたいときは、環境変数
MAKEOBJDIRPREFIX
を変更すればOKです。

で、ビルドが終わった後のインストールですが、Raspberry PiはSDで動いているので、SD抜いてそれをそのままクロス環境のBSDでマウントしちゃうのが早いでしょう。USBのカードリーダとか用意しておくべし。

私の環境では da2に見えますので、
# mount /dev/da2s2a /mnt
とかで/mntにマウント。そののち
make DESTDIR=/mnt KERNCONF=RPI-B-issei installkernel
make DESTDIR=/mnt installworld
です。注意点としてFreeBSD 9.1では installするときは auditdistdなるユーザがいないとか怒られてしまうので、vipw等で以下の行を追加してuserを追加しましょう。
auditdistd:*:78:77::0:0:Auditdistd unprivileged user:/var/empty:/usr/sbin/nologin
追加したくねーよ!って人はjail環境作ってからやるとか、まぁそのあたりは好みの問題で(こればっかりだな)。こんな感じです。

まとめると、ポイントは TARGETと TARGET_ARCH。

配布されてるSDのイメージに上書きするならこれでよいのですが、まっさらに一からビルドしたいというときはnewfsで/dev/da2s2aをまっさらにしてから、先ほどに加えて
make DESTDIR=/mnt distribution
とするとよいでしょう。/etc/fstab /etc/rc.conf /boot/loader.rc /etc/ttysあたりを書き換えてやらないととても寂しいことになりますが。
Posted by issei

カテゴリ: BSD