Avahi

提供: ArchWiki
2025年2月5日 (水) 05:50時点におけるKgx (トーク | 投稿記録)による版 (→‎ホスト名の解決: 同期)
ナビゲーションに移動 検索に移動

Wikipedia:ja:Avahi より:

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

インストール

avahi パッケージをインストールしてください。

Avahi のデーモンは systemdavahi-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 との競合

If you use kdeconnect, there are mDNS conflicts with avahi as kdeconnect also runs its mdns server. This can cause hostname conflicts, like renaming your host to myhostname-2 after network restarts.

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

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

こちらも参照 kde bug 487719

参照