takanaoの作業ログ

takanaoの作業のログなどをつづってみます

netbsd on Raspberry Pi2 日記(6)

distccでパッケージを作る

ここまでで、NetBSD的にはだいたい動く状態なので、ここからは普通に使っていく。

netbsdのパッケージシステムは、pkgsrcなのだが、BSD系のパッケージシステムは、伝統的にはソースからビルドする系のシステムになっていて、pkgsrcもその例に漏れない。

Raspberry Pi2 が ARM core x 4 @900MHzとはいっても、パッケージをガンガンコンパイルするにはちょっと非力なため、パッケージコンパイルのために分散コンパイル環境を作っていく。

ここまでで、母艦側でクロスコンパイラを使ってカーネルなどのコンパイルをしているので、クロスコンパイラはすでにあるから、これを使って、分散コンパイル環境を設定していく。

母艦側の設定

母艦側はFreeBSDだったので、pkgでdistccを入れる。

# pkg install distcc

母艦側の /opt/NetBSD-7.0/usr/toolsarm/bin/ の下にクロスコンパイラ群がある。このうち、c++, cc, g++, gccがdistcc側から呼ばれる様なので、/opt/NetBSD-7.0/distcc/にsymbolicリンクを貼ってみる

# mkdir /opt/NetBSD-7.0/distcc
# cd /opt/NetBSD-7.0/distcc
# ln -s ../usr/toolsarm/bin/armv7--netbsdelf-eabihf-c++ c++
# ln -s ../usr/toolsarm/bin/armv7--netbsdelf-eabihf-gcc cc
# ln -s ../usr/toolsarm/bin/armv7--netbsdelf-eabihf-g++ g++
# ln -s ../usr/toolsarm/bin/armv7--netbsdelf-eabihf-gcc gcc

これで、 /opt/NetBSD-7.0/distcc にコンパイラ類が置かれたことになるので、母艦側のdistccdの distccd_pathに設定する。

rc.confに以下を設定

distccd_enable="YES"
distccd_flags="--listen 母艦のIPアドレス --user distcc --daemon -P /var/run/distccd.pid -a 受け付けるネットワークアドレス(192.168.0.0/24など)"
distccd_path="/opt/NetBSD-7.0/distcc"

で、distccdを起動しておく

# service distccd restart

raspberry pi2 側

まず、distccをいれるために、pkgsrcを展開して最新化する

$ ftp ftp://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc.tar.gz
$ su -
# tar -xzpf pkgsrc.tar.gz -C /usr
# cd /usr/pkgsrc
# cvs update -Pd

詳しくは、以下の公式あたり http://www.jp.netbsd.org/ja/docs/pkgsrc/getting.html#getting-first

次に、distccをインストール。

# cd /usr/pkgsrc/devel/distcc
# make install
# make clean clean-depends

mk.confを書き換え

PKGSRC_COMPILER=distcc gcc
DISTCC_HOSTS=母艦のIPアドレス

ここまでできると、次のコンパイルから、ある程度大きなソースはdistccの母艦側で処理されるようになる。

母艦側のsyslogに、以下の様に出ているはず(unicornは母艦のホスト名)

Oct 19 23:23:27 unicorn distccd[819]: (dcc_job_summary) client: 192.168.10.11:65516 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:327ms gcc gm_qnx4.c
Oct 19 23:23:27 unicorn distccd[957]: (dcc_job_summary) client: 192.168.10.11:65515 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:383ms gcc gm_beos.c
Oct 19 23:23:28 unicorn distccd[957]: (dcc_job_summary) client: 192.168.10.11:65514 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:353ms gcc gm_xfs.c

netbsd on Raspberry Pi 2 日記(5)

ロスコンパイルでユーザランドを作る

ロスコンパイルでユーザランドを作るのは、以下

$ cd /opt/NetBSD-7.0/usr/src
$ ./build.sh -O ../objarm -T ../toolsarm -m evbarm -a earmv7hf -U -u distribution

