「Avahi」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎ホスト名の解決: 英語版に同期)
 
(同じ利用者による、間の8版が非表示)
2行目: 2行目:
 
[[en:Avahi]]
 
[[en:Avahi]]
 
[[fr:Avahi]]
 
[[fr:Avahi]]
  +
[[ru:Avahi]]
 
[[Wikipedia:ja:Avahi]] より:
 
[[Wikipedia:ja:Avahi]] より:
 
:''"[http://avahi.org/ Avahi] は、[[Wikipedia:ja:Zeroconf|Zeroconf]] (ゼロ・コンフィギュレーション・ネットワーキング) のフリーソフトウェア実装であり、マルチキャスト DNS/DNS-SD サービスディレクトリのためのシステムを含む。Avahi は、特定の構成情報のないローカルネットワーク上のサービスホストの発行と発見を可能とする。例えば、ネットワークに接続したとき、即座にプリンタを検出し、ファイルを探し出し、他者と会話できるようにする。GNU Lesser General Public License (LGPL) の条件でライセンス提供される。"''
 
:''"[http://avahi.org/ Avahi] は、[[Wikipedia:ja:Zeroconf|Zeroconf]] (ゼロ・コンフィギュレーション・ネットワーキング) のフリーソフトウェア実装であり、マルチキャスト DNS/DNS-SD サービスディレクトリのためのシステムを含む。Avahi は、特定の構成情報のないローカルネットワーク上のサービスホストの発行と発見を可能とする。例えば、ネットワークに接続したとき、即座にプリンタを検出し、ファイルを探し出し、他者と会話できるようにする。GNU Lesser General Public License (LGPL) の条件でライセンス提供される。"''
   
 
== インストール ==
 
