8月 302015
 

と、いうことで、ちょっと前に掲載した「FreeBSD/arm のクロスコンパイル環境をもっと簡単に作る。」では ports のクロスコンパイル環境が整ったので、早速 X と xfce4 のコンパイルに挑んでみました。

Raspberry Pi 2 で X を動かすためにインストールした主なものは以下の通り。あ。 ports の枝番は削っています。

・xorg-7.7
・xfce-4.12
・emacs24-24.5
・zh-fcitx-4.2.8.6
・ibus-1.5.9
・ja-mozc-server-2.17.2106.102

X はウィンドマネージャも含めてフルスペックで、更に日本語入力もできないとダメだよね。と、いうことで ibus と fcitx と mozc までコンパイルしました。あと、xfce4 は Thunar をインストールし、デスクトップに必要なマルチメディア系のアプリまでインストールしています。
コンパイルした ports の総数は 大体 490 個くらいっ!! 自分でいうのもなんだけど、すげーすげー;-)。

ちなみに FreeBSD/arm は 8GB の MicroSD に Xorg と xfce4 をインストールして / パーティションは約 30% ほど消費しています。

クロスコンパイル環境では portmaster -D -a も動作するのでバージョンアップにも対応しています。コンパイルしたバイナリは以下の URL にあるので良かったら持って行ってください。

http://distfiles.icmpv6.org/packages/All.armv6/
ftp://ftp.icmpv6.org/packages/All.armv6/

今後、 ports-CURRENT を追いかけて行って portmaster -D -a してバージョンアップしたものもどんどん追加していく予定です。

 
さてと。先に ports/packages の内容を書いてみましたが、実際にクロスコンパイル環境でコンパイルしたので、そのことについてちょっと書いてみます。

 
1). クロスコンパイル環境の準備
以前のエントリで ports の ports-mgmt/poudriere-devel/ を試したと書いているのですが、そのとき

# poudriere jail -c -j CURRENT-armv6 -m svn -a arm.armv6 -v head

 
を実行したので FreeBSD/arm CURRENT の jail 環境ができてしまいました。これを tar で固めて、最速の仮想マシン上に持って行ってクロスコンパイル環境を構築しました。FreeBSD/amd64 10.1-RELEASE-p16 の環境に tar で固めた FreeBSD/arm 環境を展開し、前回記載した chroot 用スクリプトで環境を整えて、実際に ports の make install を行いました。

母艦の FreeBSD/amd64 10.1-RELEASE-p16 上に qemu をインストールして FreeBSD/arm CURRENT に chroot します。 /usr/ports は母艦側のディレクトリを mount_nullfs して利用し、ひたすら make という、以前書いたのを実際にやってみた。と、いうことですね。

環境の作り方は前回のエントリを参考にしてください。

 
2). chroot はネットワークが使えない
chroot した FreeBSD/arm の環境で ports を make しようとしても make fetch でエラーになりソースコードを取りに行ってくれません。
chroot した状態で ifconfig -a とか打つと解りますが qemu が Qemu unsupported ioctl などというメッセージを出します。と、いうことで chroot した環境ではネットワークは使えないと認識したほうが良いでしょう。

では、ports のソースコードはどうやって取りに行くかというと、母艦側で揃えるしかありません。そもそも /usr/ports/ は母艦側のディレクトリを FreeBSD/arm のディレクトリに mount_nullfs しているので見ているところは一緒です。

母艦側でコンパイルしたい ports で以下のコマンドを打ちます。以下は editors/emacs/ のコンパイルの例です。

# cd /usr/ports/editors/emacs
# make fetch-recursive

 
ports のコンパイルのオプションには fetch-recursive というのがあるんですね。依存関係でインストールされる ports も含めてソースコードをダウンロードして来てくれます。 make config-recursive ってのは依存関係にある全ての ports の make config を実行しますが、それと似たようなモノですね。それにしても嬉しい make のオプションです。

母艦側でソースコードがゲットできたら FreeBSD/arm 側で実際に ports の make に入ります。
以前のエントリでも書きましたが遅いのでひたすら待ちましょう・・。

 
2). クロスコンパイル環境でコンパイルできないモノがある
いやー。さすがに 490 個くらいコンパイルすると qemu+chroot の環境でコンパイルが通らない ports が何個かありました。以下はそのリストです。

・emacs-nox11-24.5,3
・emacs24-24.5_1,3
・jsoncpp-0.6.0.r2_2
・py27-cairo-1.10.0_2
・tdb-1.3.4,1
・talloc-2.1.2
・tevent-0.9.24
・ja-mozc-server-2.17.2106.102

有名どころでは emacs ・ mozc 辺りでしょうか。 samba 辺りで利用される t シリーズ(tdb ・ talloc ・ tevent)も make が通りませんでした。

原因としては chroot 下で動作している qemu が make の実行時に core dump してしまいます。なのでクロスコンパイル環境では make が通りませんでした。

上記の ports の場合、実機 (Raspberry Pi 2 上の FreeBSD/arm) では make が通ったので、実機で作成した packages をクロスコンパイル環境に pkg add してあげて make を続行します。

 
クロスコンパイル環境で make が通らなくても実機でコンパイルが完走すれば良いのですが、実機でもコンパイルが通らないものがありました。
lang/spidermonkey170 です。これは困った。 FreeBSD の ML でも話題に上がっているようです。

FreeBSD/amd64 では問題なくコンパイルが通るのに FreeBSD/arm では通らない。なんでやねん?! と、いうことで試行錯誤を重ねた結果 FreeBSD/arm でむりくりコンパイルを通しました。

以下、手順です。

o. FreeBSD/arm 側で以下のコマンドを実行

# cd /usr/ports/lang/spidermonkey170
# make configure

 
o. 母艦側で続けて実行

# cd /usr/ports/lang/spidermonkey170/work/mozjs17.0.0/js/src
# gmake clean
# configure

 
FreeBSD/arm で実行した make configure の結果を母艦側で全てぶっ飛ばしてソースに対して FreeBSD/amd64 側で configure を実行します;-)。
その後 FreeBSD/arm 側に戻って make install を実行すると無事に make が通ります。これで ports 自体はインストールできるので、まぁヨシとしておきましょう;-)。

あ。僕は mozjs17.0.0 ってのはどこで利用されているのか知らないので実際に正しい動作をしているのか、よく判りませんf(^^;;。

関連性でインストールされるので必要だからとりあえず ports でコンパイルを通すワザを発見した。と、いう感じですf(^^;;。

 
と、ここまで書いたと、いうか、コンパイルを通したのですが、その後、原因が判明したようですね。どうやら llvm のバグで ARM の場合に発生するようです。

FreeBSD では gcc を使うようにするとコンパイルが通るようですね。

再度書きますが、僕の make の方法は ports の関連性に必要な他のプログラムのコンパイルを進ませるためにむりくりの方法を編み出した。と、いうことにしておいてくださいf(^^;;。

http://comments.gmane.org/gmane.os.freebsd.devel.cvs.ports/349757

ちゅーこって FreeBSD/arm 用に gcc-4.8.5 を make しないと・・。 orz

 
とまぁ、こんな感じで地道に qemu+chroot の環境で ports をじっくりと make していきます。 490 個程度の ports をコンパイルするのに、途中で make fetch やコンパイルエラーで止まることもあるので、大体一週間程度でしょうかねぇ。 ひたすらがんばります。

 
3). Raspberry Pi 2 で X 起動
一通り packages 化された ports が出来上がったので全てを実機にインストールして実際に X を起動してみます。
今回、僕がチョイスしたバージョンは FreeBSD 11.0-CURRENT r286285 です。このバージョンの CURRENT は HDMI にディスプレーを接続するとフラッシュのようにブラックアウトする場合があるのでちょっと困りもの。 OS と、いうか CURRENT の問題なのか、ハードウェアの問題なのかは良く判りません。
あと、 r286285 は default の root のパスワードが設定してない!! ので シングルユーザに落として /etc/master.passwd の :*: の * を消してあげる必要があります。 orz
ちなみに r286893 では root のパスワードが設定してありました;-)。

 
さてと。気を取り直して ~/.xinitrc に xfce4 を起動するように記述して startx です。

おぉーーっ!!

IMG_2407_RPi2_FreeBSD_X_1

ディスプレーのすぐしたにあるのが Raspberry Pi 2 の FreeBSD で HDMI で表示しております。

xorg.conf のディスプレードライバには scfb を指定します。 ports 的には x11-drivers/xf86-video-scfb をインストールしてあげます。 vesa ではないです。

xfce4-terminal で文字を打つとぬるぬると動いていく感が良いですね。 NoAccel 感満載です;-)。

hald を動かすと USB のキーボード・マウスも無事に動作します。なので X の環境で利用する分には問題は無いですね。あとは細かいところの設定をしていくと xfce4 は無事に動作するようになるのではないでしょうか。

あ。mozc がどうも起動しないんですよね。 core dump する。まだ深くは追ってないのですが、環境整わせつつ、おいおい見ていきたいと思います。

多分 mozc_server を FreeBSD/arm でコンパイルして動かしたのは、僕が世界初ではないかなぁ;-)。

 
と、いうことで今回は ports のクロスコンパイル環境で make したものを利用して Raspberry Pi 2 上の FreeBSD/arm で X まで動かしてみました。

これでバリバリと Raspberry Pi 2 を利用するようになるかな? データセンタに行った時とかに NotePC の代わりに Raspberry Pi 2 を取り出してバリバリ仕事する。とか、良いかも;-)。

 
Raspberry Pi 2 に FreeBSD/arm インストールしたけど ports のコンパイルが大変なので断念している方、 packages を作ったので是非 X が起動するところを見てみてください。ただ、さすがに KDE4 を packages 化しようとは思わないですがf(^^;;。

僕はこのあと、どうしようかなぁ・・。

8月 172015
 

前回のエントリは「FreeBSD/arm の ports コンパイル環境の作成。」というヤツを書きました。

ports の ports-mgmt/poudriere-devel/ というのを利用すると FreeBSD/arm のクロスコンパイル環境ができますよ。っていうやつです。

しかし、環境構築が大変すぎる。もっと簡単にできないのか?などと思うわけですね。環境構築に時間が掛かり過ぎる点は以下の辺り。

・FreeBSD のソース一式を svnweb から取ってきて make buildworld する。
・ports ツリー一式を portsnap で取ってきてインストールする。

時間が掛かり過ぎるよー。ってんで、今回はもっとお気楽に環境を構築する案を思いつきました。

ports-mgmt/poudriere-devel/ は jail に FreeBSD/arm のバイナリの環境を構築して qemu でエミュレートして動作しているようです。そのためにソースコード取ってきたり ports ツリー取ってきたりしているんですが、既にあるものを使おう。ってのが今回の趣旨です。

 
1). 準備するモノ
まずは Raspberry Pi 2 に FreeBSD をインストールします。多分 CURRENT が良いのかもしれないです。
Raspberry Pi 2 用の img を用意して SD カードに dd したら、同じバージョンの FreeBSD/amd64 の iso イメージもダウンロードしてきて、仮想環境に FreeBSD/amd64 をインストールします。あ。実機にインストールしても全然良いんですけどね;-)。

僕の場合、は以下のような環境を作りました。

o. Raspberry Pi 2 の FreeBSD/arm

FreeBSD wanchan.running-dog.net 11.0-CURRENT
FreeBSD 11.0-CURRENT #0 r284544: Thu Jun 18 19:36:01 UTC 2015
root@releng2.nyi.freebsd.org:/usr/obj/arm.armv6/usr/src/sys/RPI2  arm

 
o. 仮想環境上の FreeBSD/amd64

