Zeroconf 考察。

今回は 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

mdnsd_enable="YES"
mdnsresponder_enable="YES"

 
・Avahi

avahi_daemon_enable="YES"
avahi_dnsconfd_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 間でも通信は行えるのでどちらをチョイスしても全然問題ありません。

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

Raspberry Pi2 で FreeBSD。

遅ればせながらですが、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 で購入したんだけど、タイミングが良かったのかな?

 

FreeBSD から使うさくらぽけっと。

さくらインターネットが「さくらのレンタルサーバ」を契約している人を対象として 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 のクラウドストレージが利用できることになります;-)。

NotePCに付いているカメラを FreeBSD で使う。

最近はほとんどの 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 な状態のヤツをラジコンカーに積んで走らせたら、録画ではなく、リアルタイムで動画が堪能できるような気がします。

面白そうだ・・;-)。

IPv6 を L2 トンネルで抜ける。

離れた二点間で 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 トンネルを抜けていくかな?だとしたら暗号化が必要だけど、考えてみるとマルチキャストを通すためには設定が一個必要だったような気がしたなぁ;-)。
まぁ、ザレゴトだということで;-)。

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

Ethernet で wpa_supplicant を利用する。

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 認証できるか? って状態と一緒ですね。

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

FreeBSD にインストールされる coreutils とは?

デスクトップとして FreeBSD を利用するとなると色々な ports がドドドと入るのですが、その中に coretutils というのがインストールされることに気がついた。 ports 的には sysutils/coreutils になるんですが、こいつは何かというと Linux で利用されているような GNU のコマンド一式なんですね。 FreeBSD 的には /usr/bin/ 配下にあるコマンドの先頭に g が付いて /usr/local/bin/ に大量にインストールされます。別に新規に GNU のコマンドを入れなくて良いよー。と、なるのでありますが・・。

そもそも coreutils はどの ports に関連付いてインストールされるのか調べてみると kdepim4 がインストールしているみたい。うひっ!! すると KDE4 をインストールしていない人にはまるで関係の無い ports と、いうことになるじゃん・・。orz

今回は、既に /usr/bin/ などにコマンドがあるのに、新たに GNU のコマンドを入れてしまう coreutils をインストールしないように kdepim4 の ports を書き換えてみたいと思います。
環境は FreeBSD 10.0-RELEASE で ports-current 、 kdepim4 のバージョンは kdepim-4.14.2_1 で coreutils のバージョンは coreutils-8.23 になります。

1). kdepim4 の Makefile 参照
まず、 kdepim4 が coreutils-8.23 をインストールしていることが解ったので deskutils/kdepim4/Makefile を覗いてみます。すると、以下の行ですね。

 20  RUN_DEPENDS= ${KDE4_PREFIX}/bin/accountwizard:${PORTSDIR}/deskutils/kdepim4-runtime \
 21               ${LOCALBASE}/bin/gmd5sum:${PORTSDIR}/sysutils/coreutils

 
20 行目で RUN_DEPENDS が設定してあって 21 行目で gmd5sum を利用するために coreutils-8.23 をインストールするようです。
では、実際にソースコードはどこで gmd5sum を使うのか確認してみましょう。

 
2). 設定ファイルで利用されている?
kdepim-4.14.2_1 の中では libkleo/libkleopatrarc.desktop というファイルの中でのみ gmd5sum が利用されているようです。ついでに gsha1sum も利用されているようです。他のソースコードでは全く利用されていないようですし、また、他の g シリーズのコマンドも利用されないようです。

これだけのために g シリーズのコマンド一式インストールするんかい!? となるので、是非ともなんとかしたいモノです。

 
3). md5sum と sha?sum のみインストールする ports を作る
coreutils の他のコマンドは要らないので md5sum と sha?sum のみインストールする ports を作りました。
実は FreeBSD の md5 や sha1 で代用できるんかな? とか思ったのですが md5sum や sha1sum には -c (–check) オプションがあって kdepim4 の kleopatra (これについては後で詳しく説明します;-) の中ではまさしく -c オプションを利用しているので FreeBSD に標準で付いているコマンドではダメなんですね。
あと、 openssl md5 オプションでも -c に相当するオプションはありませんでした。
なので、しょーがない。 md5sum と sha?sum のみをインストールする ports を作成しました。

http://icmpv6.org/Prog/FreeBSD_ports/ports-md5sum-20141216.tgz

ちなみに FreeBSD の md5 に -c 相当のオプションないんかい? などと思いウェブを色々調べたのですが、 BSD 系の人は、この -c オプションが無いためにスクリプト書いたりと色々ナンギしているようですね。

