Yosemiteの次、「El Capitan」の足音が迫りつつある今日この頃。開発者版/Public Beta版に手を出すのもいいが、趣味でOS Xを使うのならば、正式リリースまで他ジャンルをチェックして見聞を拡げてもいいのでは……というわけで、「OS XとRaspberry Pi」の第2弾をお送りする。

Raspberry Piでも「Bonjour」を

Raspberry PiでRaspbianベースのLinuxディストリビューションを利用していると実感するのが、「Zeroconf」というコンセプトの有難味だ。アップルを中心としたIETFのワーキンググループは、仕様をRFC 3927として標準化するとともに、mDNSResponderなど主要部分はオープンソース化された。

Bonjour(旧称:Rendezvous)はそのOS X/iOS向け実装であり、Linuxに収録されている「Avahi」も基本的な仕様は変わらず、両者には互換性が確保されている。乱暴な表現をすれば、LinuxなどのフリーなOSで動作するBonjourがAvahi、という理解でいいだろう。

Raspbianの初期設定ではAvahiが有効なため、有線/無線LANの基本設定を終えれば「○○○.local」の形式でアドレスを指定できる。Raspberry Piはローカルにキーボードを接続しない活用スタイルが一般的 -- 好みの問題だがバッテリー消費量やGUIの負荷からするとリモートアクセスがベター -- という事情もあり、IPアドレスの設定なしに運用を開始できることは大きなメリットだ。

前置きが長くなったが、その「Avahi」はBonjour互換でありつつも独自に実装されているソフトウェアだ。Raspbianに収録されているAvahiは、デーモンやライブラリ以外にも「avahi-utils」というパッケージを提供しており、OS XのBonjourにはない機能を備えている。

OS Xでは黒子に徹している感があるBonjourだが、そのオープンソースの実装「Avahi」にはいろいろ便利なコマンドが用意されている

サービスをリストアップ

「avahi-browse」は、同じネットワークに属すZeroconfネットワーク(Bonjour/Avahi)をブラウズするためのコマンド。実行中のすべてのサービスを表示するには「-a」オプション、ひととおり表示したあとにコマンドを終了するための「-t」オプションとセットで利用するのがオーソドックスな利用法だ(例1)。

例1:すべてのサービスをリストアップする(処理後停止)

$ avahi-browse -a -t

サービス名を特定できる場合は、「_ssh._tcp」(SSHサーバ)や「_afpovertcp._tcp」(AFPサーバ)といった文字列を引数として与え、さらに前述の「-t」オプションもあわせて指定する(例2)。これで、LAN上に存在するすべてのAFPサーバを表示できる。

例2:ネットワーク上のAFPサーバをリストアップする

$ avahi-browse _afpovertcp._tcp -t

LAN上で公開されているAFPサーバをリストアップしたところ

IPアドレスとホスト名を相互変換

ホストのIPアドレスを知りたい場合には、「-n」オプションに続けて対象のホスト名(Bonjour名)を指定する。これで、そのホストのIPアドレスが表示されるはずだ(例3)。「-a」オプションを使えば、反対にIPアドレスからホスト名を割り出すこともできる(例4)。OS Xにはありそうでない機能なだけに、このコマンドの存在を知っていれば(当然Avahi収録のマシン使用時に限るが)役に立つこともあるはずだ。

例3:ホスト名からIPアドレスを割り出す

$ avahi-resolve -n LaCie-d2.local
LaCie-d2.local  192.168.12.25


例4:IPアドレスからホスト名を割り出す

$ avahi-resolve -a 192.168.12.7
192.168.12.7    MBAir.local

ホスト名にIPアドレスを割り当てる

ホスト名にIPアドレスを割り当てることができる。OS XのBonjourでは、自分のマシンについてのみ「システム環境設定」の「共有」パネルでホスト名(Bonjour名)を設定できるが、ネットワーク上に存在する他のホストに対しては何もできない。しかし、avahi-publishコマンドを使えば、Bonjour/Avahiが動作していないマシンも「○○○.local」の形式でホスト名を割り当てることができるのだ。

たとえば、IPアドレスが192.168.12.4のホストに「nasne.local」という名前を割り当てるには、例5のとおりコマンドを実行する。ただし、サービスとして実行することはできず、Control-Zを押してジョブをバックグラウンドに切り替えなければ他のコマンドは実行できない。一時的にBonjour名を割り当てたいときに使える方法だ。

例5:ホスト名にIPアドレスを割り当てる

$ avahi-publish -a nasne.local 192.168.12.4
Established under name 'nasne.local'

最初は「nasne.local」にpingを打っても通らなかったが、avahi-publishでマッピング開始後はpingが通るようになった

avahi-utilsパッケージに含まれるコマンド
コマンド名 機能
avahi-resolve IPアドレスとホスト名の相互変換を行う
avahi-set-host-name 現在のAvahiデーモンに対しmDNSホストを割り当てる
avahi-publish ホスト/IPアドレスおよびサービスのマッピングを行う
avahi-browse Zeroconfネットワークをブラウズする
avahi-publish-address 「avahi-publish -a」と同じ
avahi-publish-service 「avahi-publish -s」と同じ
avahi-browse-domains 外部のmDNSドメインを検索する
avahi-resolve-address 「avahi-resolve -a」と同じ
avahi-resolve-host-name 「avahi-resolve -n」と同じ