FreeBSD nyanchan.running-dog.net 11.0-CURRENT
FreeBSD 11.0-CURRENT #0 r284544: Thu Jun 18 12:24:12 UTC 2015
root@releng2.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64

 
ちなみに、仮想環境上の FreeBSD/amd64 が母艦になります。ここで FreeBSD/arm の ports の make をする予定です。

この後、母艦側で ports の emulators/qemu-user-static/ をインストールします。

これで、ほぼ九割の環境が整いました;-)。

ports-mgmt/poudriere-devel/ とかインストールする必要はありません。 jail 環境用に make buldworld もする必要はありません。

と、いうことでここでだいたいの構成がわかってきたと思いますが;-)。

 
2). 環境構築
まず、 Raspberry Pi 2 側の FreeBSD/arm で nfsd を起動します。

以下は /etc/exports の設定内容。

/   -network 192.168.1.0 -mask 255.255.255.0 -maproot=root
/   -network 2001:470:fe36:1234::/64 -maproot=root

 
強引ですねぇ。 / を NFS mount するようにします;-)。
あ。/etc/rc.conf の設定は今回は書かないです。

 
続いて母艦側の FreeBSD/amd64 側で nfs client を有効にします。こちらも /etc/rc.conf の設定は書かないですが、大丈夫ですね?

あとは母艦側で mount_nfs を実行します。

# mount_nfs -o rw wanchan:/ /home/armv6

 
うひょー。これで ports-mgmt/poudriere-devel/ でいうところの jail 環境ができてしまいました。ちょっと強引ですが。しかし、 make buildworld したのと一緒の状態ですね;-)。

一個、そして一回だけ、以下のコマンドを打ちます。

# cp -pr /usr/local/bin/qemu-arm-static /home/armv6/usr/local/bin/

 
FreeBSD/arm 側の /usr/local/bin/ に FreeBSD/amd64 上でコンパイルした qemu-arm-static をコピーしてあげます。これで準備は全て整いました。

 
まぁ、FreeBSD/arm の環境一式は色々抜き出すことができます。例えばインストールの iso イメージを mount して抜き出すとか、 ports-mgmt/poudriere-devel/ をインストールしてできた jail 環境を tar で固めて持ってくるとかですね。

しかし、 make buildworld を走らせるのは辛すぎる・・。ってのが今回の根本にあります。
make buildworld するより OS 二つインストールしたほうが速くないかい? みたいな;-P。

 
3). 環境構築スクリプト
まずは下に起動用のサンプルを書きますね。

#!/bin/sh

HOME=/
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin/:/usr/local/bin
export HOME PATH

export LC_CTYPE=ja_JP.UTF-8
export LANG=ja_JP.UTF-8

ARMV6DIR='/home/armv6'

kldload imgact_binmisc.ko

binmiscctl add armv6 --interpreter "/usr/local/bin/qemu-arm-static" --magic "\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00" --mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff" --size 20 --set-enabled

mount_nullfs -o rw /usr/ports ${ARMV6DIR}/usr/ports
#mount -t devfs devfs ${ARMV6DIR}/dev

chroot ${AMD64DIR}

 
解る人は何をしているか解ると思います。

jail 環境作るの大変なので直接 Raspberry Pi 2 の FreeBSD/arm の環境を利用してしまいます。
そして chroot しています。 jexec でなくとも chroot で十分なのでそうしているんですが。

ちと説明をすると、

kldload は自動的にしてくれると思います。

binmiscctl add armv6 の行は qemu を使うおまじないです。このコマンドを叩かないと chroot したときに /bin/tcsh えぐぜっくふぉーまっとえらー。とか言われます。

FreeBSD/arm 側に母艦の /usr/ports を mountしてあげます。これで portsnap で ports ツリー一式取ってくる必要がなくなります;-)。

mount -t devfs は多分必要ないと思います。 jail 環境の場合は必要なのですが、今回は nfs mount した環境なのですねぇ。

と、いうことで最後に chroot します。

うひひ。これで FreeBSD/amd64 上に FreeBSD/arm の環境が整いました。ports のコンパイルや(多分)カーネルのコンパイルなど、もう何でもできます;-)。

このスクリプトは別途置いといたのでダウンロードしてください。ブログだと binmiscctl add armv6 の行が全部表示できないので・・。

 
ちなみに FreeBSD/arm 側が CURRENT で母艦側が 10.1-RELEASE だったりすると ports のコンパイル時に uname -r のチェックでエラーになってしまいます。 chroot した FreeBSD/arm 側で uname -r すると母艦側のバージョン情報を返してしまいます。あたたた。なので、 FreeBSD/arm 側と母艦側では FreeBSD のバージョンを揃える必要があります。

が、uname には裏ワザがあるようで、

$ uname -r
10.1-RELEASE-p16
$ setenv UNAME_r 11.0-CURRENT
$ uname -r
11.0-CURRENT
$

 
おやおや。環境変数で uname -r が変更できるのね。と、いうこで母艦が 10.1-RELEASE-p16 で FreeBSD/arm 側は 11-CURRENT の状態で ports を make してみましたが ports のコンパイルが始まって configure の実行中に「存在しないシステムコール (core dumped)」などと言われてコンパイルが途中で止まってしまうのでありました。

ふむ。10.1-RELEASE から 11-CURRENT で機能が追加された分があったりして、その辺りが問題となってしまうのでしょうなぁ・・。まぁ、取り合えずはこの環境で利用するのはやめて、母艦側も FreeBSD/arm 側もバージョンは揃えた。と、いうことになります。

 
2015/08/18 加筆
母艦側の FreeBSD/amd64 と FreeBSD/arm 側でバージョンが違っていてもコンパイルできることが解りました。 母艦側の /usr/local/bin/qemu-arm-static と FreeBSD/arm 側のヤツを同じモノにすると無事に動作します。
母艦側の /usr/local/bin/qemu-arm-static は 10.1-RELEASE-p16 で make したモノ、 FreeBSD/arm 側のヤツは 11.0-CURRENT で make したモノ。と、いうふうに異なるバージョンで make したものがインストールされていると「存在しないシステムコール (core dumped)」と出て動作しません。
/usr/local/bin/qemu-arm-static は母艦側で make したものを FreeBSD/arm 側に cp してあげましょう。

 
4). 実際に使ってみると
ports の make は一応問題無しですね。母艦側で make install したやつは FreeBSD/arm で pkg info で見るとちゃんと見えます。 portmaster -D -a も無事に動きます。

しかし、遅い・・。今回の母艦側仮想マシンは CPU 4Core に 1GB のメモリを用意したのですが遅いです。
FreeBSD/arm を NFS しているし SD カード上に入っているのでディスクアクセスが遅いのかもしれません。

それにしても chroot した先で色々動かすと全て qemu がワンクッション入るのでそれが遅いのかもしれません。僕はまだ本格的に qemu を使ったことが無いのでアレですが、パフォーマンスチューニングすればもっと速くなるのかな?

28468 1 I  0:01.76 /usr/local/bin/qemu-arm-static /bin/tcsh -i
28672 1 S+ 0:00.83 qemu-arm-static -L /usr/gnemul/qemu-arm /usr/bin/make install
28689 1 R+ 0:00.48 qemu-arm-static -L /usr/gnemul/qemu-arm /usr/bin/make config

 
母艦側で ps -ax するとこんな感じで chroot 先の全てのプロセスが qemu 経由で動いております。

 
母艦側で ports のコンパイルとかすると、遅いけど律儀に進んでいきます。そのとき FreeBSD/arm 側では CPU ロードアベレージは低いままなので、頑張っているのは母艦側。と、いうことになり、遅いけど Raspberry Pi 2 は無傷な状態ですね。

 
とまぁ、こんな感じの FreeBSD/arm のクロスコンパイル環境なのですが、それにしても qemu が絡むと遅くてしょうがない(と、僕は思っているんだけど、本当に qemu が原因なのか、僕はまだ特定していません・・f(^^;;)。

その昔、 Linux で BB ルータ作っていたんですが、組み込み Linux の ARM のバイナリを i386 の Linux 母艦で作っていたときは qemu 使ってなくて、もっとサクサクとコンパイルができていたんだけど・・。
qemu を使わずに ports をコンパイルする方法をやっぱり見つけないとダメっぽい。ってのが、今回の結論でしょうかねぇ。

それにしても ports-mgmt/poudriere-devel/ で色々仕掛けが解ったので良かったです。そして、それを参考にして ports-mgmt/poudriere-devel/ を使わない、もっと楽したコンパイル環境構築がこうして解ったわけですしね。ネタになったかぁ? ;-)。

次回、qemu を使わない ports のコンパイル環境の構築について掲載できるか?! (多分無理;-)

実は某所で発表した FreeBSD/arm に関する資料があるのですが ports のコンパイル環境構築についても触れています。その時は qemu を使わずに頑張ったのですが、結局ダメでした。その資料を一応おいておきますね。

FreeBSD/arm Raspberry Pi 2 ModelB で動作確認

 
ちなみに文章は Microsoft Office2013 で作りましたが、資料の発表は okular (KDE 4 universal document viewer) で行いました。 calligrastage (KDE graphic art and office suite) では文章を作成するのに苦痛でして・・f(^^;;。
そして、okular は pptx をサクっと開けてしまうすぐれものです;-)。

8月 152015
 

ちょっと前に Raspberry Pi 2 を購入して、FreeBSD を動かした「Raspberry Pi2 で FreeBSD。」と、いうエントリを書きましたが、 FreeBSD/arm が動いておしまい。 ports のコンパイルは大変だぁ。などと書いていますが FreeBSD/amd64 で ports のクロスコンパイル環境が整ったのでちょっと書いてみたいと思います。

英語の文章はあちこちにあるようですね。あと、日本語のウェブもちらほらあるようです。

今回参考にさせてもらったのは以下の二つのサイトです。

http://www.textplain.net/tutorials/2015/cross-compiling-freebsd-ports-for-the-beaglebone-black/
http://www.dvatp.com/tech/armv6_freebsd_poudriere

このサイトを日本語化した。と、いうような感じでしょうかねf(^^;;。

で、結論から先に申しますと『クロスコンパイル環境で ports をコンパイルしても遅いよね。』ですX-(。 と、いうことで、ここから始まりです。

 
1). ports のインストール
母艦は FreeBSD/amd64 10.1-RELEASE です。ここに FreeBSD/arm CURRENT の ports コンパイル環境を構築します。カーネルの構築はしません。カーネルはブートイメージを利用します。

と、いうことで FreeBSD/amd64 や FreeBSD/i386 上で FreeBSD/arm の ports をコンパイルする環境を構築するには ports が用意されているんですね。それを利用します。

ports 的には ports-mgmt/poudriere-devel/ というのを利用します。こいつを make install すれば環境が整います;-)。ただ make config のオプションでは QEMNU を [X] する必要があります。
poudriere は jail と qemu の連合軍で FreeBSD/arm の packages を作るんですな。

無事にインストールできれば準備は完了。

 
2). poudriere の環境設定
ports から ports-mgmt/poudriere-devel/ をインストールしたら準備完了というのは大きな間違いでして、ここから長い道のりが待っております。orz
まず poudriere の設定フアイルとして /usr/local/etc/poudriere.conf というフアイルを用意してあげます。以下は僕が用意したそのファイルの中身です。

