RaspbmcのAirPlayでハマったでござる
MacBook Airを買ったぜわっしょい!
さっそく今までヨダレ垂らして指くわえて見てたステキ機能を堪能するぜ!
まずはAirPlayだ!手元の動画をRegzaで見るぜ!
ああ、でもAppleTV持ってないぞ。でもきっとオプソ界にはニートな解が転がってるはず!
パスっ!タスタスタス!(SpotlightでWeb検索)
よし、Raspberry Pi向けのXBMC(Raspbmc)はAirPlayがしゃべれるぞ!!!
と、言うわけでRaspbmc導入スタート!
通信の状況を調べる
まずはMBAとRaspbmcの通信の状況を確認してみる。
まずはhomebrewでtcpdumpを・・・ってデフォルトで入ってるの!?
何このOS!超いいじゃん!
Alicia:~ moguno$ sudo tcpdump | grep raspbmc ・・・ 18:36:41.308272 IP6 alicia.local.49174 > raspbmc.local.36666: Flags [S], seq 105655457, win 65535, options [mss 1440,nop,wscale 4,nop,nop,TS val 744813686 ecr 0,sackOK,eol], length 0 18:36:41.312502 IP6 raspbmc.local.36666 > alicia.local.49174: Flags [R.], seq 0, ack 105655458, win 0, length 0
ポート36666に対してコネクションしようとしてるけど拒否られてる。
てことは、Raspbmc側で必要なサーバが起動してないってことか。
ほーらやっぱり・・・あれ?
と、言うわけでRaspbmc側でポートが開いてないことを確認。
(ちなみにRaspbmcはRaspbianと同じく、ユーザ名:pi、パスワードraspberryでsshログイン可能です。)
pi@raspbmc:~$ netstat -a | grep LISTEN ・・・ tcp 0 0 *:36666 *:* LISTEN tcp 0 0 *:36667 *:* LISTEN tcp6 0 0 [::]:sunrpc [::]:* LISTEN ・・・
あれ?開いてるじゃん??
繋がる・・・だと?
一旦MBAに戻って、telnetを汎用TCPクライアントとして導通確認をば。
このMBAさん、telnetもばっちりデフォルトで完備です。
sshも入ってないのにtelnet消しちゃった某OSに、りんごのヘタを煎じて飲ませてやりたいですよ。
Alicia:~ moguno$ telnet raspbmc.local 36666 Trying 192.168.11.14... Connected to raspbmc.local. Escape character is '^]'. RTSP/1.0 200 OK Audio-Jack-Status: connected; type=analog CSeq: ^] telnet> quit Connection closed.
えー、なんで繋がるん???
IPv6だ!
よく分からなくなってきたので、もっかいtcpdumpログを見なおしてみる。
18:36:41.308272 IP6 alicia.local.49174 > raspbmc.local.36666: Flags [S], seq 105655457, win 65535, options [mss 1440,nop,wscale 4,nop,nop,TS val 744813686 ecr 0,sackOK,eol], length 0 18:36:41.312502 IP6 raspbmc.local.36666 > alicia.local.49174: Flags [R.], seq 0, ack 105655458, win 0, length 0
IP6・・・だと?
tcp 0 0 *:36666 *:* LISTEN tcp6 0 0 [::]:sunrpc [::]:* LISTEN
あー、ポート36666はIPv4のINADDR_ANYにしかバインドされてない!これだ!!
つまり、こういうことでした。
・RaspbmcはIPv4、IPv6両方のアドレスを持つので、avahiで両方のアドレスが他のノードにアナウンスされる。
・でも、RaspbmcはIPv4の36666ポートしか接続を受け付けない。
・MBAはIPv6を優先でIPv6の36666ポートにアクセスしに行くけど、RaspbmcはIPv4の36666ポートしか見てないから繋がない。
お兄ちゃん!いつまで寝てるの!!
と、言うわけでこの話のオチ。
RaspbmcのIPv6を無効にすることで対処しました。
pi@raspbmc:~$ sudo vi /etc/sysctl.d/ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
そしてリブート・・・
通った。(エルクゥ風に)
256MB版Raspberry Piだけども、動作は超良好。
AirPlayサーバが欲しいだけならRaspberry Piで十分だわ。
Raspberry piにDebian squeezeをインストールする
Raspbianって独自にリポジトリを持ってるみたいでちょっと気持ち悪い。
ってだけの理由で、ちょい強引な手段でRaspbian armhf 10/28版をDebain squeeze armelに塗り替えてみます。
(メリット?debian-multimediaを混ぜ込み易いとかかなぁ?)
取り敢えずクリーンインストール直後からの手順です。
必要なパッケージのインストール
定番のdebootstrapとスタティックリンクされたbusyboxを突っ込んどきます。
$ sudo su - # apt-get install -y busybox-static debootstrap
debianのユーザランドを取得
debootstrapでsqueeze armelのユーザランドを構築します。
debianの驚くべきポータビリティはdebootstrapの功績が非常に大きいと思います。
# cd / # mkdir /debian # debootstrap --arch armel --include sudo,openssh-server squeeze /debian
使えそうなファイルをコピー
# cp -p /etc/passwd /debian/etc/ # cp -p /etc/network/interfaces /debian/etc/network/ # cp -p /etc/group /debian/etc/ # cp -p /etc/shadow /debian/etc/ # cp -rp /lib/modules/* /debian/lib/modules/ # cp -p /etc/sudoers /debian/etc/ # cp -p /etc/hosts /debian/etc/ # cp -rp /home/pi /debian/home/
さぁ、いっくよー!
さて、こっからが強引肉食系。
何も考えずに現在動作中のRaspbianのユーザランドを別のディレクトリに退避します。
マウント中のディレクトリは移動できずにエラーが発生しますが、無視しましょう。
# mkdir /raspbian # mv /* /raspbian/
これにより実行ファイル・共有ライブラリが正規の場所になくなるため、ほとんどのプログラムが起動出来なります。
(ロード中のプログラム(bashとか)は継続して稼働できますが、間違って終了させると詰みます。)
ここで威力を発揮するのがbusybox-staticです。
busyboxって言うのは多数のコマンドを一つのバイナリに集約させることで、共有できるコードを共有してディスクサイズを節約しようって言う組み込みLinux御用達のプログラムです。
さらに、static版は共有ライブラリがなくても動作できるので、今回のミッションにぴったりなわけです。
呪力を再び宿らせる
と、言うわけで、busybox-staticを使ってsqueezeのユーザランドをあるべき場所に配置します。
# /raspbian/bin/busybox mv /raspbian/debian/* /
これもやっぱりマウント中のディレクトリが文句を言いますが無視しましょう。
強引にリブート
これで作業はあらかた完了なのですが、この時点ではrebootコマンドが死んでるので、祈りながら電源を引っこ抜いてリブートします。
立ち上がりましたよね?
ここからは普通に最小構成のsqueezeなので、初期設定をして行きましょう。
この時点ではeth0が死んでるので、取り敢えず上げときます。
恒久的に設定するなら、/etc/network/interfacesにauto eth0を追加ですね。
# ifup eth0
後は例えば、キーマップは元に戻ってるのでインストールするとか。
# apt-get install console-setup
syslogを入れてみるとか。
# apt-get install syslog-ng