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のソースを取得して展開する。 ソースコードは、netbsdのNetBSD-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/
の下のRPI2
がRaspberry 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のアドレス
タイムゾーン
# 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マシンが立ち上がったので環境を作っていく。
ここまでにやっていることは、
- imageダウンロードする
- SDカードに書き込む
- 起動する
ぐらいなもんで、昔、MobileGearにnetbsd-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設定
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からアンマウントして終わり。