ZPOOL=zroot
ZROOTFS=/poudriere
FREEBSD_HOST=ftp://ftp2.jp.FreeBSD.org/pub/FreeBSD/
BASEFS=/usr/local/poudriere
SVN_HOST=svnweb.icmpv6.org
POUDRIERE_DATA=${BASEFS}/data
NOLINUX=yes
USE_COLORS=yes
PRESERVE_TIMESTAMP=yes
BUILDER_HOSTNAME=build
DISTFILES_CACHE=/usr/ports/distfiles

 
BASEFS= は環境を構築するディレクトリ。
SVN_HOST= は svnweb を指定します。おーーっとっ!! ここで登場だぁ;-)。
DISTFILES_CACHE= は ports のソース置き場ですね。

こんな感じでしょうか。

一個前のエントリで「svn:// に対応しました。」と、いうのを書いているのですが、 poudriere はソースコードを取りに行く時に port 3690 にアクセスします。 http:// で用意した svnweb にアクセスするとエラーになるんですね。なので、今回、僕は svnweb.icmpv6.org を svn:// 対応にした。と、いうことなんですけどもね。

と、いうことで config ファイルの準備が整いました。

 
3). qemu の設定と poudriere の実行
poudriere は qemu を利用しているので、先に qemu の設定を行います。

以下の呪文のようなコマンドを打つようです。あー。コマンドが突き抜けてしまっていますねf(^^;;。マウスでつかんだときに –set-enabled がついていれば OK 一番最後のオプションです。
このコマンドは QEMU に対するコマンドで、色々やるときに qemu-arm-static が呼ばれるようになります。

# binmiscctl add armv6 --interpreter "/usr/local/bin/qemu-arm-static" --magic "\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00" --mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff" --size 20 --set-enabled

 
これで準備は完了。続いて poudriere なコマンドを打ちます。

# poudriere jail -c -j CURRENT-armv6 -m svn -a arm.armv6 -v head

 
poudriere は合わせて jail 環境も構築するのですが、その時 CURRENT-armv6 が生成されます。任意の文字列で問題はありません。
アーキテクチャは arm.armv6 で、今回は CURRENT の環境を構築するので -v で head を指定しました。
10.1-RELEASE の環境を作りたい場合には release/10.1.0 とか指定します。 http://svnweb.icmpv6.org/base/release/ 配下にあるヤツを -v で指定します。 stable/10 とかでも良いと思います。

で、このコマンドを実行すると、なんとっ!! svnweb からソースコードを svn co して来ます。そして make buildworld が走りますっ!! 半日くらい放っときましょうかねf(^^;;。

あ。コンパイルが完了したファイルは母艦側の /usr/obj/arm.armv6/ に一式 obj ファイルが生成されます。

 
4). ports 環境の準備
上のコマンドが走っている最中でも ports の環境は生成できます。並行してやっても良いかも知れないですがディスクアクセスが大変なことになっているかも・・。仮想マシン上であると随分と遅くなります。

ports 環境を生成するためには以下のコマンドを打ちます。

# poudriere ports -c

 
こいつもまた冗長ぎみで、 portsnap とか動いて ports の環境一式持ってきて差分比較して展開するというだいそれたことをしてくれます。 orz
僕的には素直に母艦の /usr/ports を symlink もしくは mount_nullfs すれば済むじゃないかっ!! と思うんですけどもね。
けど、それをやってこの工程を省くと /usr/local/etc/poudriere.d/ports/default/mnt がねーぞ。ぼけっ!! などと怒られるのであります。 orz

と、いうことで、これで ports の環境が整いました。ここまででシーケンシャルにやると大体八時間位かかりますかねぇ。ひたすら待つことになります。

 
4). さて。いよいよ ports のコンパイルだっ!!
準備が整ったのでいよいよ ports の make をします。コマンドは二つ。

まずは make config に相当するコマンドになります。

# poudriere options -j CURRENT-armv6 dns/libidn

 
-j で jail の環境を指定します。その次にコンパイルしたい ports を指定します。今回は dns/libidn/ をコンパイルする予定です。
上記で make config 相当がはしります。あ。正確に言うと make config-recursive が走ります。関連性でインストールされる ports の全ての make config が走ってくれます。
続いていよいよコンパイル。

# poudriere bulk -j CURRENT-1armv6 dns/libidn
[00:00:00] ====>> Creating the reference jail... done
[00:01:04] ====>> Warning: !!! Jail is newer than host. (Jail: 1100078, Host: 1100077) !!!
[00:01:04] ====>> Warning: This is not supported.
[00:01:04] ====>> Warning: Host kernel must be same or newer than jail.
[00:01:04] ====>> Warning: Expect build failures.
[00:01:05] ====>> Mounting system devices for CURRENT-armv6-default
[00:01:05] ====>> Mounting ports/packages/distfiles
[00:01:05] ====>> Stashing existing package repository
[00:01:05] ====>> Mounting packages from: /usr/local/poudriere/data/packages/CURRENT-armv6-default
[00:01:05] ====>> Copying /var/db/ports from: /usr/local/etc/poudriere.d/CURRENT-armv6-options
[00:01:06] ====>> Raising MAX_EXECUTION_TIME and NOHANG_TIME for QEMU
[00:01:06] ====>> Starting jail CURRENT-armv6-default
[00:01:17] ====>> Logs: /usr/local/poudriere/data/logs/bulk/CURRENT-armv6-default/2015-08-14_12h50m22s
        :

 
こんな感じで始まります。

がっ!! しっかしっ!! 遅いっ!! japanese/nkf とかコンパイルしても全然遅い。ヘタしたら FreeBSD/arm 上で make install したほうが速いんじゃね?と思えるくらい遅くてうんざりです。 orz

あと、 DISTFILES_CACHE=/usr/ports/distfiles を指定しているんだけど、この中に無いヤツは勝手に取ってきてくれないようで、事前に入れておく必要があったりします。

思いの外使えない状態かなぁ・・。

 
5). 環境についての説明
poudriere は設定フアイルとして /usr/local/etc/poudriere.conf と /usr/local/etc/poudriere.d/ を利用します。 /usr/local/etc/poudriere.d/ のほうは下を覗くと色々あります。 jail 環境を作り直したい場合には jails/ ディレクトリをサクっと rm すれば良いです。あ。これはイリーガルなやり方で、上記の URL では以下のコマンドを打て。と、書いてありますね;-)。

# binmiscctl remove armv6

 
僕はこのコマンドは打ったことないです;-)。

 
実際にできた ports ですが、設定ファイルで指定した BASEFS=/usr/local/poudriere の中にできます。
/usr/local/poudriere/data/packages/CURRENT-armv6-default/.building/All/ の中とかですね。途中のディレクトリに All@ とか symlink されたものがあり、その中を見ても良いかと思われます。

poudriere ports -c で生成した ports ツリーは /usr/local/poudriere/ports/default/ にあります。僕は portsnap とか使ったことないので、このディレクトリで svn co 叩いても良いかと思われます。

# cd /usr/local/poudriere/ports/default/
# svn co http://svnweb.icmpv6.org/ports/head ./

 
これでいつも最新の ports-CURRENT が手に入る。しかし、その分コンパイルしないとダメですけどね・・。

 
5). ports 一括コンパイル
最後にですが、必要な ports 一括コンパイルの方法を書いておきます。

まず、ports の一覧が書かれているファイルを用意します。仮に /root/pkglist.txt としておきましょうかねぇ。

japanese/nkf
games/sl
misc/lv
japanese/w3m
editors/emacs-nox11

 
自分の FreeBSD/arm で動かしたい ports をドドドとリスト化すると良いですね。

その後まずは make config-recursive に相当する以下のコマンドを実行します。

# poudriere options -j CURRENT-armv6 -cf /root/pkglist.txt

 
上にも書きましたが、関連性を含めて make config を実行してくれます。それにしても /etc/make.config に相当する指定はできないのかなぁ? jail の中に用意すればよいのかな?

続いて make します。

# poudriere bulk -j CURRENT-armv6 -cf pkglist.txt

 
あとは時間が掛かるので寝てしまい、うまくいけば朝には完成している。と、いう感じでしょうか。

 
とまぁ、こんな感じで FreeBSD/amd64 上で FreeBSD/arm-CURRENT の ports が packages として構築できると思います。

それにしても遅いのでどうしようか悩み中なのですけど・・。

皆さんも時間があったら試してみてください。

8月 132015
 

以前のエントリで「SVN サーバを構築して FreeBSD のソースをミラーする。」と、いうのを書いたのですが、これはプロトコル的には http:// にしか対応していないんですね。svn co には http: とか https: で十分なのですが、そーではなく、ちゃんと port 3690 に対応したデーモンも起動してあげる必要がある。と、いうことですね。

と、いうことで今回は port 3690 で svn co できるようにします。

なお、 svn のミラーサイトの構築に付いては上の「SVN サーバを構築して FreeBSD のソースをミラーする。」をまず初めに読んでたください。その環境ができあがったあとの話として、今回のエントリとなります。

 
1), /etc/service の確認
default の FreeBSD の設定で入っているので、どーでも良い話なのですが、一応、以下のコマンドを叩いて確認します。

$ grep svn /etc/services
svn             3690/tcp   #Subversion
svn             3690/udp   #Subversion

 
大丈夫そうでしょうかね。

 
2), デーモンの設定
subversion をインストールすると svnserve というのが /usr/local/bin/svnserve としてインストールされています。こいつに -d オプションを指定してあげるとデーモンモードで起動して port 3690 に対してアクセスできるようになります。

/usr/local/etc/rc.d/svnserve と、いうファイルがあると思うので、そこの上の部分を持ってきて /etc/rc.conf に設定します。

僕の場合は以下のように指定しました。

svnserve_enable="YES"
svnserve_flags="-d --listen-port=3690 --listen-host 0.0.0.0"
svnserve_data="/home/svnweb"
svnserve_user="svn"
svnserve_group="svn"

 
svnserve_data で svn 用のディレクトリを指定します。
svnserve_user と svnserve_group の svn というのは存在していなかったのでユーザとグループを作成しました。

以上で設定は完了。あとは service svnserve start とすれば起動することでしょう。
telnet で port 3690 が開いているか確認します。

 
3), inetd での起動
svnserve は inetd 経由でも起動できるようです。 /etc/inetd.conf には以下の行を追加してみてください。

svn stream tcp nowait svn /usr/bin/svnserve svnserve -i
svn stream tcp6 nowait svn /usr/bin/svnserve svnserve -i

 
なんとっ!! svn は IPv6 には対応してないようで、実際には tcp6 という行は必要ないですね・・。orz
と、いうことで inetd を再起動して再度 telnet で port 3690 が開いているか確認します。
無事に接続できるようなのですが svn で取ってこようとするとエラーになるんですね。どうやら svnserve.conf という設定ファイルを用意すると、それを参照してくれるようなのですが FreeBSD の ports の devel/subversion は svnserve.conf を無視しているようです。

ports やソースコードを眺めたのですが conf/svnserve.conf というのが曖昧で、どこを指しているのか解らないんですね。あたた・・。

と、いうことで inetd モードは断念しました。

 
4), と、いうことで
デーモンモード起動して、とりあえずはヨシとしておきました。

今までは svn のミラーサイトは以下があったのですが、

http://svnweb.icmpv6.org/
http://svnwebv4.icmpv6.org/
https://svnweb.icmpv6.org/
https://svnwebv4.icmpv6.org/

これからはここに以下の URL も加わります;-)。

