「Avahi」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
14行目: 14行目:
   
 
== Avahi を使う ==
 
== Avahi を使う ==
  +
  +
=== ホスト名の解決 ===
  +
Avahi には {{ic|''hostname''.local}} という名前を使ってローカルでホスト名を解決する機能があります。有効にするには {{Pkg|nss-mdns}} パッケージをインストールして {{ic|avahi-daemon.service}} を[[起動]]してください。
  +
  +
その後、{{ic|/etc/nsswitch.conf}} ファイルを編集して以下の行を:
  +
hosts: files dns myhostname
  +
以下のように変更してください:
  +
hosts: files mdns_minimal [NOTFOUND=return] dns myhostname
  +
  +
{{Note|{{ic|.local}} ホストの解決に時間がかかる場合、{{ic|mdns_minimal}} の代わりに {{ic|mdns4_minimal}} を使ってみてください。}}
  +
  +
==== カスタム TLD を使用する場合の mDNS の設定 ====
  +
  +
{{ic|mdns_minimal}} モジュールが {{ic|.local}} TLD の取り合わせを処理します。{{ic|<nowiki>[NOTFOUND=return]</nowiki>}} と設定しているのは、{{ic|mdns_minimal}} が {{ic|*.local}} を見つけられなかったときに、{{ic|dns}} や {{ic|myhostname}} などで検索しないようにするためです。
  +
  +
Avahi で他の TLD もサポートしたい場合、以下の設定を行ってください:
  +
* {{ic|1=mdns_minimal [NOTFOUND=return]}} を {{ic|mdns}} に置き換えてください。IPv4 や IPv6 しか使わないモジュール {{ic|mdns[46](_minimal)}} も存在します。
  +
* {{ic|/etc/avahi/avahi-daemon.conf}} の {{ic|domain-name}} をカスタマイズしてください。
  +
* {{ic|/etc/mdns.allow}} で Avahi のカスタム TLD をホワイトリストに入れてください。
  +
  +
==== ツール ====
  +
  +
Avahi にはネットワーク上で動作しているサービスを探知するのに役立つユーティリティが複数含まれています。例えば、以下のコマンドを実行するとネットワーク上のサービスが表示されます:
  +
$ avahi-browse -alr
  +
  +
Avahi Zeroconf Browser ({{ic|avahi-discover}}) はネットワーク上の様々なサービスを表示します。使用するには Avahi の任意依存パッケージである {{Pkg|pygtk}} と {{Pkg|python2-dbus}} のインストールが必要です。また、{{ic|bssh}} と {{ic|bvnc}} を使うことで SSH サーバーや VNC サーバーを探知することができます。
  +
  +
Avahi をサポートしているソフトウェアのリストはウェブサイトを見てください: http://avahi.org/wiki/Avah4users
  +
  +
=== ファイアウォール ===
  +
  +
[[ファイアウォール]]を使っている場合は UDP ポート {{ic|5353}} を開いてください。
  +
  +
===リンクローカル (Bonjour/Zeroconf) チャット===
  +
  +