== インストール ==
{{Pkg|avahi}} パッケージを[[pacman|インストール]]してください。
 
   
Avahi のデモンは [[systemd#ユニッを使う|systemd]] {{ic|avahi-daemon.service}} を使うことで管理できます。
+
{{pkg|avahi}} パッケジを [[インスール]] し、{{ic|avahi-daemon.service}} を [[有効化]] るか、[[ソケットアクティベーション]] を使用してください
   
{{Note|[[systemd-resolved]] には内蔵のmDNSサービスがあります。Avahi を使う前に、systemd-resolved のマルチキャストDNSリゾルバ/レスポンダ({{man|5|resolved.conf}} を参照)を無効にしていこと、あるいは {{ic|systemd-resolved.service}} を完全に[[Systemd#ユニットを使う|無効]]していることを確認してください。}}
+
{{Note|[[systemd-resolved]] には内蔵の mDNS サービスがあります。Avahi を使う前に、systemd-resolved のマルチキャスト DNS リゾルバ/レスポンダ ({{man|5|resolved.conf}} を参照) を無効化す、あるいは {{ic|systemd-resolved.service}} を完全に [[Systemd#ユニットを使う|無効]] してください。}}
   
 
== Avahi を使う ==
 
== Avahi を使う ==
   
 
=== ホスト名の解決 ===
 
=== ホスト名の解決 ===
  +
 
Avahi には {{ic|''hostname''.local}} という名前を使ってローカルでホスト名を解決する機能があります。有効にするには {{Pkg|nss-mdns}} パッケージをインストールして {{ic|avahi-daemon.service}} を[[起動]]してください。
 
Avahi には {{ic|''hostname''.local}} という名前を使ってローカルでホスト名を解決する機能があります。有効にするには {{Pkg|nss-mdns}} パッケージをインストールして {{ic|avahi-daemon.service}} を[[起動]]してください。
   
 
その後、{{ic|/etc/nsswitch.conf}} ファイルを編集して、{{ic|resolve}} と {{ic|dns}} の前に {{ic|1=mdns_minimal [NOTFOUND=return]}} が含まれるように {{ic|hosts}} 行を変更してください:
 
その後、{{ic|/etc/nsswitch.conf}} ファイルを編集して、{{ic|resolve}} と {{ic|dns}} の前に {{ic|1=mdns_minimal [NOTFOUND=return]}} が含まれるように {{ic|hosts}} 行を変更してください:
  +
hosts: ... '''mdns_minimal [NOTFOUND=return]''' resolve [!UNAVAIL=return] dns ...
 
  +
hosts: mymachines '''mdns_minimal [NOTFOUND=return]''' resolve [!UNAVAIL=return] files myhostname dns
   
 
{{Note|
 
{{Note|
 
* {{ic|.local}} ホストの解決に時間がかかる場合、{{ic|mdns_minimal}} の代わりに {{ic|mdns4_minimal}} を使ってみてください。
 
* {{ic|.local}} ホストの解決に時間がかかる場合、{{ic|mdns_minimal}} の代わりに {{ic|mdns4_minimal}} を使ってみてください。
* The line above makes {{ic|nss-mdns}} authoritative for the {{ic|.local}} domain, unless your unicast DNS server responds to {{ic|SOA}} queries for the top level {{ic|local}} name, or if the request has more than two labels. See {{ic|nss-mdns}} [https://github.com/lathiat/nss-mdns/blob/master/README.md#activation activation notes].
+
* ユニキャスト DNS サーバがトップレベルの {{ic|local}} 名に対する {{ic|SOA}} クエリに応答しない限り、またはリクエストが2つ以上のラベルを持つ場合、上記の行は{{ic|nss-mdns}} {{ic|.local}} ドメインに対して権威付けるようにします。{{ic|nss-mdns}} [https://github.com/lathiat/nss-mdns/blob/master/README.md#activation activation notes] を参照してください。
** [[systemd-resolved]] responds to these queries even if its mDNS support is disabled. See [[#systemd-resolved のせいで nss-mdns が機能しない]].
+
** [[systemd-resolved]] は、mDNS サポートが無効になっている場合でも、これらのクエリに応答します。[[Avahi#systemd-resolved のせいで nss-mdns が機能しない|systemd-resolved は、nss-mdns が機能しないようにします]]
  +
** NSS 設定の詳細については、{{man|8|nss-mymachines}} と [https://github.com/lathiat/nss-mdns/blob/master/readme.md#active avahi docs] を参照して下さい。
 
}}
 
}}
   
31行目: 34行目:
   
 
Avahi で他の TLD もサポートしたい場合、以下の設定を行ってください:
 
Avahi で他の TLD もサポートしたい場合、以下の設定を行ってください:
  +
 
* {{ic|1=mdns_minimal [NOTFOUND=return]}} を {{ic|mdns}} に置き換えてください。IPv4 や IPv6 しか使わないモジュール {{ic|mdns[46](_minimal)}} も存在します。
 
* {{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/avahi/avahi-daemon.conf}} の {{ic|domain-name}} をカスタマイズしてください。
38行目: 42行目:
   
 
Avahi にはネットワーク上で動作しているサービスを探知するのに役立つユーティリティが複数含まれています。例えば、以下のコマンドを実行するとネットワーク上のサービスが表示されます:
 
Avahi にはネットワーク上で動作しているサービスを探知するのに役立つユーティリティが複数含まれています。例えば、以下のコマンドを実行するとネットワーク上のサービスが表示されます:
$ avahi-browse -alr
 
   
  +
$ avahi-browse --all --ignore-local --resolve --terminate
Avahi Zeroconf Browser ({{ic|avahi-discover}}) はネットワーク上の様々なサービスを表示します。使用するには Avahi の任意依存パッケージである {{Pkg|gtk3}}, {{Pkg|python-dbus}}, {{Pkg|python-gobject}} のインストールが必要です。また、{{ic|bssh}} と {{ic|bvnc}} を使うことで SSH サーバーや VNC サーバーを探知することができます。
 
  +
  +
このコマンドが何も出力しない場合、原因は [[ファイアウォール]] によって mDNS トラフィックがブロックされている可能性があります。
  +
  +
.local ホスト名を IP アドレスに解決するために単に mDNS クエリを実行したい場合(dig や nslookup に似た方法)、次のコマンドを使用してください:
  +
  +
$ avahi-resolve-host-name ''some-host-name''.local
  +
  +
{{ic|getent hosts}} コマンドは、DNS と MDNS ルックアップの両方を実行できることに注意してください。
  +
  +
Avahi Zeroconf Browser ({{ic|avahi-discover}}) はネットワーク上の様々なサービスを表示します。使用するには Avahi の任意依存パッケージである {{Pkg|gtk3}}, {{Pkg|python-dbus}}, {{Pkg|python-gobject}} のインストールが必要です。また、{{ic|bssh}} と {{ic|bvnc}} を使うことで SSH サーバーや VNC サーバーを閲覧することもできます。
   
 
=== ファイアウォール ===
 
=== ファイアウォール ===
181行目: 194行目:
 
{{Note|http://localhost:631/printers でプリンターが "Not Shared" になっている場合、上記の python スクリプトは {{ic|/etc/avahi/services}} に何もファイルを出力しません。その場合、CUPS のドロップダウンメニューから "Modify Printer" を選択して共有を有効にしてください。共有ができない場合、[[CUPS/プリンター共有]]を参照してください。}}
 
{{Note|http://localhost:631/printers でプリンターが "Not Shared" になっている場合、上記の python スクリプトは {{ic|/etc/avahi/services}} に何もファイルを出力しません。その場合、CUPS のドロップダウンメニューから "Modify Printer" を選択して共有を有効にしてください。共有ができない場合、[[CUPS/プリンター共有]]を参照してください。}}
   
  +
== トラブルシューティング ==
== サービスタイプデータベースの編集 ==
 
上に記述したとおり、Avahi にはサービスを確認することができるツールが付属しています。{{ic|avahi-browse}} と {{ic|avahi-discover}} はどちらもデータベースファイルを使用してサービスの説明を表示します。データベースにはほとんどのサービスの名前が含まれています (全てではありません)。
 
   
  +
=== 増分番号を追加するとホスト名が変わります ===
残念ながら、作成したばかりの QOTD サービスはデータベースに含まれていないため {{ic|avahi-browse -a}} は以下のようなエントリを表示します:
 
   
  +
これは、ホスト名の競合状態が原因で発生する [https://github.com/lathiat/avahi/issues/117 既知のバグ] です。考えられる回避策の1つは、競合状態を防ぐために [https://github.com/lathiat/avahi/issues/117#issuecomment-302849130 IPv6 を無効にする] ことです。複数のインターフェースが存在する場合 [https://github.com/lathiat/avahi/issues/117#issuecomment-401225716useallow-interfaces] を使用して、Avahi を単一のインターフェースに制限します。もう1つの考えられる回避策は、[https://github.com/lathiat/avahi/issues/117#issuecomment-442201162 キャッシュを無効にする] ことで、Avahi がホスト名の競合を完全にチェックしないようにしますが、これにより Avahi はルックアップを実行できなくなります。
+ wlp2s0 IPv4 MyServer _qotd._tcp local
 
   
  +
=== systemd-resolved のせいで nss-mdns が機能しない ===
=== ソースの取得 ===
 
   
  +
nss-mdns は、{{ic|/etc/resolv.conf}} に記載された DNS サーバーが "local" ドメインに対する SOA クエリに {{ic|NXDOMAIN}} を返す場合にのみ動作します。[https://github.com/lathiat/nss-mdns/blob/master/README.md#activation]
まずは [https://github.com/lathiat/avahi avahi の github ミラー] にある {{ic|service-type-database}} サブディレクトリから {{ic|build-db.in}} と {{ic|service-types}} ファイルをダウンロードしてビルドディレクトリに配置してください:
 
   
  +
まず、設定された DNS サーバーが "local" ドメインに対する SOA クエリに {{ic|NXDOMAIN}} を返すか確認してください。例えば、次のコマンドを実行します:
$ 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
 
   
  +
$ host -t SOA local
=== ソースの修正 ===
 
   
  +
DNS サーバーが {{ic|NXDOMAIN}} を返す場合、以下の手順を実施する必要はありません。Avahi は、[[systemd-resolved]] を使用していても、通常通りネットワーク内のリソースを見つけられるはずです。
次に、以下のスクリプトを作成してください:
 
   
  +
古いバージョンの [[systemd-resolved]] では、{{man|5|resolved.conf}} におけるグローバル設定 {{ic|1=MulticastDNS=no}} が "local" ドメインに対して Avahi と互換性のないレスポンスコードを返していました。その結果、Avahi がリソース(プリンターなど)を正しく検出できない問題が発生しました。この問題に関しては [https://github.com/systemd/systemd/issues/21659 systemd issue 21659] を参照してください。
#!/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|mdns_minimal}} の代わりに完全な {{ic|mdns}} NSS モジュールを使用し、{{ic |/etc/mdns.allow}} を作成して ''ローカル'' ドメインのみを許可することです。例えば:
上記のスクリプトは {{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}} のエントリは以下のようになります:
 
 
+ wlp2s0 IPv4 MyServer Quote of the Day (QOTD) Server local
 
 
== トラブルシューティング ==
 
 
=== Hostname changes with appending incrementing numbers ===
 
 
This is a [https://github.com/lathiat/avahi/issues/117 known bug] that is caused by a hostname race condition. One possible workaround is [https://github.com/lathiat/avahi/issues/117#issuecomment-302849130 disabling IPv6] to attempt to prevent the race condition. If multiple interfaces are present [https://github.com/lathiat/avahi/issues/117#issuecomment-401225716 use allow-interfaces] to limit Avahi to a single interface. Another possible workaround is to [https://github.com/lathiat/avahi/issues/117#issuecomment-442201162 disable the cache] to prevent Avahi from checking for host name conflicts altogether, but this prevents Avahi from performing lookups.
 
 
=== systemd-resolved のせいで nss-mdns が機能しない ===
 
 
''nss-mdns'' only works if the DNS server listed in {{ic|/etc/resolv.conf}} returns NXDOMAIN to SOA queries for the "local" domain.[https://github.com/lathiat/nss-mdns/blob/master/README.md#activation] Even if [[systemd-resolved]] is configured with {{ic|1=MulticastDNS=no}} in {{man|5|resolved.conf}}, it will not return NXDOMAIN for these queries. See [https://github.com/systemd/systemd/issues/21659 systemd issue 21659].
 
 
A solution is to use the full {{ic|mdns}} NSS module instead of {{ic|mdns_minimal}} and create {{ic|/etc/mdns.allow}} to allow only the "local" domain. For example:
 
   
 
{{hc|/etc/nsswitch.conf|2=
 
{{hc|/etc/nsswitch.conf|2=
263行目: 223行目:
 
}}
 
}}
   
  +
{{Note|1=上記のソリューションは、{{Pkg|mtr}} や {{Pkg|traceroute}} などのネットワークユーティリティでの逆引き参照を中断します。これらのアプリケーションは、他のDNSサービスにフォールバックする代わりに、Avahi を介して逆引き参照を実行し、タイムアウトを試みます。これは[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=433943Debianissue 433943] に似ているようですが、残念ながら、{{ic|mdns}} の代わりに {{ic|mdns_minimal}} を使うことが推奨されています。}}
{{Note|1=The above solution will break reverse lookups in networking utilities such as {{Pkg|mtr}} and {{Pkg|traceroute}}. These applications will attempt to do a reverse lookup via Avahi and time out instead of falling back to other DNS services. This seems similar to [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=433943 Debian issue 433943] where the recommendation is, unfortunately, to use {{ic|mdns_minimal}} instead of {{ic|mdns}}.}}
 
  +
  +
=== Avahi ソケットでの ECONNREFUSED(接続拒否) ===
  +
  +
Avahi が正常に起動・動作しているにもかかわらず、nss が mdns にリクエストを転送しない場合、原因は {{ic|/run/avahi-daemon/socket}} ソケットが詰まっている可能性があります。この問題は strace などで確認できます。この場合、{{ic|avahi-daemon.service}} および {{ic|avahi-daemon.socket}} の両方を [[再起動]] することで問題を解決できる場合があります。
  +
  +
=== KDE Connect の内蔵 mDNS との競合 ===
  +
  +
kdeconnect を使用している場合、{{Pkg|kdeconnect}} が独自の mDNS サーバーを実行するため、avahi と mDNS の競合が発生します。この競合により、ネットワーク再起動後にホスト名が {{ic|myhostname-2}} にリネームされるなどの問題が発生することがあります。
  +
  +
これを修正するには、{{pkg|kdeconnect}} を削除するか、{{aur|kdeconnect-no-mdns}} のように、mdns サポート無しのバージョンをビルドしてください。
  +
  +
こちらも参照 [https://bugs.kde.org/show_bug.cgi?id=487719 kde bug 487719]
   
 
==参照==
 
==参照==
  +
 
* [http://avahi.org/ Avahi] - プロジェクトの公式ウェブサイト
 
* [http://avahi.org/ Avahi] - プロジェクトの公式ウェブサイト
 
* [[wikipedia:ja:Avahi]]
 
* [[wikipedia:ja:Avahi]]

2025年2月5日 (水) 05:58時点における最新版

Wikipedia:ja:Avahi より:

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

インストール

avahi パッケージを インストール し、avahi-daemon.service有効化 するか、ソケットアクティベーション を使用してください。

ノート: systemd-resolved には内蔵の mDNS サービスがあります。Avahi を使う前に、systemd-resolved のマルチキャスト DNS リゾルバ/レスポンダ (resolved.conf(5) を参照) を無効化するか、あるいは systemd-resolved.service を完全に 無効化 してください。

Avahi を使う

ホスト名の解決

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

その後、/etc/nsswitch.conf ファイルを編集して、resolvedns の前に mdns_minimal [NOTFOUND=return] が含まれるように hosts 行を変更してください:

hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns
ノート:
  • .local ホストの解決に時間がかかる場合、mdns_minimal の代わりに mdns4_minimal を使ってみてください。
  • ユニキャスト DNS サーバがトップレベルの local 名に対する SOA クエリに応答しない限り、またはリクエストが2つ以上のラベルを持つ場合、上記の行はnss-mdns.local ドメインに対して権威付けるようにします。nss-mdns activation notes を参照してください。

カスタム 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 --all --ignore-local --resolve --terminate

このコマンドが何も出力しない場合、原因は ファイアウォール によって mDNS トラフィックがブロックされている可能性があります。

.local ホスト名を IP アドレスに解決するために単に mDNS クエリを実行したい場合(dig や nslookup に似た方法)、次のコマンドを使用してください:

$ avahi-resolve-host-name some-host-name.local

getent hosts コマンドは、DNS と MDNS ルックアップの両方を実行できることに注意してください。

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

ファイアウォール

ファイアウォールを使っている場合は 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 ファイルが存在するサービスを喧伝します。ファイルは avahi ユーザー・グループから読み込めるようにする必要があります。

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

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

まず最初に <type> を決定する必要があります。avahi.service(5) によればタイプは 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 のサブタイプが異なる場合など、複雑なサービスについては avahi.service(5) を読んでください。

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 のスレッドvsftpd.conf(5) を参照)。

そして以下の内容で /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-pycupsAUR に依存しており、以下のコマンドで使用することができます:

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

トラブルシューティング

増分番号を追加するとホスト名が変わります

これは、ホスト名の競合状態が原因で発生する 既知のバグ です。考えられる回避策の1つは、競合状態を防ぐために IPv6 を無効にする ことです。複数のインターフェースが存在する場合 [1] を使用して、Avahi を単一のインターフェースに制限します。もう1つの考えられる回避策は、キャッシュを無効にする ことで、Avahi がホスト名の競合を完全にチェックしないようにしますが、これにより Avahi はルックアップを実行できなくなります。

systemd-resolved のせいで nss-mdns が機能しない

nss-mdns は、/etc/resolv.conf に記載された DNS サーバーが "local" ドメインに対する SOA クエリに NXDOMAIN を返す場合にのみ動作します。[2]

まず、設定された DNS サーバーが "local" ドメインに対する SOA クエリに NXDOMAIN を返すか確認してください。例えば、次のコマンドを実行します:

$ host -t SOA local

DNS サーバーが NXDOMAIN を返す場合、以下の手順を実施する必要はありません。Avahi は、systemd-resolved を使用していても、通常通りネットワーク内のリソースを見つけられるはずです。

古いバージョンの systemd-resolved では、resolved.conf(5) におけるグローバル設定 MulticastDNS=no が "local" ドメインに対して Avahi と互換性のないレスポンスコードを返していました。その結果、Avahi がリソース(プリンターなど)を正しく検出できない問題が発生しました。この問題に関しては systemd issue 21659 を参照してください。

解決策は、mdns_minimal の代わりに完全な mdns NSS モジュールを使用し、/etc/mdns.allow を作成して ローカル ドメインのみを許可することです。例えば:

/etc/nsswitch.conf
hosts: mymachines mdns [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns
/etc/mdns.allow
.local.
.local
ノート: 上記のソリューションは、mtrtraceroute などのネットワークユーティリティでの逆引き参照を中断します。これらのアプリケーションは、他のDNSサービスにフォールバックする代わりに、Avahi を介して逆引き参照を実行し、タイムアウトを試みます。これは433943 に似ているようですが、残念ながら、mdns の代わりに mdns_minimal を使うことが推奨されています。

Avahi ソケットでの ECONNREFUSED(接続拒否)

Avahi が正常に起動・動作しているにもかかわらず、nss が mdns にリクエストを転送しない場合、原因は /run/avahi-daemon/socket ソケットが詰まっている可能性があります。この問題は strace などで確認できます。この場合、avahi-daemon.service および avahi-daemon.socket の両方を 再起動 することで問題を解決できる場合があります。

KDE Connect の内蔵 mDNS との競合

kdeconnect を使用している場合、kdeconnect が独自の mDNS サーバーを実行するため、avahi と mDNS の競合が発生します。この競合により、ネットワーク再起動後にホスト名が myhostname-2 にリネームされるなどの問題が発生することがあります。

これを修正するには、kdeconnect を削除するか、kdeconnect-no-mdnsAUR のように、mdns サポート無しのバージョンをビルドしてください。

こちらも参照 kde bug 487719

参照