svn://svnweb.icmpv6.org/
svn://svnwebv4.icmpv6.org/

全部で三つのプロトコルに対応しました。ただし、 https の場合はヲレヲレ証明書なので、「証明書を無視する」オプションを有効にして利用して頂ければと思います;-)。

 
さてと。どうして svn:// に対応するようにしたか? というと、このあと書くであろうと思われるエントリで利用して行きたいと思います;-)。

7月 082015
 

今回は Zeroconf (zero-configuration networking) について考察してみたいと思います。と、言っても OS X でのお話ではなく FreeBSD でのお話になります。

そもそも Zeroconf とは Apple が考えたプロトコルで OS X に実装されました。どうして『ゼロコンフと言うのだ?』と言えば『一個も設定しなくてもネットワークが色々使えるようになるからだ。』ということらしいのですが、詳しいことについては Apple のドキュメントや(多分あると思うけど) Wiki などを見てください。

今回は FreeBSD で利用する Zoroconf についてのお話です。

なお、文中「mdns」などと書かれている部分がありますが Zeroconf のプログラムが起動してマルチキャスト DNS を受信するモノという認識でお願いします。特定のアプリケーションやデーモンではありません。

僕の知っている(利用している)かぎり Zeroconf の実装は二つあります。 ports 的には

net/mDNSResponder/
net/avahi-app/

ですね。今回はこの二つを比べながら見ていきたいと思います。

 
1). どちらを利用するか?
mDNSResponder も Avahi も Zeroconf の実装なので基本的にやっていることはどちらも一緒です。ただ、 net/mDNSResponder/ のほうが軽量で ports からインストールする分には関連性でインストールされるモノが少なくて済みます。

かたや net/avahi-app/ は dbus や glib などを巻き込んでのインストールとなるので結構大げさになってきます。なので、デスクトップで利用している PC では net/avahi-app/ を、サーバなどで動作させたい場合には net/mDNSResponder/ をインストールするのが良いかと思われます。

例えば最近の net/samba41/ や net/samba42/ の場合は Zeroconf にどちらかを指定できるようになりました。 サーバの場合には mDNSResponder を、 KDE4 などのデスクトップを利用している場合には Avahi を利用するのが良いでしょう。

ちなみに両方インストールして両方起動すると「似たようなのが既に動いているよん。」などと syslog に出力されます。

 
2). インストールについて
実際にコテコテに利用する場合にインストールするモノについて説明します。

・mDNSResponder
以下の ports をインストールするのが良いと思います。

# cd /usr/ports/net/mDNSResponder/
# make install
# cd /usr/ports/dns/mDNSResponder_nss/
# make install
# cd /usr/ports/net/howl/
# make install

 
合計三つの ports をインストールします。インストールされるモノが比較的少ないので助かります。 FreeBSD/arm などではこっちのほうが良いですね。

・Avahi
こいつは関連性でドドドと『こんなん要らんっ!!』と、いうモノまでインストールしてしまいます。デスクトップ環境でインストールするのにおすすめです。

# cd /usr/ports/net/avahi-app/
# make install
# cd /usr/ports/dns/nss_mdns/
# make install

 
こうしてみると net/avahi-app/ のほうが楽そうに見えますけどね;-)。 しかし、サーバに cairo とか要らんし・・。

net/avahi-app/ は net/howl/ に相当する部分を内包しています。 libhowl.so などは net/avahi-app/ をインストールすると入ります。 net/mDNSResponder/ をインストールする場合には個別に net/howl/ をインストールする必要があります。

 
3). 設定
何はなくとも OS X のように ping hostname.local とか打ってみたいですよね。その場合は /etc/nsswitch.conf に以下の設定を行います。「クライアント側の設定」という位置づけでしょうかね。

 :
hosts: files mdns dns
 :

 
hosts: の行は標準であれば /etc/hosts を参照するための “files” と named を参照するための “dns” が書かれていると思います。ここに mdns を参照するための “mdns” を追加します。上記設定では “dns” よりも先に “mdns” を参照することになります。

 
続いて mDNSResponder や Avahi のサーバ側の設定をしていきます。

がっ!!『をいをい。ぜろこんふ ってのは設定無しで利用できるんだろう? どうして設定するんだぁ?』などと思います。『全然ぜろこんふじゃねーじゃんっ!!』みたいな・・。
しかし mDNSResponder のほうは本当に “ぜろこんふ” です。設定する必要はありません。さすがは Apple 謹製;-)。とわ言いつつ、実際は設定できるんですけどね。あとで、その設定方法について書きます。

Avahi のほうは /usr/local/etc/avahi/avahi-daemon.conf をちょっとだけ変更します。以下は設定変更の例です。

[server]
host-name=wanchan
domain-name=local
browse-domains=running-dog.net, icmpv6.org
use-ipv4=yes
use-ipv6=yes
allow-interfaces=bge0
deny-interfaces=re0
 :

 
これくらいで良いでしょうかねぇ。 host-name= domain-name= browse-domains= はまぁ、お約束で書いていきます。 IPv6 を利用している人は use-ipv6=yes にしてと。

あと、 mdns はマルチキャスト DNS (port:5353 の UDP) を流すので PC に NIC が複数ある場合にはどこのインターフェースにマルチキャストを流すのか許可・拒否設定ができます。

これらの設定が終わったら起動します;-)。一応 /etc/rc.conf の設定などを。これは FreeBSD の設定なので “ぜろこんふの設定” とは関係ない;-)。

・mDNSResponder

avahi_daemon_enable="YES"
avahi_dnsconfd_enable="YES"

 
・Avahi

mdnsd_enable="YES"
mdnsresponder_enable="YES"

 
あとは起動して完了です。

 
4). 確認方法
確認方法についてですが、以前「iOS4.2・AirPrint で体験する avahi。」というエントリで Avahi に付いては書いています。なので、この項は先に Avahi のほうから書きましょう;-)。

・Avahi

 $ avahi-browse -art

 
このコマンドを叩くと mdns が動作していて、提供されているサービスの一覧やホスト名が表示されます。

Avahi の場合には /usr/local/etc/avahi/services/ に ssh.service と sftp-ssh.service があるのでそれらのサービスが _ssh._tcp とか _sftp-ssh._tcp で見えますね。 このディレクトリに XML 形式の設定ファイルを突っ込むと他のサービスも見えるようにすることができます。 PDF プリンタとかですね。

一方 mDNSResponder のほうはそれらのサービスが登録されてないので上記コマンドでも見えません。

例えば net/samba42/ をインストールして make config のオプションのところで Zeroconf に mDNSResponder を指定した場合は _smb._tcp というサービスが見えるので、一応、正常に動いていることは確認できると思います。

 
と、ここで話は前後して申し訳ないですが mDNSResponder の設定について書きます。 Avahi みたいに _ssh._tcp. と _sftp-ssh._tcp. は表示してもらいたいぜぃ。と、いうことで設定ファイルを一個書いてみます。
例えば /usr/local/etc/Bonjour.conf というファイルを用意します。記載する内容は以下の要領で。

wanko
_ssh._tcp. local
22
wanko ssh server

wanko
_sftp-ssh._tcp. local
22
wanko sftp server

 
一行目は name=[] に相当します。今回はホスト名を書きました。
二行目はサービス。 Avahi と一緒にしてみましょう;-)。
三行目はそのサービスのポート番号。
四行目は説明文。TXT=[] で利用されますが、好きな文字列をどうぞ。

になります。他にもどんどんサービスを追加できます。 _smb.tcp. とかもね。けど、既に net/samba42/ で利用しているので書く必要は無いです。逆に net/samba42/ で Zerobof をリンクせず、このファイルに書いても良いわけですね。
けど、どうせ mDNSResponder をインストールするのであれば samba にリンクしたほうが良いような気はしないでもないです;-)。

設定ファイルが出来上がったら /usr/local/bin/mDNSResponderPosix に食わせます。 起動用スクリプトとして /usr/local/etc/rc.d/mdnsresponderposix というのがあるのですが、こいつはオプションにファイルを指定できないので以下のように改修します。

#!/bin/sh
 :
(略)
 :
load_rc_config $name

: ${mdnsresponderposix_enable="NO"}
: ${mdnsresponderposix_pidfile="/var/run/${name}.pid"}
: ${mdnsresponderposix_flags=""}

command="/usr/local/bin/mDNSResponderPosix"
command_args="-b -P ${mdnsresponderposix_pidfile}"

run_rc_command $*

 
mdnsresponderposix_flags を新規に定義しました。あとは /etc/rc.conf に以下のように書きます。

mdnsd_enable="YES"
mdnsresponder_enable="YES"
mdnsresponderposix_enable="YES"
mdnsresponderposix_flags="-f /usr/local/etc/Bonjour.conf"

 
これで起動しますが mDNSResponder のプロセスは全部で三つ起動することになりました。あとは別の PC 上の avahi-browse コマンドで届いた情報を確認すれば良いですね;-)。

 
さてと。ここで話をもどしてと;-)。

Avahi の場合は他にもコマンドが色々あるので試してみると良いです。例えば DHCP で動作している PC があったとして、ホスト名は解るが IP アドレスが解らない場合は

$ avahi-resolve-host-name wanchan.local
wanchan.local  192.168.1.153

 
が有用です。 cat /var/db/dhcpd.leases しなくても IP アドレスが確認できるようになります;-)。 あ。 avahi-resolve-host-name -6 ってオプションもあるのでご安心を;-)。
Avahi の場合はコマンドラインインターフェースの他に GUI の ports もあるので色々試してみるのも良いかもしれません。

・mDNSResponder
mDNSResponder の場合は利用できるコマンドがあまりないんですよねぇ・・。まずは mDNSIdentify というコマンドです。