上記 ports は、もとは sysutils/coreutils を利用していますが、先頭の “g” を取って必要最小限なモノしかインストールしないように pkg-plist を書き換えました。
Makefile 中の CONFLICTS で coreutils-* も指定してあるので md5sum と coreutils の両方インストールすることはできません。

ダウンロードしたファイルは /usr/ports/sysutils/ に展開してください。

 
3). kdeppim4 の Makefile の編集と files/ の下のファイルを一個消す
上に掲載した kdepim4 の Makefile の 21 行目を以下のように直します。

 20  RUN_DEPENDS= ${KDE4_PREFIX}/bin/accountwizard:${PORTSDIR}/deskutils/kdepim4-runtime \
 21               ${LOCALBASE}/bin/md5sum:${PORTSDIR}/sysutils/md5sum

 
そして、不要となったファイルである deskutils/kdepim4/files/patch-libkleo__libkleopatrarc.desktop を削除します。

あとは kdepim4 を make && make deinstall && make reinstall し直せば OK。ノラ ports である md5sum も合わせてインストールされます。

 
4). kleopatra をちょっと説明
そもそも libkleopatrarc ってのは KDE の中で何をしているモノなのか?
コマンド的には kleopatra というのがあります。では kleopatra とはなんなのか? 基本的には証明書マネージャーの GUI 版で、ヘルプを見てみると「証明書マネージャと統合された暗号 GUI」とのことで PGP キーなどを管理するソフトウェアになります。

普段 PGP などはコマンドラインで利用しているかと思いますが、 kleopatra を利用すると GUI で鍵の作成・サイン・エクスポート・管理などが行えます。実際に利用してみると中々便利ですね;-)。

ちょっと kleopatra をコンソールから起動してみます。するとまず最初に「kleopatra セルフテストの結果」が起動し、そのときにコンソールにはログとして以下が表示されます。

    :
ChecksumDefinition[ "sha1sum" ] ("xargs", "-0", "sha1sum", "--") 
ChecksumDefinition[ "sha1sum" ] find -print0 |  "/usr/bin/xargs" ("-0", "sha1sum", "--") 
ChecksumDefinition[ "sha1sum" ] ("sha1sum", "-c", "--") 
ChecksumDefinition[ "sha1sum" ] "/usr/local/bin/sha1sum" ("-c", "--") "%f" () 
ChecksumDefinition[ "md5sum" ] ("xargs", "-0", "md5sum", "--") 
ChecksumDefinition[ "md5sum" ] find -print0 |  "/usr/bin/xargs" ("-0", "md5sum", "--") 
ChecksumDefinition[ "md5sum" ] ("md5sum", "-c", "--") 
ChecksumDefinition[ "md5sum" ] "/usr/local/bin/md5sum" ("-c", "--") "%f" () 
    :

 
セルフテストの結果に赤い NG のがあるのであれば、問題を取り除き、全部緑色にしたほうが良いでしょうね。
キャプチャはありませんが、例えば security/gnupg をインストールするときに make config のオプションで [x] SCDAEMON としてから再インストールする必要があったりします。

が、しかし、ログを確認すると今回の目的である md5sum と sha1sum のみのインストールができたので今回はよしとしましょう。

ちなみに md5sum と sha1sum が記載されているファイルは /usr/local/share/config/libkleopatrarc としてインストールされます。すると kleopatra は起動時のセルフテストにおいてはこのファイルを参照して動作しているようですね。

libkleopatrarc はインストールしたものを利用しても良いし、以下のように自分の設定として保存し、それを手で編集しても良いです。

$ cp /usr/local/share/config/libkleopatrarc $HOME/.kde4/share/config/

 
上記のコマンド実行後に自分の $HOME に置いた設定ファイルを手で編集し、 ports を利用せずに個別にインストールした md5dum と sha1sum を利用するように変更したりもできるようになります。

 
それにしても、どうして coreutils-8.23 を使うのがイヤかというと、とあるプログラムをインストールしようとして configure を走らせたのですが、これがなんと /usr/bin/install ではなく /usr/local/bin/ginstall を利用したりと FreeBSD 由来のコマンドではなく ports からインストールした GNU のコマンドを利用しているんですね。

