Apple社のiTunesなどに関連して、Bonjourという言葉を聞いたことがあると思います。Bonjourは同一ネットワークに提供されているサービスを把握するための仕組みで、対応している機器やコンピューターであれば、ネットワークにつないだだけでお互いのサービスを認識することができます。
今回はこのBonjourに対応したソフトウェアであるAvahiに関するレシピです。
Avahiの役割
Avahiはオープンソースソフトウェアとしてリリースされています。Ubuntuではデフォルトでインストールされます。Ubuntuを起動すると自動で起動し、インストールされているソフトウェアが提供するサービスをネットワークに配信するほか、同一ネットワークにあるBonjour対応ノードからの通知を受け付けて、その情報をキャッシュします。
このキャッシュ情報を一覧するソフトウェアが提供されているので使ってみましょう。Ubuntuソフトウェアセンターでパッケージ「avahi-discover」をインストールしてください。その後UnityのDashで「Avahi Zeroconf ブラウザ」を起動すると、以下のウィンドウが開きます。
図1 Avahi Zeroconfブラウザの画面
同一ネットワークに提供されているサービスが表示されます。すでにいろいろなサービスが提供されていることがわかります。サービスはまず、マシンがどのネットワークインターフェイスでその情報を受け取ったかによってeth0(有線LAN)、wlan0(無線LAN)に、どのインターネットプロトコルが使用されたかによりIPv4、IPv6に分けられます。次にサービスが属するドメイン(localなど)で分けられます。最後にサービスの内容で分類されます。
次では、代表的なサービス情報を見て行きます。
Avahi Zeroconf ブラウザでサービス情報を見る
Apple社のiTunesはBonjourを利用したソフトウェアです。ライブラリの共有設定がBonjourを利用します。今回はWindows機にインストールしたiTunesのライブラリ共有サービスを有効にし、別のマシンのAvahi Zeroconfブラウザーから見てみました。
図2 ライブラリが共有設定されているiTunesは、iTunes Audio Accessとして見える
サービスタイプは「_daap._tcp」で、Apple社のDigital Audio Access Protocolによるストリーミングサービスが提供されているようです。
次は別のネットワークにあるマシンに移動し、使われているネットワークプリンターを見てみます。ネットワークプリンターはHP社のPhotosmart B110です。
図3 Internet Printerとして見える
サービスタイプを見ると「_ipp._tcp」となっており、Internet Printing Protocolによるプリントサービスが提供されているようです。
Ubuntu標準のサウンドサーバーであるPulseAudioに関連するレシピとして、本連載の第106回ではネットワーク機能をご紹介しました。この裏でもサービスの通知にAvahiを利用しています。
図4 PulseAudio Sound Server/Source/Sinkが見える。うちSourceは向こうからの出力を、Sinkはこちらからの受け入れ先を意味する
サービスタイプは「_pulse-server._tcp」となっており、PulseAudio独自の方法でデータをやり取りすることが伺えます。
Bonjourによるサービスの通知を利用するのは、マルチメディア用途のソフトウェアだけではありません。例えば仮想化ソフトウェアであるlibvirtも、サービスの通知にAvahiを利用しています。
図5 Virtual Machine Managerとして見える
サービスタイプは「_libvert._tcp」となっています。libvirt独自のサービスが提供されていることが伺えます。
それではここから先は、見つけたサービスをUbuntuから利用していきましょう。
見つかったサービスを使う
Bonjourの仕組みによってサービスを見つけることができました。しかしそのサービスを利用できるかどうかは、使うソフトウェアの実装によって異なります。
iTunesの共有ライブラリの場合
DAAPサービスに対応したメディアプレイヤーが必要です。Ubuntu 12.04からデフォルトの音楽プレイヤーに復帰するRhythmboxやそれまでのデフォルトであったBansheeが対応しています。
図6 Bansheeであればメニュー「メディア」から、Rhythmboxであればメニュー「再生」からDAAPへの接続ウィンドウを開くことができる。URIとポートの入力が必要だが、これに関してはこのレシピの「ホスト名.localによる通信」を参照して欲しい
しかし、iTunesはそのバージョンによって実装しているDAAPに違いがあるため、RhythmboxやBansheeが常に対応できるわけではないことに注意してください。
ネットワークプリンターの場合
Ubuntuデフォルトの印刷システムであるCUPSは、Avahiを利用してBonjour対応のネットワークプリンターを検索して使うことができます。使用可能なプリンターとして登録するにはまず、デスクトップ右上の歯車マーク、項目「システム」、「印刷」アイコンとたどっていって「印刷」ウィンドウを開きます。「追加」ボタンをクリックして「新しいプリンター」ウィンドウを開くと、ネットワークプリンターとして表示されます。
図7 先ほどのHP Photosmart B110が「新しいプリンター」ウィンドウに表示されている
あとはUSB接続のプリンターと同じようにして登録するステップを踏んでいき、使用可能となります。
PulseAudioサウンドサーバーの場合
PulseAudioもまた、そのネットワーク機能にAvahiを利用します[1]。設定をすることで別のマシンに音声データを送信したり、別のマシンから音声データを受け取って鳴らしたりといったことができるようになります。詳しい設定の仕方は本連載の第106回を参照してください。
図8 「サウンドの設定」ウィンドウ。この例では他のUbuntu上のPulseAudioに向けて音声データを送っている
libvirtの場合
仮想化ソフトウェアであるlibvirtですが、他のコンピューター上で動いているlibvirtを見つける際にAvahiを利用します。
libvirtを画面上から操作するためのソフトウェアに、パッケージでインストールできるvirt-managerがあります。Avahiが使われている現場を目撃するにはこのパッケージをインストールして仮想マシンマネジャーを起動し、メニュー「ファイル」から項目「接続を追加」を選択。開いたウィンドウで「リモートホストに接続」オプションにチェックを入れ、「ホスト名」というプルダウンリストをクリックします。そうすると、「.local」が末尾についた名前を接続先として選択できます。
図9 ここではworkstation.localでアクセスできるマシンを接続先として選択している
最後に、この「.local」がくっついた名前について紹介して、今回のレシピはおしまいです。
ホスト名.localによる通信
avahi-discoverに戻って再びキャッシュ情報を見てみましょう。「アドレス」という項目にはIPアドレスやポート番号と共に、「laptop.local」という文字列が登場しています。「laptop」というのはこのノードのホスト名で、Ubuntuであればインストール時に「コンピューターの名前」として登録している文字列のことです。
図10 Ubuntuをインストールしたことがあればきっとこの画面に見覚えがあるだろう
「.local」のピリオドを除いた部分はノード側が設定するドメイン名で、サービスが使用するものと同じです。たいていの場合は「local」を用いているようですので、以降は簡便のために「local」が使われているものとして話を進めます。
起動しているAvahiが持つキャッシュには、この「ホスト名.local」とIPアドレスの組み合わせ表が含まれています[2]。Ubuntuのネットワーク機能はこの組み合わせ表をデフォルトで利用するようになっており[3]、Ubuntu上で動くどのソフトウェアでも「ホスト名.local」を使って通信することを可能としています。
図11 Firefoxでの例。ロケーションバーは「server.local」となっており、「server」をホスト名に持つウェブサーバーと通信できていることがわかる
もしAvahiを使わずにホスト名による通信を行いたければ、ローカルエリアネットワーク内の通信相手のIPアドレスとホスト名の組をシステムに登録するか、あるいはローカルエリアネットワーク向けのDNSサーバーを設ける必要があり、なかなか面倒です。
まとめ
直接触れる機会のない地味な存在であるAvahiですが、ローカルエリアネットワーク内のノード同士のアクセスをとても簡単にしてくれる、縁の下の力持ちです。Ubuntuにおいて重要な役割を果たしていると言えるでしょう。