$ mDNSIdentify wanko.local
setsockopt - SO_RECV_ANYIF: Protocol not available
setsockopt - SO_RECV_ANYIF: Protocol not available
setsockopt - SO_RECV_ANYIF: Protocol not available
setsockopt - SO_RECV_ANYIF: Protocol not available
gonta.local. AAAA 2021:1470:FFFF:FEE1:0000:0000:0000:0001
gonta.local. Addr 192.168.1.129
gonta.local. AAAA 2021:1470:FFFF:FEE1:0201:0BFF:1110:2C98
HINFO Hardware: AMD64
HINFO Software: FREEBSD
mDNS_PurgeCacheResourceRecord: Lock not held! mDNS_busy (0) mDNS_reentrancy (0)
mDNS_PurgeCacheResourceRecord: Lock not held! mDNS_busy (0) mDNS_reentrancy (0)
mDNS_PurgeCacheResourceRecord: Lock not held! mDNS_busy (0) mDNS_reentrancy (0)
mDNS_PurgeCacheResourceRecord: Lock not held! mDNS_busy (0) mDNS_reentrancy (0)
No response after 4 seconds
_services._dns-sd._udp.local. PTR Trying multicast
No response after 4 seconds
_services._dns-sd._udp.local. PTR *** No Answer ***

 
ホスト名が解るとそれをオプションに指定すると情報が表示されます。なんかエラーになっているところもありますけどねf(^^;;。

もう一個。実行形式は記載しませんが mDNSNetMonitor というコマンド。

これを実行しておいて、別の PC から avahi-browse -art を叩くとドドドと表示されます。また Mac は定期的にマルチキャスト送ってくるのね。など、パケットキャプチャ的に利用できます。

 
とまぁ、基本的にはこんな感じで。
利用する側は /etc/nsswitch.conf の hosts: 行に mdns と指定するために マルチキャスト DNS 用の nss 系の ports をインストールする必要があります。

あとは上にも書いた通り DHCP で利用している PC や IoT 機器の探査などに利用することも可能です。

 
ユーザに見える部分としてはこんな感じでしょうか。あとは Mac などの OS や KDE4 などの統合デスクトップ環境に組み込まれている場合、アプリ側で良きに計らってくると思います。例えば Finder (OS X のファイルマネージャ) や dolphin (KDE4 のファイルマネージャ) などではルチキャスト DNS でホスト情報を収集し左側のメニューに表示してくれたりとか、 _ipp._tcp に対応しているプリンタを発見してくれるとか。

そー言えば以前 Windows7 を利用しているときはわざと Apple の Bonjour をインストールしていたなぁ。プリンタの探査が早くなるので。

と、いうことでそーいう感じで Zoroconf の実装を利用するのも良いかと思われます。

 
最近の Raspberry Pi2 の OS なんかは『一番最初にウェブにアクセスする場合には hoge.local でアクセスしろ。』みたいに書かれているモノがあったりするのですが、それって、アクセスする側は mdns が動いてないとダメじゃん。となるのであります。
最近の Linux (ubuntu かな?) は default で mdns が動いているのかな? そー考えると FreeBSD でも稼働しているものは mdns を動かしておいたほうが良いのかもしれないですね。

 
内容的にはまだ浅いのかも知れませんが、今回はこんなところでおしまいにしましょうf(^^;;。

 
2015/07/09 加筆
mDNSResponderPosix って core dump するじゃん・・。orz FreeBSD/amd64 や FreeBSD/arm で core dump する。場所は libc の中で。しかし、ちゃんと動作する場合や環境もあるので何が悪いのか、解らない。 orz

mDNSResponderPosix は -f でファイル名を指定できるし、 -n からドドドと他にオプションも指定できます。

 # mDNSResponderPosix -name wanchan  -t _ssh._tcp -p 22

 
と、いう起動の方法もありますが、サービスが一個しか指定できない・・。
しかし、この場合も core dump する場合があります・・。orz

 
と、いうことで素直に mDNSResponder を使ってみましょう。こいつも -f で設定ファイルを指定することができます。その設定ファイルの中身は以下のような感じです。

wanchan        _ssh._tcp.      local   22
wanchan        _sftp-ssh._tcp. local   22

 
これで OK。 mDNSResponder はマルチキャスト DNS を流すインターフェースも指定できるようです。それらを合わせた起動オプションは以下で良いかな。

# mDNSResponder -i bge0 -f /usr/local/etc/mDNSResponder.conf

 
これで Avahi で設定した動作と同じことができるようになったはずです。 mDNSResponderPosix の設定ファイルの記述方法よりも mDNSResponder の設定ファイルの記述のほうが直感的ですよね;-)。

 
せっかくなので mDNSResponder を利用した場合の avahi-browse -art に相当する(かもしれない)確認方法についてちょっと書いておきます。 dns-sd というコマンドを利用します。 -B がそれに近いでしょうかね。

$ dns-sd -B _ssh
Browsing for _ssh._tcp
DATE: ---Thu 12 Jul 2025---
22:44:14.360  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
22:88:14.301  Add        2   1 local.               _ssh._tcp.           wanton
22:88:14.419  Add        2   2 local.               _ssh._tcp.           wanko
22:88:14.588  Add        3   1 local.               _ssh._tcp.           wantaro

 
オプション無しで dns-sd を叩くとコマンドオプションが表示されます。 -B で Browse 機能。ただオプションにサービス名を指定する必要がありますが。
他に dns-sd -G オプションも役に立つかも知れません。

 
と、いうことで、これが、僕の知っている Zeroconf のほぼ全てです。

Zeroconf の設定ができると bind9 の name.conf で色々設定する view “internal” { } って要らねんじゃね? などと思えてきました。まぁ、全部の PC や端末が Zeroconf をしゃべれるわけでは無いのですけどね。
しかし、今回はデスクトップ機もサーバも Zeroconf がしゃべれるようになったので中々良い感じです。
あ。当然 mDNSResponder と Avahi 間でも通信は行えるのでどちらをチョイスしても全然問題ありません。

皆さんも自宅もしくは職場・データセンタのネットワークにマルチキャスト流してみませんか? ;-)。

6月 222015
 

遅ればせながらですが、Raspberry Pi2 MODEL B を購入しました。まぁ、世の中はボーナスセール開催中ですしねぇ。

と、いうことで Amazon で手頃な値段で売っていたのでゲットです。ケース付き本体が 5,980yen 、 そこにヒートシンク 850yen が無料で付くというのでそれをそのまま購入。翌日には配送されました。

筐体が届き OS はどうすんべかいのお・・。などと悩んでいたのですが FreeBSD/arm をインストールすることにしました。

と、いうことで初めての FreeBSD/arm です。今回から数回に分けて Raspberry Pi2 で FreeBSD/arm が動くまで、動いた後について書いて行きたいと思います。

 
1). 購入
まぁ、 Amazon でボタン押しただけですf(^^;;。
届いたのはこんな感じ。

IMG_2092_raspi2_1

箱とケース付きの本体と、そして、ヒートシンクパック。これで送料込み 5,980yen だったのでまぁ、ボチボチかな。

電源ケーブルがありません。どうすんねん? とか思ったら MicroUSB から電源供給できるんですね。スマホの充電ケーブルとかが代用できます。僕は docomo の MEDIAS N-04D 購入したときに合わせて購入した電源コンセント -> MicroUSB で無事に起動しました。ふふふ。

 
2). OS は FreeBSD/arm をチョイス
ウェブなどで調べたのですが、まぁ、以下の URL が参考になるでしょうか。

FreeBSDarmRaspberry Pi 2 image

ここを見て色々やろうとしました。まず rpi2.img ってのはなんだべ? ってことろから入るのですが、それはつまりは、以下の URL からダウンロードしてきた USB スティックイメージのことなんですね。

ftp://ftp.freebsd.org/pub/FreeBSD/snapshots/arm/armv6/ISO-IMAGES/11.0

僕は今回は FreeBSD-CURRENT をチョイスしました。そして FreeBSD-11.0-CURRENT-arm-armv6-RPI2-20150618-r284544.img というファイルを利用しました。
ダウンロードした img ファイルを上記 URL のように mdconfig とか打ったりしたんですが、面倒になったのでいきなり手持ちであった 8GByte の MicroSD カードに素の img ファイルを dd コマンドを叩き書き込んでみました。

# dd if=FreeBSD-11.0-CURRENT-arm-armv6-RPI2-20150618-r284544.img of=/dev/da1 bs=10240

 
of= は自分のデバイスに合わせてください。あ。上記コマンドは FreeBSD/amd64 上で実行しています。

MicroSD カードに OS が入ったので Raspberry Pi2 に突っ込んで電源投入です。あ。 USB キーボードと HDMI のディスプレーを用意してから電源投入しました。

するとな。なんとっ!! サクっと OS が起動しました。すげー。今の FreeBSD-CURRENT はスゲーよっ!!

USB キーボードも認識するし、 USB Wi-Fi を接続したら run0 で認識するし、 CPU は四つ認識しているし、あっと言う間に Raspberry Pi2 から FreeBSD/arm が起動しました。

あ。一点だけ。 root パーティションが見つからないのでブートは途中で止まります。

boot> ufs:/dev/mmcsd0s2a

 
として起動するとサクっとブートして login プロンプトが出ました。
default のユーザ名 root でパスワードも root でサクッとログインできました。ログイン後に /etc/fstab を以下のように変更します。

# Custom /etc/fstab for FreeBSD embedded images
#/dev/ufs/rootfs /       ufs     rw      1       1
/dev/mmcsd0s2a   /       ufs     rw      1       1
/dev/msdosfs/MSDOSBOOT /boot/msdos msdosfs rw,noatime 0 0
md /tmp mfs rw,noatime,-s30m 0 0
md /var/log mfs rw,noatime,-s15m 0 0
md /var/tmp mfs rw,noatime,-s12m 0 0

 
これで無事に起動します。 8GByte MicroSD は 8GByte よりちょっと小さい / バーティションが用意されます。

あとは freebsd という su できる一般ユーザがあるのでこれを適当に利用したり削除して自分のアカウントを作成したりして、 /etc/rc.conf を書き換えたりとか、自分の好みの FreeBSD に仕上げて完成。

dmesg は以下になります。

dmesg

FreeBSD/arm には PCI BUS ってのは無いようですね。pciconf -lv は表示してくれません。
あと、 sysctl -a を見ると dev.cpu.0.freq で CPU 速度が 900MHz と 600MHz で可変のようですが、 900MHz で動作しているところを見たことがありませんf(^^;;。
dev.cpu.0.temperature もきっちりとあって、温度が取れます。僕のはヒートシンク付きなので高いときで大体 44゜C くらいでしょうかね。

 
Raspberry Pi2 を知らなくて FreeBSD にうんと詳しい人(あ。それは僕のことです;-P)が接すると大体一時間くらいで遊べるようになります。

 
3). /usr/prots どうするよ?
一応 NFS まで動かして自宅の ports サーバの /usr/ports を NFS マウントして /usr/ports/ports-mgt/pkg/ を make してみたのですが、やはり遅くてダメですね。途中で Ctrl-C して止めてしまいました。

クロスコンパイル環境を FreeBSD/amd64 に作らないとダメっぽい。

とわ言いつつ、一応、自分で make した packages を用意しました。以下の URL にあるので欲しい方はダウンロードして pkg add してみてください。

http://distfiles.icmpv6.org/distfiles/packages/All.armv6/

拡張子が tbz なのは僕が make したモノ、 txz は README.txt に書かれている URL からダウンロードしたモノになります。
上にも書いている通り僕は FreeBSD-11.0-CURRENT の r284544 を利用しています。そこでコンパイルしたモノになります。 make config は自分の趣味で指定してます。極力余計なモノをインストールしないオプションを指定しています;-)。

 
と、いうことで今回はここまで。

FreeBSD-CURRENT の image ファイルを持ってきて dd して Raspberry Pi2 で起動すると、あっと言う間に起動します。すげー簡単に FreeBSD/arm が遊べるようになります。

次は FreeBSD/amd64 でクロスコンパイル環境が作れた。と、いうネタで書けると良いなぁ;-)。

 
僕はヒートシンク(プロモーションだった;-)付きで 5,980yen で購入したんだけど、タイミングが良かったのかな?

 

3月 162015
 

さくらインターネットが「さくらのレンタルサーバ」を契約している人を対象として iPhone・Android アプリである「さくらぼけっと」を提供し始めました。

プレスリリースはこちら

「さくらの VPS」ではなく「さくらのレンタルサーバ」であるところがミソか;-)。ちなみに僕はもう随分と長いこと「さくらのレンタルサーバ」を契約しているので今回の「さくらぼけっと」が利用可能な人です。
「さくらのレンタルサーバ」は 100GByte の HDD 容量が利用できますが、ウェブコンテンツと各種ログやメールなどでも 100GByte というのは到底使い切れる容量ではないのですねぇ。
今回のアプリはそんな状況においては渡りに船。と、いうことで早速 iOS 版と Android 版をダウンロードして実際に利用してみました。

IMG_1058_sakura_pocket_1