そんなのはイヤだー。純粋な FreeBSD の /usr/bin/* なコマンドを利用したいよー。などと思ったのが今回のコトの発端なのであります。人によっては「そんなんどっちでもいーじゃん。」ってのがあるかもしれませんけどねぇ。

 
しかし、今回作成したノラ ports である md5sum は coreutils の中から一部のコマンドを切り出しただけの ports なので、似たようなのが色々できそうですね。例えば Linux の ls(1) を利用したい場合には ls のみをインストールする ports である gls とか簡単に作れそう;-)。

しかし、そんなことは、多分、僕しかしないだろうなぁf(^^;;。

dbus を VirtualBox に対応した ports を作りました。

以前のエントリで「KDE4 で VirtualBox を動かしたしたときに ISO がマウントできない件。」と、いうエントリを書きました。FreeBSD 上で動作する VirtualBox でゲスト OS はISO イメージを mount できない。 dbus が悪さしているようだ。って感じなんですけども。

で、そのエントリに対してコメントを頂きました。なるほど。 issetugid を undef すれば良いのですね。コメントくださった方、ありがとうございました。

で、 make configure 走らせて config.h 編集してから make && make deinstall && make reinstall するのは大変なので、 ports で選択できるようにしました。

dbus_VirtualBox_1

make config に ISSETUGID オプションを [x] にすると Support VirtualBox ISO image mount が有効になります。

gnome@freebsd.org に連絡する必要があるような気がするんだけど、きっとノラ ports のままにしておくと思いますf(^^;;。
コミットしてくださる方がいると非常に嬉しいですが VirtualBox を利用していて ISO イメージをマウントできないのは KDE4 を利用している人だけなのかな?

FreeBSD で VirtualBox 使ってて ISO イメージがマウントできない。と、お嘆きの方は以下の ports を利用してみてください。
あ。変更したのは dbus/Makefile のみです。

http://icmpv6.org/Prog/FreeBSD_ports/ports-dbus-VirtualBox_ISO_image_mount-20141215.tgz

ISSETUGID オプションを有効にすると configure ファイルの ac_func から issetugid を削除します。すると config.h では #undef HAVE_ISSETUGID になります。それで make すると VirtualBox のゲスト OS で ISO ファイルがマウントできるようになります。

VMware 上のゲスト OS にポートサーバを作る。

僕は自宅のサーバとして VMware ESXi 5.1 を利用していますが、ゲスト OS としては FreeBSD がメインで、他の OS も合わせてだいたい 10 台が動作しています。

今回は VMware ESXi 上に FreeBSD/amd64 10.0-RELEASE をインストールして、それをポートサーバとして運用し、他の FreeBSD のゲスト OS に対して FreeBSD のポートサーバから各ゲスト OS に対してシリアルコンソールからログインできるようにしてみたいと思います。

まずは今回の構成図を先に掲載しましょう。

console_cap0

o.FreeBSD でポートサーバを作成します
o.実際に D-sub 9pin ケーブルではなく VMware の機能を利用します
o.ポートは /dev/cuau0,1,2,3…. と、ゲスト OS の数だけ増やせます

 
1. ポートサーバ側のシリアルコンソールの設定
さて。まずは FreeBSD のポートサーバにシリアルポートをたくさん生やします。ポートサーバを shutdown した状態で VMware vSphere Client からポートサーバの「仮想マシン設定の編集」画面を開きます。その画面でシリアルポートを追加します。

一個目に追加したのは FreeBSD 的には cuau0 、二個目に追加したものは cuau1 になります。

console_cap3

追加するシリアルポートの「シリアルポート出力」は [名前付きパイプに接続] を選択し [次へ (>)] を押します。

console_cap1

次に「パイプ名及び属性」の設定ですが、以下の設定をします。

console_cap2

1).パイプ名
ポートサーバとゲスト OS を接続するときに利用する名前を指定します。
今回は “vm01-vm02” という名前にしました。vm01 とvm02 を接続する。と、いう意味がこもっています;-)。ポートサーバと二個目のゲスト OS を接続ときは “vm01-vm03” などと指定すれば分かりやすいでしょう。

2).近端
ポートサーバ側で利用方法ですが、ポートサーバなので [サーバ] をを指定しました。

3).遠端
[仮想マシン] を選択します。

3).デバイスのステータス
パワーオン時に接続にチェック

4).入出力モード
ポーリング時に CPU を放棄は良くわからないのですが、チェックを外しましたf(^^;;。

 
以上の手順でゲスト OS に接続する数だけシリアルポートの設定を追加し作業は完了です。ポートサーバな FreeBSD を起動しましょう。

 
2. ゲスト OS 側のシリアルコンソールの設定
1. ではポートサーバ側のシリアルポートを、ゲスト OS の数だけ追加しましたが、ゲスト OS 側ではシリアルポートは一個で十分です。

「パイプ名及び属性」の設定時に「パイプ名」のみ気をつけます。ポートサーバの cuau0 に相当する “シリアルポート 1” はパイプ名に vm01-vm02 と付けました。それと同じ名前にします。

図にするとこんな感じでしょうか。

console_cap11

接続したいモノ同士で「パイプ名」を揃える。と、いうことになり VMware ESXi 内部で結びつけてくれるようです。

 
3. ゲスト OS 側のシリアルポートの設定
これについては FreeBSD がゲスト OS であった場合には以前書いているのでそちらの URL を参考にしてください;-)。

PRIMERGY MX130 S2 を FreeBSD で利用する。

 
以上で全ての準備が整いました。必要であれば、各サーバをリブートして実際に接続できるか確認してみましょう。
僕の場合は cu(1) コマンド を利用しています。

$ cu -l /dev/cuau0
can't open log file /var/log/aculog.
Connected

FreeBSD/amd64 (freebsd-02.running-dog.net) (ttyu0)

login:

 

こんな感じになれば OK で、あとは cuau の数だけ試してみましょう。

 
さてと。最後にもう一点。では、ポートサーバのシリアル接続はどうするのだ?と、いう話があるのですが、ふむー・・。実は /etc/ttys とか変えたり、シリアルポートを追加したりして色々試したのですが、ダメでした。orz と、いうことで、今回はポートサーバと化した FreeBSD に対するシリアル接続の設定についてはナシということで・・。

ちょっと弱いような気がしないでもないんですけどねぇ・・f(^^;;。

majordomo の ports 作りました。

FreeBSD の ports-current を追いかけていると、いつの間にか mail/majordomo が削除されてしまいました。以前の ports ツリーから消える前の ports を眺めてみると Makefile に NO_STAGE= yes という記述があり、この記述があると BROKEN になってしまうんですね。

なので、 ports のメンテナの方も stage 対応にしないでそのまま ports ツリーから削除してしまったのでしょうなぁ。

僕自身は今でも majordomo を利用していて perl-5.16 対応にするのが大変だったりしているわけですが、まぁ、まだ使っているしねぇ。消えるのは悲しいねぇ。などと思った次第です。

 
メーリングリストの配信システムは、最近では mail/mailman があったりしますが apache までインストールしてしまうので仕掛けが随分と大げさになってしまいます。 もう一個、メーリングリスト配信システムとしては fml もあったりしますが、こちらも随分と古い(枯れている)し、 ports にはなってないし・・。
#上記のように書きつつ fml のサイトを見たらっ!! あいやっ!! 今てもメンテされているのですねぇ。失礼しました。 fml8 ですかっ!!
#あとは FreeBSD の ports になるのを待つばかり。でしょうか;-)。

さくらのレンタルサーバでは今でも fml が利用されているかな?

 
と、いうことで、いっちょ majordomo を stage 環境に対応させてみるかねぇ。などと思い ports を作ってみました。 ports ツリーから削除される前の majordomo の ports を参考にして、 stage 環境に対応してみました。

この majordomo の ports というのは内部でスクリプトをガシガシ動かしていて『ふむ。こりゃー stage 環境に移行するのは大変だわー。』などと思ったんですけどもねぇ・・。

以下の URL に stage 環境に対応した majorodomo の ports を置いたので、ノラ ports でも構わない。と、いう人がいましたら利用してみてください。

http://icmpv6.org/Prog/FreeBSD_ports/ports-majordomo-20141020.tgz

ちょっと ports の説明をすると、今まであったものからの変更点は以下になります。

1. Doc の下や man はバッサリと削除したのでインストールされません。
2. 古い ports では test-l というサンプル ML が用意されるのですが、それもインストールされません。
3. 今回 contrib/ というディレクトリ内に僕が改造して利用している sequencer を入れておきました。試してみたい方はインストールしてみてください。 make install ではインストールされません。

だいたいこんな感じでしょうか。 Makefile に ${INSTALL} をたくさん書くのが面倒だったのであまり必要でないものはインストールしないようにしました。それが Doc であり man であったりします;-)。

sequencer は Subject: ヘッダに ML 名を付けたり、番号を付加したりするものですが、日本語対応と Re: たくさん付く問題などの対応のために多少改修して使いやすくしています。

majordomo の ports がなくなって愕然としている人いましたらご利用頂ければと思います。

 
ちなみに、 portmaster -D -a 実行時に「majordomo なんて ports 知らないよ。」などと怒られる場合には以下の手順で回避することができます。

# mkdir -p /var/db/pkg/majordomo-1.94.5_8
# cp /dev/null /var/db/pkg/majordomo-1.94.5_8/+IGNOREME

 

こーすると、 portmaster 実行時には majordomo を無視してくれるようになります。

とまぁ、どちらにしても majordomo は前時代的だし、メーリングリスト自体もそもそも前時代的なモノになりつつあるのかもしれませんなぁ・・。