これで、母艦側の /opt/NetBSD-7.0/usr/objarmの下に、ユーザランドバイナリなどが生成される。

ただ、このままだと、ターゲットであるRaspberry Pi2に持って行きづらい(パーミッションとかが違うし)ので、 NetBSDの配布物のようにsets/*.tarを作ってから持って行くと便利。

ユーザランドのtarballを作る

$ cd /opt/NetBSD-7.0/usr/src
$ ./build.sh -O ../objarm -T ../toolsarm -m evbarm -a earmv7hf -U -u sets

これで、母艦側の /opt/NetBSD-7.0/usr/objarm/releasedir/evbarm/binary/sets の下に、tarballができる。

$ ls /opt/NetBSD-7.0/usr/objarm/releasedir/evbarm/binary/sets/
MD5     comp.tgz    man.tgz     tests.tgz
SHA512      etc.tgz     misc.tgz    text.tgz
base.tgz    games.tgz   modules.tgz

これらのファイルを、Raspberry Pi 2側に持って行ってから展開すると、 バイナリを更新できる(etc.tgzは除く)。

例えば、/tmpにtarballをコピーしていたら、以下のような感じ

$ ls /tmp
MD5     comp.tgz    man.tgz     tests.tgz
SHA512      etc.tgz     misc.tgz    text.tgz
base.tgz    games.tgz   modules.tgz
$ cd /
$ sudo tar xvpzf /tmp/base.tgz
$ sudo tar xvpzf /tmp/comp.tgz
 :

etc.tgzは、上書きすると設定が消えるので、etcupdateとかでアップデートする。NetBSDの公式の Chapter 33. Updating an existing system from sources あたりに書いているみたい。

$ sudo /usr/sbin/postinstall -s /tmp/etc.tgz check
$ sudo /usr/sbin/postinstall -s /tmp/etc.tgz fix
$ sudo /usr/sbin/etcupdate -s /tmp/etc.tgz

netbsd on Raspberry Pi 2 日記(4)

ロスコンパイル環境の作成

とりあえず、NetBSD入れたらカーネルコンパイルするよね。ってことで、 ログ周りを設定する前に、コンパイル環境を作る

もちろん、Raspberry Pi 2自身でコンパイルとかしてもいんだけど、 SDファイルシステムのマシンだと遅そうなので、別なマシン上でクロスコンパイルすることにする。

NetBSD 7.0の母艦があれば、簡単で良いのだけど、手元にはなかったので、 ファイルサーバとして動かしている、FreeBSD 10.2 (amd64)に環境を作っていく。

ソースコードの取得と展開

NetBSD 7.0のソースを取得して展開する。 ソースコードは、netbsdNetBSD-7.0/source/setsの下にあるので、 以下のような感じで取得する。もちろん、お好きなミラーサイトから取ってきていい。

$ mkdir ~/netbsdsrc
$ cd ~/netbsdsrc
$ wget ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-7.0/source/sets/{gnusrc,sharesrc,syssrc,src}.tgz

で、アーカイブを解く。 例えば、/opt/NetBSD-7.0に展開するなら、以下のような感じになる。 /opt/NetBSD-7.0/usr/src の下にソース一式が展開される。

$ mkdir /opt/NetBSD-7.0
$ cd /opt/NetBSD-7.0
$ for a in ~/netbsdsrc/*.tgz; do tar xfz $a; done 

ロスコンパイラ作成

ロスコンパイル用のコンパイラなどを作っていく。 この例だと、/opt/NetBSD-7.0/usr/toolsarm に、コンパイラなどが出来上がる

$ cd /opt/NetBSD-7.0/usr/src
$ ./build.sh -O ../objarm -T ../toolsarm -m evbarm -a earmv7hf -U -u tools

kernel作成

kernelの作成自体は、他のNetBSDとかと同じ。 /opt/NetBSD-7.0/usr/src/sys/arch/evbarm/conf/ の下のRPI2Raspberry Pi 2用のカーネルなので、 これをコピーして編集後、build.shでカーネルコンパイルする

$ cp RPI2 MYKERNEL
$ vi MYKERNEL
好きなように編集する
$ ./build.sh -O ../objarm -T ../toolsarm -m evbarm -a earmv7hf -U kernel=MYKERNEL

で、 /opt/NetBSD-7.0/usr/objarm/sys/arch/evbarm/compile/MYKERNEL/netbsd.binカーネルができているので、これを、ブート用のカーネルにコピーして再起動する。

$ sudo cp /boot/kernel7.img /boot/kernel7.old
$ sudo cp netbsd.bin /boot/kernel7.img
$ sync; sudo shutdown -r now

netbsd on Raspberry Pi 2 日記(2)

インストール

ブート

ブートできるmicro SDができたので、Raspberry Pi 2に、micro SDと電源とHDMIとEtherケーブルをつけてブートする。

micro SDは、FAT領域と、netbsd領域に区切られるようで、FAT領域側にブート時のkernelなどが、格納されている模様。

電源を入れると、miscro SDにうまくイメージが書けていれば、HDMI接続したディスプレイに、ブートメッセージが出る。 初回起動時に、micro SDの容量に合わせて、netbsd側のファイルシステムを拡張するので、初回のブートは時間かかる。 ファイルシステムが拡張されると、再起動してインストールは終わり。あっけないほど簡単。

再起動後は、ether接続したネットワークに、DHCPサーバがいれば、dhcpで払い出されたIPアドレスをとってきた状態で 起動しているので、ここから色々修正していく。

hostnameなどの設定

起動時には、hostnameがarmv7になってたりとかするので、修正する。

netbsdだと、大抵の設定は、/etc/rc.confから変えられるので、ここを変えていく。 が、他の方法でも設定できるので、好きな方法でどぞ。

/etc/rc.confの修正箇所

rc_configured=YES
hostname=ホスト名
defaultroute=デフォルトゲートウェイのアドレス
dhcpcd=NO (IPアドレスを固定で振る場合dhcpclientは止めとく)
mdnsd=NO (mdnsresponderはいらなそうなので止めとく)
no_swap=YES (ブート用のmicro SDでswapしたくないので、一旦止める)
savecore=NO

IPアドレス設定

ifconfigすると、NICは、usmsc0という名前に見えていたので、いじっていく。

/etc/ifconfig.usmsc0

192.168.10.11 netmask 255.255.255.0 media autoselect

ちなみに、例えば、これも、 rc.confに、

ifconfig_usmsc0="192.168.10.11 netmask 255.255.255.0 media autoselect"

と書いても良いはず

リゾルバの設定

/etc/resolv.conf

nameserver DNSのアドレス

タイムゾーン

タイムゾーンUTCになっているので、JSTにする

# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

ユーザ追加

インストール直後は、rootユーザしかなくて、リモートログインできるユーザがいないので管理用のユーザを追加しておく

# useradd -m ユーザ名
passwd ユーザ名

追加したユーザは、suできるように、/etc/groupを編集して、wheelグループにユーザ名を追加しておく。

rootのパスワード設定

初期状態だと、rootのパスワードがないので、rootのパスワードを設定しておく

# passwd

再起動すると、ホスト名が変わって固定IPアドレスで起動するので、追加ユーザでログインしてみる

netbsd on Raspberry Pi 2 日記(3)

netbsdマシンが立ち上がったので環境を作っていく。

ここまでにやっていることは、

  1. imageダウンロードする
  2. SDカードに書き込む
  3. 起動する

ぐらいなもんで、昔、MobileGearnetbsd-hpcmipsを入れていた頃の手順から考えると、ものすごくやることが少なくて、世の中進化してんだなーと感心する。

packageのインストール

Raspberry Pi 2 の ARM x 4coreは、200MHzそこらのmipsだったMobile Gearよりは早いだろうけど、micro SDで動くマシンでpkgsrcをコンパイルして入れていくのは時間がかかりそうなので、当座は、バイナリパッケージを入れていく。

バイナリパッケージは、PKG_PATHに、バイナリパッケージのURLを設定しておいてから、pkg_addでバイナリパッケージを入れていく。 例えば、こんな感じ

# PKG_PATH=http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/earmv7hf/7.0_2015Q3/All/
# export PKG_PATH
# pkg_add bash
# pkg_add sudo

ロスコンパイル環境とか分散コンパイル環境は追って作るとする。

次の作業予定

  • /varの書き込み量を減らす方法を考えておく。
  • syslog設定

参考にしたもの: http://www.jp.netbsd.org/ja/docs/pkgsrc/using.html

netbsd on Raspberry Pi 2 日記(1)

Raspberry Pi 2 買いました

raspberry piにはあんまり興味なかったんだけど、新しいsyslogサーバが欲しかったのと、netbsd動くらしいという話を聞いて買ってみた。

2個目を買った時に忘れないように、インストール日記をつけることにする。

参考にしたもの

用意した機材

  • Raspberry Pi 2
  • 電源:ankerの10A充電器と、micro USBケーブル
  • 純正ケース
  • HDMIケーブル
  • USBキーボード
  • microSD (transcendのもの)
  • 作業用マシン: macbook pro + sdリーダー

SDカード用のイメージの準備

Raspberry Pi 2には内蔵ストレージはなくて、micro SDスロットに、OSなどのイメージを書いたmicro SDを刺して、そこからブートする。

ということで、netbsdのイメージを、micro SDに書き込む必要がある。

使うイメージだけど、Raspberry Pi 2 サポートは、netbsd 7.0からみたいなので、7.0リリースのイメージを取得する。RPI2だと、 NetBSD-7.0/evbarm-earmv7hf/binary/gzimg/armv7.img.gz とかを持ってくる。

例えば、

# wget ftp://ftp2.jp.netbsd.org/pub/NetBSD/NetBSD-7.0/evbarm-earmv7hf/binary/gzimg/armv7.img.gz

みたいな感じ

展開

持ってきたイメージは、圧縮されているので、

# gunzip armv7.img.gz

で展開する。展開すると1.1GBくらいになった

ブートできるSDを作る

SDカードの初期化

raspberrypi.orgの公式イメージの一つであろうNOOBSの作り方、NOOBS-setupによると、SDカードはSD-AssociationのSD Formatterで初期化しろとある。SD FormatterはSD-Associationからダウンロードできるので、言われた通り、SD Formatterを使って、SDカードを初期化する。

イメージの書き込み

初期化後は、イメージを書き込むが、その前にmicro SDのデバイス名を確認。この例だと、disk1がmicro SDカード

$ sudo diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            499.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.9 GB    disk1
   1:             Windows_FAT_32 NO NAME                 15.9 GB    disk1s1

次に、micro SDのdiskを一旦unmount

sudo diskutil unmountdisk /dev/disk1

で、イメージ書き込み。確認したsdカードのデバイス名に書き込む

sudo dd bs=1m if=armv7.img of=/dev/rdisk1

しばらく待つとイメージが入ったmicrosdができる。出来上がったらmicro SDカードを、Finderからアンマウントして終わり。

FreeBSD 10.0Releaseにアップデートしたときのメモ

FreeBSD 10.0 RELEASEが出ていたのでアップデート。
今回ABIがかわっていたのに、freebsd-updateでアップデート後、pkgの再インストールを忘れて困る。
具体的にはアップデート後にpkgコマンドで各パッケージをアップデートしようとしても、ライブラリがかわったっす的なエラーで、pkg自体が実行できなくなってたり。
結局pkg-staticを使って復旧しました。