今回はコテコテの FreeBSD ユーザ的な「さくらぼけっと」の使い方についてそこはかとなく書いてみます。

 
1). スマートフォン用アプリの利用
iOS 版も Android 版もログイン用ドメインとパスワードを利用することにより利用可能な状態となります。
写真のアップロードとダウンロードなど、スマートフォンユーザの利用形態としては特に問題は無く、フツーに動作すると思います。

ただ、気になるのが一点。Wi-Fi ではログインできるんだけど、携帯電波ではログインできないことがありました。 どうしてログインできないのか表示してくれないのが悲しいところか。もしかしたらコンテンツの .htaccess の “deny from all” の行でも見ているのか? とか思えるんだけどどうなんだろう?

 
2). ssh して ls してみたらっ。ん!?
スマートフォンでしかアクセスしないのであれば全然問題ないんだけど、そもそも「さくらのレンタルサーバ」は ssh が利用できるし scp も利用できる。普段から FreeBSD を利用している人は scp で Microsoft Office Word の文書をサーバ上にアップして さくらぼけっと アプリ経由でアクセスし、その後 Word で開いたらいんじゃね? とか、パっと思うので、勢いそのままに実際に試してみました。

あいや・・。 orz

日本語は文字化けして全然ダメじゃん。状態。どーして文字化けが起きるのだっ!! 早速調査開始です。

あ。さくらぼけっと アプリは ~/sakura_pocket/ に対してアクセスしますね。この中で色々やるのが良いかと思われます。

 
3). アプリの文字コードと端末の文字コード
「さくらのレンタルサーバ」では僕は ssh したときには tcsh を利用していて文字コードは UTF-8 を利用しています。以下は ~/.tcshrc の抜粋です。手元で利用している FreeBSD でも同じ設定をしているので、僕の環境は全ての OS においては既に UTF-8 になっています。

# SETENV Japanese
setenv LC_TIME C
setenv LANG     ja_JP.UTF-8
setenv LC_CTYPE ja_JP.UTF-8

 
通常、この状態で日本語名がついたファイルを scp すると、無事に保存できて「さくらのレンタルサーバ」上で ls するとちゃんと表示できます。
あ、利用している端末(ターミナルソフト)は xfce4-terminal だったり konsole だったり OSX の iTerm だったりしますが、全て UTF-8 です。

しかし、さくらぽけっと アプリからアクセスすると文字化けするし、さくらぽけっと アプリで作成した日本語ディレクトリは ssh で ls すると文字化けしていて ???? となる。どうやらファイル名の日本語文字コードが合ってないようですねぇ。と、いうことで色々調べ出しました。

 
4). 文字コードの確認
まず、判りやすいこととして さくらぽけっと アプリからアクセスして “あ” というディレクトリを作成します。そして、そのときの状況を ssh して調べてみます。

$ ls -1
??/

 
ふむ。見事に文字化だ。ちなみに ssh で “い” というディレクトリを作って確認してみると以下のようになります。

$ mkdir い
$ ls -1
??/
い/

 
ふむー。困った。それにしても さくらぽけっと アプリが吐き出す文字コードは一体何なのだ? と、いうことで hexdump というコマンドで調べてみます。

$ ls -1 | hexdump -C
00000000  a4 a2 2f 0a e3 81 84 2f  0a                       |../..../.|
00000009

 
ふむ。 a4a22f0a とかいう文字コードが並んでいますね。

文字コードをちょっと確認してみると・・。

文字 UTF-8 UTF-16 S-JIS EUC-JP JIS
E38182 3042 82A0 A4A2 2422
E38184 3044 82A2 A4A4 2424

 
ふむー。これを見ると、 さくらぽけっと アプリが吐き出す文字コードは EUC-JP のようです。これまた随分と前時代的な文字コードを利用しているようですねぇ・・。
ls -1 | nkf -w8 するとちゃんと表示してくれるので何かしらの文字コードなのは解るんだけど、しかし「文字コードは何を利用しているの?」状態に陥るのであります。

と、いうことでどうやら EUC-JP を利用しているらしい。と、いうことが解りました。

 
5). アプリから見えるようにする。
と、いうことで話はそろそろ佳境です。普段から UTF-8 で生活している人が持っている日本語ファイル名を持つファイルの文字コードは UTF-8 になります。 UTF-8 でも BOM あり/なしなど話がややこしくなるのですが、話によると、ふつー、アプリなどで利用する文字コードは UTF-8-BOM らしいのですけどね。でもって FreeBSD で LANG=ja_JP.UTF-8 を設定していると UTF-8 BOM 無し になります。

しかしまぁ EUC-JP とわかれば、あとはなんとかなるでしょう。

まずは convmv というのをインストールします。 ports 的には converters/convmv になります。これを手元の FreeBSD で make install します。インストールされた convmv コマンドはライブラリは特にリンクされていないようなので、アーキテクチャが合えばそのまま「さくらのレンタルサーバ」に scp して利用可能です。僕は FreeBSD/amd64 10.1-RELEASE 上で make したものを「さくらのレンタルサーバ」に持って行ったら無事に動作しました。
ASP キャリアと同じ OS を利用しているとこーいうことができるので嬉しいですね;-)。

ちなみに「さくらのレンタルサーバ」には nkf はありますが convmv はありませんでした。 nkf だと以下のコマンドでファイル名の文字コードを変えてくれるみたいなんだけど、今回はうまく動きませんでした。

$ nkf --overwrite --oc=EUC-JP い

 
と、いうことで convmv を実際に利用してみます。「さくらのレンタルサーバ」に ssh でログインしてディレクトリを一個作ります。その作ったディレクトリは さくらぽけっと アプリでは文字化けしてディレクトリとして認識されています。

$ mkdir  い
$ ls -1
??/
い/
$ convmv -r -f utf-8 -t euc-jp い --notest
mv "./い"      "./??"
Ready!
$ ls -1
??/
??/

 
ファイル名の文字コードが UTF-8 のモノを作成し、それを EUC-JP に変換します。ターミナルの表示的には文字化けしてますが さくらぽけっと アプリから参照すると無事に見えるようになると思います。

と、いうことでスクリプトを書いてみました。

#!/bin/sh

export LC_CTYPE=ja_JP.UTF-8
export LANG=ja_JP.UTF-8

case $1 in
'-s' )
    convmv -f euc-jp -t utf8 * --notest
    ;;
'-p' )
    convmv -t euc-jp -f utf8 * --notest
    ;;
* )
    echo "usage : encChange.sh {-s|-p}"
    echo "           -s : ssh mode"
    echo "           -p : Pocket mode"
    ;;
esac

 
-s オプションは ssh モード。ssh でログインしたときにファイルを操作したい場合に -s オプションを付けて UTF-8 なファイル名にします。
-p は さくらぽけっと モード。 ssh での作業が完了したあと、さくらぽけっと アプリからアクセスするときに文字コードを変換します。
あ。僕は convmv は ~/bin/ に置いて PATH を張っています;-)。

 
ふぅ。今回やりたかったのはまさしくこれで、 FreeBSD からファイルを scp で送って、それを iPhone6 や Android アプリで閲覧することができるようになりました。
これでアプリと既存の UNIX 環境を上手に使い分けて作業を行うとシームレスにファイルが共有できて作業が捗りそうです;-)。

 
それにしてもクラウドなストレージサービスというのは OneDrive Dropbox BOX など有りますが、ファイルが貯蔵されているクラウド側をプロンプトから ls で見ることができるサービスというのは、今のところ「さくらぽけっと」のみ。と、いうことになります。さくらインターネットに拍手を送りましょう;-)。

と、いうことで「さくらのレンタルサーバ」を利用している人は是非とも さくらぽけっと アプリを使ってみてくだい。 100GByte のクラウドストレージが利用できることになります;-)。

3月 012015
 

最近はほとんどの NotePC にカメラが付いていて Windows とかだと Skype しよう。 Mac だと FaceTime しよう。などと言っていますが、普段はほとんど使わない(と、僕は思う)んだけど、実際にはどうなんでしょうか?

そんな感じの標準装備のカメラですが OS に FreeBSD を利用していた場合にどのような目的でどう使う? ってか、その前に「ここに付いているカメラは FreeBSD で動くの?」などと思ってしまうのですが、今回は実際に NotePC に付いているカメラを FreeBSD で利用してみるとこにしましょう。

 
今回登場する NotePC は僕の持っている ThinkPad Edge e145 です。このブログには何回か登場しているのですが FreeBSD がバリバリ動作しています;-)。この ThinkPad Edge e145 も最近の NotePC のトレンドを追いかけているようで、ディスプレーの上にカメラが付いています。

今回はこのカメラを利用して色々やってみたいと思います。もしかしたら、ネタ的にはもう既に枯れているかも・・f(^^;;。

 
1). カメラを認識させる
最近の NotePC に付属のカメラはほとんどが USB に接続されているようですね。 pciconf -lv とか usbconfig list コマンドを叩き、デバイス的に、どこにカメラが接続されているか確認しましょう。

 # usbconfig list
    :
ugen4.2: <Integrated Camera Vimicro corp.> at usbus4, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (256mA)
    :

 
ThinkPad Edge e145 の場合は USB の ugen4.2 として認識されているようですね。と、いうことでこいつを正しいデバイスとして認識させてみましょう。

 
2). デバイスドライバのインストール
FreeBSD の純正デバイスドライバというのは存在してないのですが、 Linux 方面で開発されたキャラクタデバイスを読み込むドライバを FreeBSD に対応させた Cuse4BSD を利用します。 ports 的には multimedia/cuse4bsd-kmod になります。
まず、これをインストールし、続いてキャラクタデバイスをビデオデバイスとして認識させる webcamd をインストールします。 ports 的には multimedia/webcamd になります。まぁ、 webcamd を make install すると関連性で cuse4bsd-kmod もインストールされますが;-)。

そして multimedia/cuse4bsd-kmod を make install したときにインストールされた cuse4bsd.ko を kldload します。

# kldload /boot/modules/cuse4bsd.ko

 
カーネルモジュールをロードしたあとに wbecamd を起動し /dev/video0 として USB カメラを認識させます。オプションに USB 接続のカメラの USB のデバイス名を指定します。

# webcamd -d ugen4.2
Attached to ugen4.2[0]
Creating /dev/video0
^Z
中断
# bg
# ls -l /dev/video0
crw-rw---  1 webcamd  webcamd  0x82 Feb 28 26:14 /dev/video0
# chmod 666 /dev/video0

 
webcamd を起動すると正しく動作する USB カメラであれば /dev/video0 が生えてきます。
その後、一旦バックグラウンドにほーり投げてパーミッションを確認します。今回は一般ユーザでも利用したいので 666 に変更しています。デバイス生成時にバーミッションを変更したい場合には /etc/devd.conf におまじないを書いてください。ここでは割愛します;-)。

以上で準備は完了です。

 
3). まずはローカルでカメラを利用してみる
/dev/video0 が生えてきたので、実際にカメラに写るモノを表示させてみたいですね。そんな時は pwcview を利用します。 ports 的には multimedia/pwcview になります。
こいつを make install したあとに特にオプションも付けずに起動すると X11 上にウィンドが現れてカメラから映る景色が表示されると思います。