Avahi を使って Linux で Bonjour プロトコルを使用することもできます。[[Wikipedia:Comparison of instant messaging clients]] や[[アプリケーション一覧/インターネット#インスタントメッセージ]]に Bonjour プロトコルをサポートしているクライアントが載っています。
  +
 
=== IPv4LL IP アドレスの取得 ===
 
=== IPv4LL IP アドレスの取得 ===
 
デフォルトでは、DHCP を使って IP を取得するとき、{{Pkg|dhcpcd}} パッケージを使用します。DHCP で IP アドレスが取得できなかったときに IPv4LL アドレスを取得するようにすることができます。デフォルトではこのオプションは無効になっています。有効にするには noipv4ll をコメントアウトしてください:
 
デフォルトでは、DHCP を使って IP を取得するとき、{{Pkg|dhcpcd}} パッケージを使用します。DHCP で IP アドレスが取得できなかったときに IPv4LL アドレスを取得するようにすることができます。デフォルトではこのオプションは無効になっています。有効にするには noipv4ll をコメントアウトしてください:
25行目: 62行目:
 
# avahi-autoipd -D
 
# avahi-autoipd -D
   
=== ト名解決 ===
+
== サービスの追加 ==
Avahi によってホスト名を使ってコンピューターにアクセスすることが可能です。
 
{{Note|これを使うには {{Pkg|nss-mdns}} をインストールして、{{ic|avahi-daemon.service}} を有効にし動作させる必要があります。}}
 
   
  +
Avahi は {{ic|/etc/avahi/services}} に {{ic|*.service}} ファイルが存在するサービスを喧伝します。{{ic|*.service}} ファイルが存在しないサービスを使いたい場合、簡単にサービスを作成することができます。
Avahi を動作させている ''maple'', ''fig'', ''oak'' という名前のマシンがあると考えます。Avahi を設定することでそれぞれのコンピュータの {{ic|/etc/hosts}} ファイルを管理する必要がなくなります。代わりに {{ic|maple.local}} を使うことで ''maple'' が持っている全てのサービスにアクセスすることが可能です。ただし、デフォルトでは {{ic|.local}} の問い合わせは Arch Linux では無効になっています。有効にするにはファイル {{ic|/etc/nsswitch.conf}} を編集して次の行を:
 
hosts: files dns myhostname
 
以下のように変更してください:
 
hosts: files mdns_minimal [NOTFOUND=return] dns myhostname
 
   
  +
例として、[http://tools.ietf.org/html/rfc865 RFC865] に基づく今日の格言 (QOTD) を表示するサービスを TCP の17番ポートで稼働させるとしましょう。
{{ic|mdns_minimal}} モジュールは {{ic|.local}} TLD のクエリーだけを処理します。他の TLD を使うように Avahi を設定している場合は、最後に完全な {{ic|mdns}} モジュールも追加してください。IPv4 だけや IPv6 だけのモジュール {{ic|mdns[46](_minimal)}} も存在します。
 
   
  +
まず最初に {{ic|<type>}} を決定する必要があります。{{ic|man avahi.service}} によればタイプは DNS-SD サービスタイプのどれかにする必要があります (例: {{ic|_http._tcp}})。[http://www.dns-sd.org/ServiceTypes.html DNS-SD のレジスタは2010年に IANA レジスタに統合] されたため、サービス名は [http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml IANA レジスタ] や {{ic|/etc/services}} ファイルで確認することができます。サービス名は {{ic|qotd}} となっています。QOTD は tcp で動作するため、サービスは {{ic|_qotd._tcp}} でありポート番号は 17 となります (IANA と RFC865 に準拠)。
Avahi にはネットワーク上で動作しているサービスを見つけるのに役立つユーティリティが複数含まれています。例えば、ネットワーク中のサービスを探すには、次を実行してください:
 
$ avahi-browse -alr
 
   
  +
したがってサービスファイルは以下のようになります:
Avahi Zeroconf ブラウザ ({{ic|avahi-discover}}) はあなたのネットワーク上の様々なサービスを表示します。また、{{ic|bssh}} や {{ic|bvnc}} を使うことで SSH や VNC サーバーをそれぞれ閲覧することが可能です。
 
   
  +
{{hc|qotd.service|<nowiki>
Avahi のウェブサイトには Avahi がサポートしているソフトウェアの一覧があります: http://avahi.org/wiki/Avah4users
 
  +
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
{{Note|{{ic|avahi-discover}} を使うには {{Pkg|pygtk}} と {{Pkg|python2-dbus}} をインストールする必要があります。}}
 
  +
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
  +
  +
<service-group>
  +
  +
<name replace-wildcards="yes">%h</name>
  +
  +
<service>
  +
<type>_qotd._tcp</type>
  +
<port>17</port>
  +
</service>
  +
  +
</service-group>
  +
</nowiki>}}
  +
  +
別のサーバーでサービスを動作させる場合や、DNS のサブタイプが異なる場合など、複雑なサービスについては {{ic|man avahi.service}} を読んでください。
  +
  +
=== SSH ===
  +
  +
Avahi には SSH サーバーを喧伝するサンプルサービスファイルが付属しています。有効化するには:
  +
# cp /usr/share/doc/avahi/ssh.service /etc/avahi/services/
   
 
===ファイル共有===
 
===ファイル共有===
   
 
====NFS====
 
====NFS====
[[NFS]] 共有を設定している場合は、Avahi を使って Zeroconf が有効になっているブラウザ (KDE の Konqueror や OS X の Finder など) で共有を自動マウントすることができます。{{ic|/etc/avahi/services}} に以下の内容で {{ic|.service}} ファイルを作成してください:
+
[[NFS]] 共有を設定している場合は、Avahi を使って Zeroconf が有効になっているブラウザ (KDE の Konqueror や macOS の Finder など) で共有を自動マウントすることができます。{{ic|/etc/avahi/services}} に以下の内容で {{ic|.service}} ファイルを作成してください:
 
{{hc|/etc/avahi/services/nfs_Zephyrus_Music.service|<nowiki>
 
{{hc|/etc/avahi/services/nfs_Zephyrus_Music.service|<nowiki>
 
<?xml version="1.0" standalone='no'?>
 
<?xml version="1.0" standalone='no'?>
60行目: 111行目:
 
</service-group></nowiki>}}
 
</service-group></nowiki>}}
   
{{ic|/etc/exports}} にオプションとして ''insecure'' を使っている場合ポートはこのままでいいですが、そうでない場合は変更する必要があります (OS X クライアントには ''insecure'' が必要です)。パスは export しているパスか、そのサブディレクトリになります。なんらかの理由で Leopard から自動マウント機能は削除されていますが、[http://www.macosxhints.com/article.php?story=20071116042238744 スクリプトを使うことができます]。このスクリプトは[http://ubuntuforums.org/showthread.php?p=4387032#post4387032 この投稿] に基づいています。
+
{{ic|/etc/exports}} にオプションとして ''insecure'' を使っている場合ポートはこのままでいいですが、そうでない場合は変更する必要があります (macOS クライアントには ''insecure'' が必要です)。パスは export しているパスか、そのサブディレクトリになります。なんらかの理由で Leopard から自動マウント機能は削除されていますが、[http://www.macosxhints.com/article.php?story=20071116042238744 スクリプトを使うことができます]。このスクリプトは[http://ubuntuforums.org/showthread.php?p=4387032#post4387032 この投稿] に基づいています。
   
 
====Samba====
 
====Samba====
  +
サーバーとクライアントの両方で Avahi デーモンを動作させることで、クライアント側のファイルマネージャで自動的にサーバーが認識されます。
何も設定しなくても動くはずです。
 
 
====GShare====
 
[[Arch User Repository]] から {{AUR|gshare}} をインストールして LAN 間でファイルを共有できます。設定は必要ありません、ちゃんと動くはずです。
 
   
 
====Vsftpd====
 
====Vsftpd====
:ソース: [http://ubuntuforums.org/showthread.php?t=218630 ubuntuforums.org]
+
[[vsftpd]] などの通常の FTP サバーを自動探知することもできます。{{Pkg|vsftpd}} パッケージをイントールして vsftpd の設定を自由に変更してください ([http://ubuntuforums.org/showthread.php?t=218630 ubuntuforums.org のスレッド] や {{ic|man vsftpd.conf}} を参照)。
標準の ftp サービスを使いたい場合は、vsftpd と avahi をインストールしてください。vsftpd の設定を ubuntuforums ページに従うか、個人設定によって変更してください ({{ic|man vsftpd.conf}} を参照)。
 
   
{{ic|/etc/avahi/services}} に {{ic|ftp.service}} ファイルを作成して、そのファイルの中に以下を貼り付けて下さい:
+
そして以下の内容で {{ic|/etc/avahi/services}} に {{ic|.service}} ファイルを作成:
  +
{{hc|/etc/avahi/services/ftp.service|<nowiki>
<?xml version="1.0" standalone='no'?>
 
  +
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
 
<service-group>
+
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
  +
<service-group>
<name>FTP file sharing</name>
 
  +
<name>FTP file sharing</name>
<service>
 
  +
<service>
 
<type>_ftp._tcp</type>
 
<type>_ftp._tcp</type>
 
<port>21</port>
 
<port>21</port>
</service>
+
</service>
</service-group>
+
</service-group>
  +
</nowiki>}}
設定が完了したら、{{ic|avahi-daemon.service}} と {{ic|vsftpd.service}} のサービスを[[systemd#ユニットを使う|再起動]]してください。
 
   
これでネットワークの他のコンピュータから ftp サーバーを通して閲覧できるようになっているはずです。このセションにかれた手順が作られて ftp サーバーは avahi によってローカルの Zeroconf ネットワークになり
+
これで FTP サーバーが Avahi によって喧伝されるようになります。ネットワークの他のコンピュータからファイルマネージャを使って FTP サーバーに接続できるはずです。クライアト側で[[#ホスト名の解決|ホスト名の解決]]を有効する必要があるもしれません
   
  +
===携帯デバイスからの Airprint===
GNOME や KDE を使っていない場合、ファイルマネージャを使って直接 ftp サーバーにログインすることができないかもしれません。そのときは ftp クライアントを使ってマシンのサーバーの IP アドレスか ([[#ホスト名の解決|このセクション]]で説明しているように) ホスト名を指定してください。
 
  +
Avahi と CUPS を組み合わせることで airprint に対応している携帯デバイスからプリンターに印刷をすることができます。印刷機能を有効にするには、{{ic|/etc/avahi/services/}} にプリンターの Avahi サービスファイルを作成してください。HP-Laserjet プリンターの場合、サービスファイルは以下のようになります。{{ic|name}}, {{ic|rp}}, {{ic|ty}}, {{ic|adminurl}}, {{ic|note}} フィールドは適切な値に置き換えてください。
   
  +
{{hc|/etc/avahi/services/airprint.service|<nowiki>
====Giver====
 
  +
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
[http://code.google.com/p/giver/ Giver] は Giver を動作させている2つのデスクトップ間で簡単にファイルを共有できる mono のプログラムです。必要な操作はファイルをクリックしてファイルを送信したい相手の名前か写真にドラッグするだけです。
 
  +
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
  +
<service-group>
  +
<name>yourPrnterName</name>
  +
<service>
  +
<type>_ipp._tcp</type>
  +
<subtype>_universal._sub._ipp._tcp</subtype>
  +
<port>631</port>
  +
<txt-record>txtver=1</txt-record>
  +
<txt-record>qtotal=1</txt-record>
  +
<txt-record>rp=printers/yourPrnterName</txt-record>
  +
<txt-record>ty=yourPrnterName</txt-record>
  +
<txt-record>adminurl=http://198.168.7.15:631/printers/yourPrnterName</txt-record>
  +
<txt-record>note=Office Laserjet 4100n</txt-record>
  +
<txt-record>priority=0</txt-record>
  +
<txt-record>product=(GPL Ghostscript)</txt-record>
  +
<txt-record>printer-state=3</txt-record>
  +
<txt-record>printer-type=0x801046</txt-record>
  +
<txt-record>Transparent=T</txt-record>
  +
<txt-record>Binary=T</txt-record>
  +
<txt-record>Fax=F</txt-record>
  +
<txt-record>Color=T</txt-record>
  +
<txt-record>Duplex=T</txt-record>
  +
<txt-record>Staple=F</txt-record>
  +
<txt-record>Copies=T</txt-record>
  +
<txt-record>Collate=F</txt-record>
  +
<txt-record>Punch=F</txt-record>
  +
<txt-record>Bind=F</txt-record>
  +
<txt-record>Sort=F</txt-record>
  +
<txt-record>Scan=F</txt-record>
  +
<txt-record>pdl=application/octet-stream,application/pdf,application/postscript,image/jpeg,image/png,image/urf</txt-record>
  +
<txt-record>URF=W8,SRGB24,CP1,RS600</txt-record>
  +
</service>
  +
</service-group>
  +
</nowiki>}}
   
  +
もしくは https://raw.github.com/tjfontaine/airprint-generate/master/airprint-generate.py を使って Avahi サービスファイルを生成することもできます。スクリプトは {{Pkg|python2}} と {{Pkg|python2-pycups}} に依存しており、以下のコマンドで使用することができます:
パッケージは {{AUR|giver}} です。
 
   
  +
# python2 airprint-generate.py -d /etc/avahi/services
Giver は gnome-sharp に依存しており、gnome-sharp は GNOME のパッケージに依存しているので注意してください。
 
   
  +
{{Note|http://localhost:631/printers でプリンターが "Not Shared" になっている場合、上記の python スクリプトは {{ic|/etc/avahi/services}} に何もファイルを出力しません。その場合、CUPS のドロップダウンメニューから "Modify Printer" を選択して共有を有効にしてください。共有ができない場合、[[CUPS/プリンター共有]]を参照してください。}}
===リンクローカル (Bonjour/Zeroconf) 通信===
 
   
  +
== サービスタイプデータベースの編集 ==
Avahi を linux の bonjour プロトコルのサポートのために使うことができます。[[Wikipedia:Comparison of instant messaging clients]] や[[アプリケーション一覧#インスタントメッセージ]]で bonjour プロトコルをサポートしているクライアントのリストを確認してください。
 
  +
上に記述したとおり、Avahi にはサービスを確認することができるツールが付属しています。{{ic|avahi-browse}} と {{ic|avahi-discover}} はどちらもデータベースファイルを使用してサービスの説明を表示します。データベースにはほとんどのサービスの名前が含まれています (全てではありません)。
   
  +
残念ながら、作成したばかりの QOTD サービスはデータベースに含まれていないため {{ic|avahi-browse -a}} は以下のようなエントリを表示します:
===携帯デバイスからの Airprint===
 
Avahi は CUPS と協同して airprint 対応の携帯デバイスからほとんど全てのプリンターに印刷する機能も提供します。デバイスからの印刷機能を有効にするには、プリンターの avahi サービスファイルを /etc/avahi/services に作成して avahi を再起動してください。HP-Laserjet プリンターの一般的なサービスファイルは以下の例のようになります。name, rp, ty, adminurl, note は変えて下さい。ファイルは /etc/avahi/services/youFileName.service として保存します:
 
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
 
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
 
<service-group>
 
<name>yourPrnterName</name>
 
<service>
 
<type>_ipp._tcp</type>
 
<subtype>_universal._sub._ipp._tcp</subtype>
 
<port>631</port>
 
<txt-record>txtver=1</txt-record>
 
<txt-record>qtotal=1</txt-record>
 
<txt-record>rp=printers/yourPrnterName</txt-record>
 
<txt-record>ty=yourPrnterName</txt-record>
 
<txt-record>adminurl=http://198.168.7.15:631/printers/yourPrnterName</txt-record>
 
<txt-record>note=Office Laserjet 4100n</txt-record>
 
<txt-record>priority=0</txt-record>
 
<txt-record>product=virtual Printer</txt-record>
 
<txt-record>printer-state=3</txt-record>
 
<txt-record>printer-type=0x801046</txt-record>
 
<txt-record>Transparent=T</txt-record>
 
<txt-record>Binary=T</txt-record>
 
<txt-record>Fax=F</txt-record>
 
<txt-record>Color=T</txt-record>
 
<txt-record>Duplex=T</txt-record>
 
<txt-record>Staple=F</txt-record>
 
<txt-record>Copies=T</txt-record>
 
<txt-record>Collate=F</txt-record>
 
<txt-record>Punch=F</txt-record>
 
<txt-record>Bind=F</txt-record>
 
<txt-record>Sort=F</txt-record>
 
<txt-record>Scan=F</txt-record>
 
<txt-record>pdl=application/octet-stream,application/pdf,application/postscript,image/jpeg,image/png,image/urf</txt-record>
 
<txt-record>URF=W8,SRGB24,CP1,RS600</txt-record>
 
</service>
 
</service-group>
 
   
  +
+ wlp2s0 IPv4 MyServer _qotd._tcp local
もしくは、https://raw.github.com/tjfontaine/airprint-generate/master/airprint-generate.py を使って Avahi のサービスファイルを生成することができます。このスクリプトは python2 と pycups に依存しています。スクリプトを実行するには: {{bc|# python2 airprint-generate.py -d /etc/avahi/services}}
 
   
=== ファイアウォ ===
+
=== スの取得 ===
  +
  +
まずは [https://github.com/lathiat/avahi avahi の github ミラー] にある {{ic|service-type-database}} サブディレクトリから {{ic|build-db.in}} と {{ic|service-types}} ファイルをダウンロードしてビルドディレクトリに配置してください:
  +
  +
$ wget https://raw.githubusercontent.com/lathiat/avahi/master/service-type-database/build-db.in
  +
$ wget https://raw.githubusercontent.com/lathiat/avahi/master/service-type-database/service-types
  +
  +
=== ソースの修正 ===
  +
  +
次に、以下のスクリプトを作成してください:
  +
  +
#!/bin/bash
  +
sed -e 's,@PYTHON\@,/usr/bin/python2.7,g' \
  +
-e 's,@DBM\@,gdbm,g' < build-db.in > build-db
  +
chmod +x build-db
  +
  +
上記のスクリプトは {{ic|build-db}} という名前のファイルを作成します:
  +
  +
$./whatever_you_named_the_script.sh
  +
$ ls
  +
build-db build-db.in service-types whatever_you_named_the_script.sh
  +
  +
そして、{{ic|service-types}} ファイルに新しい QOTD サービスを追加してください。ファイルは1行毎に1エントリとなっており、{{ic|type:Human Readable Description}} という形式でエントリを記入します。説明には空白を入れることができます。
  +
  +
例えば、ファイルの末尾に以下のエントリを追加します:
  +
  +
_qotd._tcp:Quote of the Day (QOTD) Server
  +
  +
=== 新しいデータベースのビルドとインストール ===
  +
  +
{{ic|build-db}} python スクリプトを実行してください (python3 ではなく python2 を使用します)。{{ic|service-types.db}} ファイルがビルドされます。ビルドされたら {{ic|gdbmtools}} を使って新しいデータベースがロードできること、新しいエントリが含まれていることを確認してください:
  +
  +
$ /usr/bin/python2.7 build-db
  +
$ ls
  +
build-db build-db.in service-types service-types.db whatever_you_named_the_script.sh
  +
$ gdbmtool service-types.db
  +
  +
Welcome to the gdbm tool. Type ? for help.
  +
  +
gdbmtool>fetch _qotd._tcp
  +
Quote of the Day (QOTD) Server
  +
gdbmtool>quit
  +
  +
古いデータベースをバックアップしてから、新しいデータベースを移動して {{ic|avahi-browse}} で新しいエントリが認識されるようになったことを確認:
  +
  +
$ cp /usr/lib/avahi/service-types.db /backup-directory
  +
# cp /build-directory/service-types.db /usr/lib/avahi/service-types.db
  +
$ avahi-browse -b | grep QOTD
  +
Quote of the Day (QOTD) Server
   
  +
{{ic|avahi-browse}} のエントリは以下のようになります:
iptables を使っている場合 UDP ポート 5353 を開いて下さい:
 
# iptables -A INPUT -p udp -m udp --dport 5353 -j ACCEPT
 
   
  +
+ wlp2s0 IPv4 MyServer Quote of the Day (QOTD) Server local
ファイアウォールとして[[シンプルなステートフルファイアウォール]]を使っている場合は:
 
# iptables -A UDP -p udp -m udp --dport 5353 -j ACCEPT
 
   
 
==参照==
 
==参照==
* [http://avahi.org/ Avahi] - 公式プロジェクトウェブサイト
+
* [http://avahi.org/ Avahi] - プロジェクトの公式ウェブサイト
  +
* [[wikipedia:ja:Avahi]]
* [http://www.apple.com/support/downloads/bonjourforwindows.html Bonjour for Windows] - Windows で Zeroconf を有効にする
 
  +
* [http://www.apple.com/support/downloads/bonjourforwindows.html Bonjour for Windows] - Windows で Zeroconf を有効化
 
* http://www.zeroconf.org/
 
* http://www.zeroconf.org/

2016年11月6日 (日) 19:29時点における版

Wikipedia:ja:Avahi より:

"Avahi は、Zeroconf (ゼロ・コンフィギュレーション・ネットワーキング) のフリーソフトウェア実装であり、マルチキャスト DNS/DNS-SD サービスディレクトリのためのシステムを含む。Avahi は、特定の構成情報のないローカルネットワーク上のサービスホストの発行と発見を可能とする。例えば、ネットワークに接続したとき、即座にプリンタを検出し、ファイルを探し出し、他者と会話できるようにする。GNU Lesser General Public License (LGPL) の条件でライセンス提供される。"

インストール

公式リポジトリにある avahiインストールしてください。

Avahi のデーモンは systemdavahi-daemon.service を使うことで管理できます。

IPv6 を有効にする

いくつかの理由で、Avahi はデフォルトで IPv6 が無効になっています。有効にするには、/etc/avahi/avahi-daemon.confuse-ipv6yes に設定してください。

Avahi を使う

ホスト名の解決

Avahi には hostname.local という名前を使ってローカルでホスト名を解決する機能があります。有効にするには nss-mdns パッケージをインストールして avahi-daemon.service起動してください。

その後、/etc/nsswitch.conf ファイルを編集して以下の行を:

hosts: files dns myhostname

以下のように変更してください:

hosts: files mdns_minimal [NOTFOUND=return] dns myhostname
ノート: .local ホストの解決に時間がかかる場合、mdns_minimal の代わりに mdns4_minimal を使ってみてください。

カスタム TLD を使用する場合の mDNS の設定

mdns_minimal モジュールが .local TLD の取り合わせを処理します。[NOTFOUND=return] と設定しているのは、mdns_minimal*.local を見つけられなかったときに、dnsmyhostname などで検索しないようにするためです。

Avahi で他の TLD もサポートしたい場合、以下の設定を行ってください:

  • mdns_minimal [NOTFOUND=return]mdns に置き換えてください。IPv4 や IPv6 しか使わないモジュール mdns[46](_minimal) も存在します。
  • /etc/avahi/avahi-daemon.confdomain-name をカスタマイズしてください。
  • /etc/mdns.allow で Avahi のカスタム TLD をホワイトリストに入れてください。

ツール

Avahi にはネットワーク上で動作しているサービスを探知するのに役立つユーティリティが複数含まれています。例えば、以下のコマンドを実行するとネットワーク上のサービスが表示されます:

$ avahi-browse -alr

Avahi Zeroconf Browser (avahi-discover) はネットワーク上の様々なサービスを表示します。使用するには Avahi の任意依存パッケージである pygtkpython2-dbus のインストールが必要です。また、bsshbvnc を使うことで SSH サーバーや VNC サーバーを探知することができます。

Avahi をサポートしているソフトウェアのリストはウェブサイトを見てください: http://avahi.org/wiki/Avah4users

ファイアウォール

ファイアウォールを使っている場合は UDP ポート 5353 を開いてください。

リンクローカル (Bonjour/Zeroconf) チャット

Avahi を使って Linux で Bonjour プロトコルを使用することもできます。Wikipedia:Comparison of instant messaging clientsアプリケーション一覧/インターネット#インスタントメッセージに Bonjour プロトコルをサポートしているクライアントが載っています。

IPv4LL IP アドレスの取得

デフォルトでは、DHCP を使って IP を取得するとき、dhcpcd パッケージを使用します。DHCP で IP アドレスが取得できなかったときに IPv4LL アドレスを取得するようにすることができます。デフォルトではこのオプションは無効になっています。有効にするには noipv4ll をコメントアウトしてください:

/etc/dhcpcd.conf
...
#noipv4ll
...

もしくは avahi-autoipd を実行してください:

# avahi-autoipd -D

サービスの追加

Avahi は /etc/avahi/services*.service ファイルが存在するサービスを喧伝します。*.service ファイルが存在しないサービスを使いたい場合、簡単にサービスを作成することができます。

例として、RFC865 に基づく今日の格言 (QOTD) を表示するサービスを TCP の17番ポートで稼働させるとしましょう。

まず最初に <type> を決定する必要があります。man avahi.service によればタイプは DNS-SD サービスタイプのどれかにする必要があります (例: _http._tcp)。DNS-SD のレジスタは2010年に IANA レジスタに統合 されたため、サービス名は IANA レジスタ/etc/services ファイルで確認することができます。サービス名は qotd となっています。QOTD は tcp で動作するため、サービスは _qotd._tcp でありポート番号は 17 となります (IANA と RFC865 に準拠)。

したがってサービスファイルは以下のようになります:

qotd.service
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">

<service-group>

  <name replace-wildcards="yes">%h</name>

  <service>
    <type>_qotd._tcp</type>
    <port>17</port>
  </service>

</service-group>

別のサーバーでサービスを動作させる場合や、DNS のサブタイプが異なる場合など、複雑なサービスについては man avahi.service を読んでください。

SSH

Avahi には SSH サーバーを喧伝するサンプルサービスファイルが付属しています。有効化するには:

# cp /usr/share/doc/avahi/ssh.service /etc/avahi/services/

ファイル共有

NFS

NFS 共有を設定している場合は、Avahi を使って Zeroconf が有効になっているブラウザ (KDE の Konqueror や macOS の Finder など) で共有を自動マウントすることができます。/etc/avahi/services に以下の内容で .service ファイルを作成してください:

/etc/avahi/services/nfs_Zephyrus_Music.service
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
  <name replace-wildcards="yes">NFS Music Share on %h</name>
  <service>
    <type>_nfs._tcp</type>
    <port>2049</port>
    <txt-record>path=/data/shared/Music</txt-record>
  </service>
</service-group>

/etc/exports にオプションとして insecure を使っている場合ポートはこのままでいいですが、そうでない場合は変更する必要があります (macOS クライアントには insecure が必要です)。パスは export しているパスか、そのサブディレクトリになります。なんらかの理由で Leopard から自動マウント機能は削除されていますが、スクリプトを使うことができます。このスクリプトはこの投稿 に基づいています。

Samba

サーバーとクライアントの両方で Avahi デーモンを動作させることで、クライアント側のファイルマネージャで自動的にサーバーが認識されます。

Vsftpd

vsftpd などの通常の FTP サーバーを自動探知することもできます。vsftpd パッケージをインストールして vsftpd の設定を自由に変更してください (ubuntuforums.org のスレッドman vsftpd.conf を参照)。

そして以下の内容で /etc/avahi/services.service ファイルを作成:

/etc/avahi/services/ftp.service
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
  <name>FTP file sharing</name>
  <service>
    <type>_ftp._tcp</type>
    <port>21</port>
  </service>
</service-group>

これで FTP サーバーが Avahi によって喧伝されるようになります。ネットワーク上の他のコンピュータからファイルマネージャを使って FTP サーバーに接続できるはずです。クライアント側でホスト名の解決を有効にする必要があるかもしれません。

携帯デバイスからの Airprint

Avahi と CUPS を組み合わせることで airprint に対応している携帯デバイスからプリンターに印刷をすることができます。印刷機能を有効にするには、/etc/avahi/services/ にプリンターの Avahi サービスファイルを作成してください。HP-Laserjet プリンターの場合、サービスファイルは以下のようになります。name, rp, ty, adminurl, note フィールドは適切な値に置き換えてください。

/etc/avahi/services/airprint.service
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
  <name>yourPrnterName</name>
  <service>
    <type>_ipp._tcp</type>
    <subtype>_universal._sub._ipp._tcp</subtype>
    <port>631</port>
    <txt-record>txtver=1</txt-record>
    <txt-record>qtotal=1</txt-record>
    <txt-record>rp=printers/yourPrnterName</txt-record>
    <txt-record>ty=yourPrnterName</txt-record>
    <txt-record>adminurl=http://198.168.7.15:631/printers/yourPrnterName</txt-record>
    <txt-record>note=Office Laserjet 4100n</txt-record>
    <txt-record>priority=0</txt-record>
    <txt-record>product=(GPL Ghostscript)</txt-record>
    <txt-record>printer-state=3</txt-record>
    <txt-record>printer-type=0x801046</txt-record>
    <txt-record>Transparent=T</txt-record>
    <txt-record>Binary=T</txt-record>
    <txt-record>Fax=F</txt-record>
    <txt-record>Color=T</txt-record>
    <txt-record>Duplex=T</txt-record>
    <txt-record>Staple=F</txt-record>
    <txt-record>Copies=T</txt-record>
    <txt-record>Collate=F</txt-record>
    <txt-record>Punch=F</txt-record>
    <txt-record>Bind=F</txt-record>
    <txt-record>Sort=F</txt-record>
    <txt-record>Scan=F</txt-record>
    <txt-record>pdl=application/octet-stream,application/pdf,application/postscript,image/jpeg,image/png,image/urf</txt-record>
    <txt-record>URF=W8,SRGB24,CP1,RS600</txt-record>
  </service>
</service-group>

もしくは https://raw.github.com/tjfontaine/airprint-generate/master/airprint-generate.py を使って Avahi サービスファイルを生成することもできます。スクリプトは python2python2-pycups に依存しており、以下のコマンドで使用することができます:

# python2 airprint-generate.py -d /etc/avahi/services
ノート: http://localhost:631/printers でプリンターが "Not Shared" になっている場合、上記の python スクリプトは /etc/avahi/services に何もファイルを出力しません。その場合、CUPS のドロップダウンメニューから "Modify Printer" を選択して共有を有効にしてください。共有ができない場合、CUPS/プリンター共有を参照してください。

サービスタイプデータベースの編集

上に記述したとおり、Avahi にはサービスを確認することができるツールが付属しています。avahi-browseavahi-discover はどちらもデータベースファイルを使用してサービスの説明を表示します。データベースにはほとんどのサービスの名前が含まれています (全てではありません)。

残念ながら、作成したばかりの QOTD サービスはデータベースに含まれていないため avahi-browse -a は以下のようなエントリを表示します:

+ wlp2s0 IPv4 MyServer                                        _qotd._tcp local

ソースの取得

まずは avahi の github ミラー にある service-type-database サブディレクトリから build-db.inservice-types ファイルをダウンロードしてビルドディレクトリに配置してください:

$ wget https://raw.githubusercontent.com/lathiat/avahi/master/service-type-database/build-db.in
$ wget https://raw.githubusercontent.com/lathiat/avahi/master/service-type-database/service-types

ソースの修正

次に、以下のスクリプトを作成してください:

#!/bin/bash
sed -e 's,@PYTHON\@,/usr/bin/python2.7,g' \
    -e 's,@DBM\@,gdbm,g' < build-db.in > build-db
chmod +x build-db

上記のスクリプトは build-db という名前のファイルを作成します:

$./whatever_you_named_the_script.sh
$ ls
build-db build-db.in service-types whatever_you_named_the_script.sh

そして、service-types ファイルに新しい QOTD サービスを追加してください。ファイルは1行毎に1エントリとなっており、type:Human Readable Description という形式でエントリを記入します。説明には空白を入れることができます。

例えば、ファイルの末尾に以下のエントリを追加します:

_qotd._tcp:Quote of the Day (QOTD) Server

新しいデータベースのビルドとインストール

build-db python スクリプトを実行してください (python3 ではなく python2 を使用します)。service-types.db ファイルがビルドされます。ビルドされたら gdbmtools を使って新しいデータベースがロードできること、新しいエントリが含まれていることを確認してください:

$ /usr/bin/python2.7 build-db
$ ls
build-db build-db.in service-types service-types.db whatever_you_named_the_script.sh
$ gdbmtool service-types.db

Welcome to the gdbm tool.  Type ? for help.

gdbmtool>fetch _qotd._tcp
Quote of the Day (QOTD) Server
gdbmtool>quit

古いデータベースをバックアップしてから、新しいデータベースを移動して avahi-browse で新しいエントリが認識されるようになったことを確認:

$ cp /usr/lib/avahi/service-types.db /backup-directory
# cp /build-directory/service-types.db /usr/lib/avahi/service-types.db
$ avahi-browse -b | grep QOTD
Quote of the Day (QOTD) Server

avahi-browse のエントリは以下のようになります:

+ wlp2s0 IPv4 MyServer                                        Quote of the Day (QOTD) Server local

参照