サービス設定

提供サービスの設定

avahiでは/etc/avahi/services/*.serviceにそのホストが提供するサービスの一覧を置く。FreeBSDだと/usr/local/etc/avahi/services/*.serviceとなる。例えばsshのサービスを提供する場合は、ssh.serviceというファイルに内容を書く。内容はXMLで記述されている。

ここで書くべき内容はavahi.service(5)を見て欲しいが、XML Tagの部分を以下に簡単に訳してみた。

説明

/etc/avahi/services/*.serviceは、静的なDNS-SDサービスデータを含んでいる、複数のファイルである。全てのサービスファイルは同じ名前を共有する複数のサービス定義を記述できる。これは複数のプロトコルを実装したサービスを配信するのに役に立つ。(例: _ipp._tcp と _printer.tcp の二つのサービスを持つプリンタ実装)

トップレベル要素。一つの要素と一つ以上の要素を持たなければ
ならない。

提供するサービスの名前。もしもreplace-wildcards属性がyesであれば、"%h"というはローカルのホスト名に置き換えられる。例えば"Remote Terminal on %h"などのように使う。初期値は"no"である。

一つのサービスに関する情報を指定する要素。必ず一つの要素、一つの要素を含まなければならない。また、一つの要素、一つの要素、任意の数の要素、任意の数の要素を含んでもよい。

protocol属性は配信するプロトコルを指定する。もしも"any"であればIPv4IPv6の両方を配信する。また、初期値は"any"である。

提供するサービスのDNS-SD サービスタイプを指定する。例えば"_http._tcp"など。

提供するサービスの追加のDNS-SD サービスタイプを指定する。例えば"_anon._sub._ftp._tcp"など。

提供するサービスを指定する。もし省略された場合は、avahi daemonの初期設定を使用する。(おそらく ".local"であろう)

サービスを提供するホスト名を指定する。このホスト名はMulticast DNSかunicast DNSで解決できなければならない。注意してほしいのは、FQDNで指定する必要があるという点である。例えば、.localなどが暗黙のうちに追加されたりしないことに注意。ホスト名はで指定したドメインを含む必要はない。

もっと詳しくホスト名マッピングについて知りたい場合はavahi.hosts(5)を参照すること。

listenするポート番号を指定する。

DNS-SD TXT のレコード情報を指定する。

サービスの設定

サービス配信を行うにはDNS-SDに登録されたサービスタイプを設定しなければいけない。自分で設定したサービスの登録などしてられないが、手元で使う分には特にDNS-SDに登録する必要はない。

例として、DNS-SDに登録されていない、synergy(http://synergy2.sourceforge.net/)のサービスを登録してみた。/usr/local/etc/avahi/service/synergy.serviceに以下の内容でファイルを作って置き、avahi-daemonをrestartする。

 <?xml version="1.0" standalone='no'?>
 <!DOCTYPE service-group SYSTEM "avahi-service.dtd">
 <service-group>
  <name replace-wildcards="yes">Synergy server of %h</name>
  <service>
    <type>_synergy._tcp</type>
    <port>24800</port>
    <txt-record>Synergy service</txt-record>
  </service>
 </service-group>

すると、今までできなかった synergyサービスの発見が、以下のコマンドでできるようになる。

  % sudo /usr/local/etc/rc.d/avahi-daemon.sh restart
  Stopping avahi-daemon.
  Starting avahi-daemon.

  % avahi-browse -r _synergy._tcp
  +  re0 IPv6 Synergy server of exhost         _synergy._tcp local
  +  re0 IPv4 Synergy server of exhost         _synergy._tcp local
  =  re0 IPv6 Synergy server of exhost         _synergy._tcp local
     hostname = [exhost.local]
     address = [fe80:3::abe:deff:fef7:2a08]
     port = [24800]
     txt = ["Synergy service"]
  =  re0 IPv4 Synergy server of exhost         _synergy._tcp local
     hostname = [exhost.local]
     address = [192.168.0.10]
     port = [24800]
     txt = ["Synergy service"]