しかし、ローカルな FreeBSD の X11 の画面にカメラから映る景色が表示されても「だから何?」で終わってしまいますよねf(^^;;。
僕自身もまさしくそのとおりでして。ただ単に「あ。 cuse4bsd.ko と webcamd でデバイスを認識したのね。ふーん。すごいね。いじょ。」みたいな・・f(^^;;。

この写真はまさしくそんな感じで、 ThinkPad Edge e145 上の FreeBSD で KDE4 が動いていて、そこで pwcview を起動させた状態です。

IMG_0968_NotePC_Cam_1

ディスプレーの上にカメラがあるのですが、その横にある黄緑色の LED が光っております。カメラが Ready 状態ですねぇ;-)。

と、いうことで何か別の利用方法を考えてみることにしましょう。

あ。 chmod 666 /dev/video0 しましたが、これしないと一般ユーザで起動する pwcview では 画像が読み込めない状態になります。

 
4). リモートからカメラの映像を確認する
ローカルな FreeBSD の X11 に画面が出力されたので、リモートの FreeBSD から ssh -CY し、手元の X11 に pwcview を表示させればいんじゃね? えぇ。まさしくそのとおりですね。それだとリモートの X11 にカメラに映された映像が表示されます。それもひとつの案ですね;-)。

今回は http で画像を転送してみましょう。 ports から mjpg-streamer をインストールします。 ports 的には multimedia/mjpg-streamer になります。 make config は default の設定で良いです。まぁ、強いて言えば “Linux-UVC V4L2 plugin” を有効にしてインストールしましょう。

インストールしたものの中で重要なのはプラグインがインストールされた場所でしょうか。 /usr/local/lib/mjpg-streamer/ の中を覗くと .so なファイルが入っていますが mjpg-streamer を起動するときに利用するプラグインになります。

では実際に起動してみましょう。

$ mjpg_streamer -i 'input_uvc.so -d /dev/video0 -y' -o 'output_http.so -w /usr/local/www/mjpg-streamer'

 
/dev/video0 は chmod 666 しているので一般ユーザ権限で起動できます。

-i でカメラ側のオプションを指定します。 input_uvc.so プラグインを利用し、デバイスは /dev/video0 から入力します。
-o で出力側のオプションを指定します。 output_http.so プラグインを利用しコンテンツは /usr/local/www/mjpg-streamer にあることを指定します。
-o に output_file.so を指定するとカメラに写ったモノはファイルに出力してくれるのでしょうなぁ。僕は試していませんがf(^^;;。

ちなみに /usr/local/etc/rc.d/mjpg_streamer という起動スクリプトがインストールされるのですが、こいつは -i のオプションを指定する部分が無いんですよね。 rc.conf.local には以下のように書くと良いかな。

mjpg_streamer_enable="YES"
mjpg_streamer_flags="-i 'input_uvc.so -d /dev/video0 -y' -o 'output_http.so -w /usr/local/www/mjpg-streamer'"

 
さてさて。あとはウェブブラウザで http://localhost:8080 とかリモートのマシンからアクセスしてみるとそれらしいウェブサイトが表示されると思います。

ちなみにポート番号を変えたい場合には以下のように設定するが良いです。

mjpg_streamer_enable="YES"
mjpg_streamer_flags="-i 'input_uvc.so -d /dev/video0 -y' -o 'output_http.so -p 8081 -w /usr/local/www/mjpg-streamer'"

 
こんな感じで任意のポートに変更できたりします。

ただ、悲しいかな・・。 mjpg_streamer は IPv6 には対応していないようですねぇ。ソースコードの plugins/output_http/httpd.c の socket(PF_INET, …); の部分を書き換えると IPv6 対応になるかなぁ?暇なときにいじってみよう。

さてと。実際に表示される動画ですが、皆さんの目で確認してみてください;-)。
左のメニューから Static を選択すると写真が、 Stream を選択すると動画が流れ始めます。
僕の ThinkPad Edge e145 のカメラは pwcview ではまぁ、そこそこ綺麗に見えるのですが mjpg_streamer で見ると多少ちらつきますね。あと、ブラウザ側の PC の負荷が高くなるかな。

 
と、いう感じで NotePC に付いていたカメラが FreeBSD からでも利用できることが確認できました。しかもそのカメラがリモートからアクセスできて閲覧もできることが確認できたので、これで利用頻度がいっきにアップするのでは無いかと思われます。嬉しいことですね。

ただ、音を飛ばす時にはもっと別の技が必要になりそうな気がしますが、それはまた別の機会にでも:-|。

あと、カメラが付いてない FreeBSD がインストールされた PC には手元にある USB カメラを色々付けてみて cuse4bsd-kmod と webcamd で動作するか確認して見るのもよいかと思います。
もし動作する USB カメラだった場合、フツーの自作 PC にインストールした FreeBSD でも今回の組み合わせでカメラが利用できるようになるかと思われます。

ちなみに、僕は以下の二つの USB カメラを持っているのですが、こいつらをデスクトップの FreeBSD で利用してみました。

IMG_2228_NotePC_Cam_2

左側の白いのは FreeBSD というか webcamd で認識してくれませんでした。以下のようなメッセージが出力されます。

# webcamd -d ugen0.2
webcamd: Cannot find USB device

 
右側の黒いのは赤外線付きで暗いところでも良く見えるカメラなのですが、こいつは pwcview では動きましたが mjpg_streamer では動きませんでした(砂の嵐が表示されます)。
カメラによって動作が多少違うようですね。

 
と、いうことで、今回は NotePC に標準で付いているカメラで遊んでみました。 mjpg_streamer がちゃんと動いてくれると、利用価値は上がりそうですね。 また、 mjpg_streamer に変わる何か別のアプリを見つけてきて、それを試してみるのも良さそうですね。何か良い ports をご存じの方いましたら教えて下さい;-)。

また、最近流行の Raspberry Pi を FreeBSD/ARM で起動して USB カメラを接続し今回の組み合わせを利用すると、IoT な監視カメラができるかもしれません。

バッテリ運用で Raspberry Pi+USB Camera+FreeBSD+cuse4bsd-kmod+webcamd+mjpg_streamer+Wi-Fi な状態のヤツをラジコンカーに積んで走らせたら、録画ではなく、リアルタイムで動画が堪能できるような気がします。

面白そうだ・・;-)。

1月 242015
 

離れた二点間で IPv6 を L2 で利用したいなぁ。と、ずっと思っていたんだけど、中々手段がなかった。 FreeBSD の gif トンネルを使うと L3 接続になるし gre を使うと bridge が利用できないのでややこしいネットワークになってしまうし、そもそも FreeBSD の gre は IPv6 の L2 抜けが 10.0-RELEASE になってもできないみたいだし・・。

と、いうことで今回は離れた二点間で同一の /64 の IPv6 セグメントを利用できるようなネットワークを構築してみたいと思います。
ただ、ネットワーク機器としての FreeBSD の利用は今回あきらめました。今回は VyOS 1.1.1 を利用してみました。
VyOS 1.1.1 はフリーで利用できる仮想環境用のルータ OS です。

VyOS のインストールについてはここでは記載しないので他のウェブサイトでご確認頂ければと思います。

 
でもって、今回構築するネットワーク環境は以下になります。

IPv6_L2TPv3_2

ちょっと説明を。

  • 既存ネットワークのセグメント1: 10.123.1.0/24
  • 既存ネットワークのセグメント2: 192.168.123.0/24
  • 上記二つの異なる IPv4 のセグメントにおいて 2001:470:fc1e:10::/64 の IPv6 セグメントを利用したい。
  • IPv4 は 172.16.101.0/24 もあるけど、ついでに利用できるのであればそれはそれで嬉しい;-)。

と、いうような感じ。 IPv4 を L2 で抜けるソリューションは色々あるようなんだけど IPv6 の L2 抜けってのはどうも対応してない OS があったりして中々手強いモノがあったのであります。

セグメント2 側に IPv6 が無いので L2 で抜けて行って IPv6 使えるようにしましょう。ってのが今回の要件でしょうかね。

dtcp を利用した gif インターフェース使えば良いじゃん。と、いうソリューションもあるのですが、その場合 dtcps を起動する側には /48 が必要で dtcpclient 側に /64 を配布。って形になるので /64 しか無い場合には L2 抜けしてあげないとちょっとつらいんですね。

 
と、いうことで上の図は構成図です。物理的にはセグメント1 にもセグメント2 にも VMwareESXi 5.1 がいます。そこにサーバ(今回は FreeBSD をチョイス。と、いうか、いつも FreeBSD だけど;-)と VyOS が入っている状態です。

  • セグメント1: FreeBSD-01・FreeBSD-02・VyOS-01
  • セグメント2: FreeBSD-03・VyOS-02

では以下に手順を書いていきます。

 
1). VMWareESXi 5.1 の設定
サーバと VyOS が vSwitch で接続された状態にします。そして vSwitch ではプロミスキャス・モード (promiscuous mode) を有効にしておく必要があります。
日本語版では「無差別モード」と言っているようですが。

以下は VMWareESXi の vSwitch の設定のキャプチャです。

IPv6_L2TPv3_1

[構成]タブ -> ネットワーク -> vSwitch のプロパティを開きます。
[ポート]タブの「編集」ボタンを押します。
表示されたウィンドの[セキュリティ]タブの「無差別モード」を “承認” にします。

以上で準備は完了です。これをやっておかないとあとで痛い目にあいますX-(。

 
2). VyOS-01 側の設定
VyOS のインストールが済んで、ログインユーザ名とパスワードの設定が完了した状態からの設定です。

まずはホスト名の設定と ssh を有効にしておきましょうかねぇ。

set system host-name VyOS-01
set service ssh port 22

 
続いて既存ネットワークのセグメント1 側の IPv4 アドレスを指定します。

set interfaces ethernet eth0 address 10.123.1.11/24

 
続いてブリッジインターフェースを作成します。

set interfaces bridge br0

 
そして、新規 IPv6 ネットワークに接続する eth1 をブリッジグループに入れます。 eth1 にはアドレスを付加しません。ブリッジするのでイーサーネットインターフェースとして利用します。

set interfaces ethernet eth1 bridge-group bridge br0

 
ここまで各セグメントに接続するインターフェースの設定が完了しましした。
続いて二つのセグメントを接続するための L2 トンネル部分の設定をします。今回は VyOS の L2TPv3 を利用します。
一応 VyOS の gre でも試してみたのですが bridge-group のメニューが出てこないのでブリッジグループに入れることができません。以前の vyatta では gre も bridge-group に入れることができたようなのですけどねぇ。まぁ、 IP インターフェースは bridge-group に入れることはできない。と、いうことなのでしょうなぁ。

さて。 L2TPv3 を利用するために以下のコマンドを投入します。

set interfaces l2tpv3 l2tpeth0
set interfaces l2tpv3 l2tpeth0 local-ip 10.123.1.11
set interfaces l2tpv3 l2tpeth0 remote-ip 192.168.123.21
set interfaces l2tpv3 l2tpeth0 session-id 10
set interfaces l2tpv3 l2tpeth0 peer-session-id 11
set interfaces l2tpv3 l2tpeth0 tunnel-id 20
set interfaces l2tpv3 l2tpeth0 peer-tunnel-id 21
set interfaces l2tpv3 l2tpeth0 source-port 2030
set interfaces l2tpv3 l2tpeth0 destination-port 2031
set interfaces l2tpv3 l2tpeth0 encapsulation udp
set interfaces l2tpv3 l2tpeth0 bridge-group bridge br0

 
ちょっと説明しますと、

  • interfaces l2tpv3 を l2tpeth0 として create します。
  • local-ip は自分の IPv4 アドレスを、 remote-ip は接続先 IPv4 アドレスを指定します。
  • session-id は好きな数値を、 peer-session-id は接続先の session-id を指定します。
  • tunnel-id と peer-tunnel-id も上記と同じルールで指定します。
  • source-port と destination-port も同じ要領で指定します。それにしてもどうして peer-source-port じゃないんだろ?;-)
  • encapsulation は udp にしました。他には ip も指定できるようです。
  • 最後に l2tpeth0 を ブリッジグループに登録します。

以上で L2TPv3 トンネルの設定が完了しました。最後に commit して save して exit すれば configure モードを抜けます。
VyOS-02 側にも同じ設定を入れるとトンネルが張られます。

eth1 と l2tpeth0 はブリッジされたのでこれで IPv6 が L2 でズドーンと抜けられるようになります。

 
3). VyOS-02 の設定
まぁ、基本的には VyOS-01 で設定したのと一緒です。サクサク行きます;-)。

ホスト名と ssh の設定と eth0 に IPv4 アドレスを付加する設定。

set system host-name VyOS-02
set service ssh port 22
set interfaces ethernet eth0 address 192.168.123.21/24

 
ブリッジグループの設定

set interfaces bridge br0
set interfaces ethernet eth1 bridge-group bridge br0

 
L2TPv3の設定。


set interfaces l2tpv3 l2tpeth0
set interfaces l2tpv3 l2tpeth0 local-ip 192.168.123.21
set interfaces l2tpv3 l2tpeth0 remote-ip 10.123.1.11
set interfaces l2tpv3 l2tpeth0 session-id 11
set interfaces l2tpv3 l2tpeth0 peer-session-id 10
set interfaces l2tpv3 l2tpeth0 tunnel-id 21
set interfaces l2tpv3 l2tpeth0 peer-tunnel-id 20
set interfaces l2tpv3 l2tpeth0 source-port 2031
set interfaces l2tpv3 l2tpeth0 destination-port 2030
set interfaces l2tpv3 l2tpeth0 encapsulation udp
set interfaces l2tpv3 l2tpeth0 bridge-group bridge br0

 
session-id・peer-session-id と tunnel-id・peer-tunnel-id そして source-port・destination-port は VyOS-01 で指定したものと値を逆にします。

以上で設定が完了ですね。

 
4). 確認方法
VyOS-01 と VyOS-02 の間で無事に L2TPv3 インターフェースが接続できているかの確認方法は以下になります。

vyos@VyOS-02:~$ show bridge br0 macs
port no mac addr                is local?       ageing timer
  2     01:05:73:a1:0f:ff       no                 2.16
  1     02:0c:29:f2:ec:f3       yes                0.00
  2     03:15:2c:73:dc:00       no                 2.07
  2     04:19:30:14:2e:c8       no                 1.14
  2     e5:9b:30:55:4e:c8       yes                0.00

 
ブリッジインターフェースの br0 の Mac アドレスを確認します。 今回はサーバ三台とスイッチポートが二つなので全部で五つの Mac アドレスが載りました。 “is local?” ってのは判りやすいですね。 yes が自分のネットワーク側で no が向こう側のネットワークに接続された機器のようです。

ついでなので VyOS の br0 にもテストのために IPv4 アドレスを付加してしまいましょう。

・VyOS-01

set interfaces bridge br0 address 172.16.101.101/24

 
・VyOS-02

set interfaces bridge br0 address 172.16.101.102/24

 

これでサーバやルータのインターフェースに ping を打って到達性が確認できれば L2 トンネルは成功です。
172.16.101.0/24 の IPv4 や 2001:470:fc1e:10::/64 の IPv6 アドレスに対して ping6 して到達性があることを確認します。

もし、この時に ping や ping6 が当たらない場合には一番上に戻って VMwareESXi の vSwitch において「無差別モード」が “承認” になっているか確認してみましょう。
僕はこの設定をすっかり忘れていて ping6 が通らずに随分と悩んでしまいましたf(^^;;。

 
5). ゲートウェイの設定
VyOS 自体に IPv6 を付加する必要が無いのであれば VyOS でのルーテイングの設定は何も必要ありません。サーバ側には IPv6 の default gateway を設定してあげます。

・FreeBSD

# route add -inet6 default 2001:470:fc1e:10::1

 
三台全てのサーバで同一のコマンドを打ちます。そして、全てのサーバはグローバル IPv6 なサイトに対してアクセス可能になったことを確認しましょう。

 
とまぁ、こんな感じで VyOS を利用することによりようやっと念願だった /64 の IPv6 の L2 トンネルができるようになりました。
本当は FreeBSD 単体でできると良いのですけどね。まぁ、それはしょーがない。

 
あと、今回のエントリでは VPN や IPSec については書いてないです。暗号化されてない L2 トンネルになります。
と、いうのも、僕は思うんですが、最近はプロトコル単位で暗号化されているのでトンネルを暗号化する必要ねんじゃね? みたいな。
ウェブ・メール・ssh・scp によるフアイル転送などはプロトコルで暗号化されています。唯一 samba かな? だったら ssh トンネル掘れば良いんじゃね? みたいな。

あ。 mDNS も L2 トンネルを抜けていくかな?だとしたら暗号化が必要だけど、考えてみるとマルチキャストを通すためには設定が一個必要だったような気がしたなぁ;-)。
まぁ、ザレゴトだということで;-)。

 
今回の設定は以上になります。ふぅ。

12月 192014
 

Wi-Fi では wpa_supplicant をよく利用する。と、いうか WPA を利用するのが当たり前になりつつあるんですが、 re0 とか bge0 などでも wpa_supplicant を利用することは可能です。
今回はその設定について書いてみみたいと思います。

今回利用した環境は FreeBSD/amd64 10.0-RELEASE で wpa_supplicant のバージョンは v2.0 になります。

 
そもそも、フツーの Ethernet で wpa_supplicant を利用するのはどういう状況の時にあるか、と、いうことなんですが、以下に書いてみました。

・L2 スイッチに PC を接続すると L2 スイッチ側で EAP 認証がオンになっている
・認証無しで L2 スイッチに PC を接続すると通信ができない VLAN に落っこちる
・EAP 認証を通過すると正常な VLAN が降ってきてネットワークが利用できる状態になる

利用するのは会社とか、セキュリティの高いネットワークでしょうかね。 こーいうのを俗に IEEE802.1x 認証と呼ぶようで、 Wi-Fi では利用できて当然ですが、対応する L2 スイッチでも IEEE802.1x 認証が利用可能です。

すると、上記の PC を接続した L2 スイッチは IEEE802.1x 認証対応のスイッチで、そのスイッチには設定が入っていて PC を接続しても認証が通過できないのでネットワークに接続できない状態。と、いうことになります。

当然 Windows でも利用できるし Mac でも利用できます。 FreeBSD では wpa_supplicant を利用することにより、認証を通過することができます。

今回は FreeBSD で IEEE802.1x 認証の設定をしてみたいと思います。

 
1). /etc/rc.conf の設定
以下の設定をまずします。

#ifconfig_bge0="inet 192.168.1.201 netmask 255.255.255.0"
ifconfig_bge0="WPA DHCP"

 
bge0 に “WAP DHCP” と記述するのですが、違和感ありますよねぇf(^^;;。けど、今回は Ethernet で WPA を利用するのでこーいう記述になります。

 
2). /etc/wpa_supplicant.conf の設定
まずは設定を提示します。

     1  ctrl_interface=/var/run/wpa_supplicant
     2  ctrl_interface_group=0
     3  ap_scan=0
     4  #fast_reauth=1
     5  #update_config=1
     6
     7  network={
     8          key_mgmt=IEEE8021X
     9          eap=PEAP
    10  #       identity="takachan@windows.domain"
    11          identity="takachan"
    12          password="PASSWORD"
    13  #       phase1="peaplabel=0 perapver=1 include_tls_length=1"
    14          phase2="auth=MSCHAPV2"
    15  #       ca_cert="/usr/local/etc/CA/root_CA.pem"
    16          eapol_flags=0
    17  }

 
以下に各行の説明します。

  • 1 行目: socket の入るディレクトリを指定します。
  • 2 行目: そのディレクトリのグループ ID を指定します。
  • 3 行目: Wi-Fi ではないので AP はスキャンしません。
  • 4,5 行目: 一応コメントアウトしました。
  • 8 行目: key_mgmt に IEEE8021X を指定します。
  • 9 行目: eap は PEAP を指定します。多分殆どの環境で PEAP になるのではと思われます。
  • 10,11 行目: 認証用のユーザ名を指定します。 Windows の Active Directory を利用している場合にはドメイン名が必要になる場合もあるかもしれません。
  • 12 行目: 認証のパスワードを指定します。
  • 13 行目: とりあえず phase1 はなくともログインできたのでコメントアウトしています。
  • 14 行目: phase2 は認証方式を指定します。今回は MSCHAPV2 を利用しました。
  • 15 行目: ca_cert は指定しなくとも今回は接続できました。ただし、フツーは CA は持ってないですよね。もし必要であれば Symantec のサイト から VeriSign Root Package をダウンロードしてきてその中から pem ファイルを一個指定すると良いらしいです。
  • 16 行目: eapol_flags は 0 にしました。

 
こんな感じで指定し、あとはつながるかの試験です。

 
3). wpa_supplicant をデバッグモードで起動
以下のコマンドを実行し、デバッグモードで起動します。

# wpa_supplicant -ddKiq -i bge0 -c /etc/wpa_supplicant.conf -D wired

 
上記のコマンドを実行するとドドドと文字が出力され、それを確認すると、接続したか失敗したか解ります。うまく接続できない場合には出力されたログを google などで調べてください。

なお、上記コマンドでは -D オプションでドライバを指定しています。 Wi-Fi NIC では必要ないのですが Ethernet NIC ではこのオプションが必要になります。
wpa_supplicant -h と実行してヘルプが表示されますが、そこに drivers: が表示されるので、利用できるドライバーを指定します。見ると bsd と null と wired の三つがあるようですね。

 
FreeBSD の /etc/rc.d/netif ではどのタイミングで -D wired を付加するのか確認してみたら /etc/network.subr の中に記述されている is_wired_interface() で確認しているようですね。

全ての NIC のデバイス確認してるんかい?

などと思ったのですが ifconfig の media: Ethernet で判断していました。うーん。頭良い;-)。

 
4). あのー。接続できないのですが・・。
ですよねぇ・・。一発で上手く行ったらすごいです;-)。試行錯誤を繰り返してください;-)。

一点だけ確実に解ることがあります。例えば以下のような状態

・Windows で EAP 認証で接続
・Windows 上で Virtualbox が動いていて、ネットワークはブリッジ
・Windows 上の Virtualbox のゲスト OS ある FreeBSD から wpa_supplicant で接続
・FreeBSD では上記設定を入れていても EAP 認証できない orz

L2 スイッチの接続・機能の制限もあるのですが、通常は 1 ポートで一個の EAP 認証しか許可していない場合が多いようです。 Windows で EAP 認証をしたらその上で動いている FreeBSD では EAP 認証を受け付けてくれない。という可能性はありそうです。
L2 スイッチの設定を確認して一つのポートで複数の EAP 認証での接続を許可しているか確認してみましょう。
例えば L2 スイッチのポートに HUB を接続し、そこに三台 PC をぶら下げて三台とも EAP 認証できるか? って状態と一緒ですね。

 
とまぁ、ウェブで日本語によるドキュメントがあまりないのようなのでちょっと書いてみました。繋がらない場合には基本的にはウェブで確認してみてください。
また、今回僕が試した環境では上記の設定がバッチグーでした。他の環境では上記設定では繋がらないのかもしれないです。その場合は、ここに書いてある内容ではダメなのかもしれないですねぇ・・。