「Avahi」の版間の差分
(→インストール: 英語版に同期) |
(→ホスト名の解決: リンクを修正) |
||
(2人の利用者による、間の6版が非表示) | |||
10行目: | 10行目: | ||
Avahi のデーモンは [[systemd#ユニットを使う|systemd]] で {{ic|avahi-daemon.service}} を使うことで管理できます。 |
Avahi のデーモンは [[systemd#ユニットを使う|systemd]] で {{ic|avahi-daemon.service}} を使うことで管理できます。 |
||
− | {{Note|[[systemd-resolved]] |
+ | {{Note|[[systemd-resolved]] には内蔵のmDNSサービスがあります。Avahi を使う前に、systemd-resolved のマルチキャストDNSリゾルバ/レスポンダ({{man|5|resolved.conf}} を参照)を無効にしていること、あるいは {{ic|systemd-resolved.service}} を完全に[[Systemd#ユニットを使う|無効に]]していることを確認してください。}} |
== Avahi を使う == |
== Avahi を使う == |
||
20行目: | 20行目: | ||
hosts: ... '''mdns_minimal [NOTFOUND=return]''' resolve [!UNAVAIL=return] dns ... |
hosts: ... '''mdns_minimal [NOTFOUND=return]''' resolve [!UNAVAIL=return] dns ... |
||
+ | {{Note| |
||
− | {{Note|{{ic|.local}} ホストの解決に時間がかかる場合、{{ic|mdns_minimal}} の代わりに {{ic|mdns4_minimal}} を使ってみてください。}} |
||
+ | * {{ic|.local}} ホストの解決に時間がかかる場合、{{ic|mdns_minimal}} の代わりに {{ic|mdns4_minimal}} を使ってみてください。 |
||
+ | * ユニキャスト 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]] は、mDNS サポートが無効になっている場合でも、これらのクエリに応答します。[[Avahi#systemd-resolved のせいで nss-mdns が機能しない|systemd-resolved は、nss-mdns が機能しないようにします]] |
||
+ | }} |
||
==== カスタム TLD を使用する場合の mDNS の設定 ==== |
==== カスタム TLD を使用する場合の mDNS の設定 ==== |
||
237行目: | 241行目: | ||
+ wlp2s0 IPv4 MyServer Quote of the Day (QOTD) Server local |
+ wlp2s0 IPv4 MyServer Quote of the Day (QOTD) Server local |
||
+ | |||
+ | == トラブルシューティング == |
||
+ | |||
+ | === 増分番号を追加するとホスト名が変わります === |
||
+ | |||
+ | これは、ホスト名の競合状態が原因で発生する [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 はルックアップを実行できなくなります。 |
||
+ | |||
+ | === systemd-resolved のせいで nss-mdns が機能しない === |
||
+ | |||
+ | ''nss-mdns'' は、{{ic|/etc/resolv.conf}} にリストされている DNS サーバーが ''ローカル'' ドメインの SOA クエリに NXDOMAIN を返す場合にのみ機能します。[https://github.com/lathiat/nss-mdns/blob/master/README.md#activation] [[systemd-resolved]] が {{man| 5|resolved.conf}} で {{ic|1=MultimediaDNS=no}} で構成されている場合でもこれらのクエリに対して NXDOMAIN は返されません。[https://github.com/systemd/systemd/issues/21659 systemdissue21659] を参照してください。 |
||
+ | |||
+ | 解決策は、{{ic|mdns_minimal}} の代わりに完全な {{ic|mdns}} NSS モジュールを使用し、{{ic |/etc/mdns.allow}} を作成して ''ローカル'' ドメインのみを許可することです。例えば: |
||
+ | |||
+ | {{hc|/etc/nsswitch.conf|2= |
||
+ | hosts: mymachines '''mdns [NOTFOUND=return]''' resolve [!UNAVAIL=return] files myhostname dns |
||
+ | }} |
||
+ | |||
+ | {{hc|/etc/mdns.allow| |
||
+ | .local. |
||
+ | .local |
||
+ | }} |
||
+ | |||
+ | {{Note|1=上記のソリューションは、{{Pkg|mtr}} や {{Pkg|traceroute}} などのネットワークユーティリティでの逆引き参照を中断します。これらのアプリケーションは、他のDNSサービスにフォールバックする代わりに、Avahi を介して逆引き参照を実行し、タイムアウトを試みます。これは[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=433943Debianissue 433943] に似ているようですが、残念ながら、{{ic|mdns}} の代わりに {{ic|mdns_minimal}} を使うことが推奨されています。}} |
||
==参照== |
==参照== |
2022年5月14日 (土) 16:56時点における最新版
- "Avahi は、Zeroconf (ゼロ・コンフィギュレーション・ネットワーキング) のフリーソフトウェア実装であり、マルチキャスト DNS/DNS-SD サービスディレクトリのためのシステムを含む。Avahi は、特定の構成情報のないローカルネットワーク上のサービスホストの発行と発見を可能とする。例えば、ネットワークに接続したとき、即座にプリンタを検出し、ファイルを探し出し、他者と会話できるようにする。GNU Lesser General Public License (LGPL) の条件でライセンス提供される。"
インストール
Avahi のデーモンは systemd で avahi-daemon.service
を使うことで管理できます。
Avahi を使う
ホスト名の解決
Avahi には hostname.local
という名前を使ってローカルでホスト名を解決する機能があります。有効にするには nss-mdns パッケージをインストールして avahi-daemon.service
を起動してください。
その後、/etc/nsswitch.conf
ファイルを編集して、resolve
と dns
の前に mdns_minimal [NOTFOUND=return]
が含まれるように hosts
行を変更してください:
hosts: ... mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns ...
カスタム TLD を使用する場合の mDNS の設定
mdns_minimal
モジュールが .local
TLD の取り合わせを処理します。[NOTFOUND=return]
と設定しているのは、mdns_minimal
が *.local
を見つけられなかったときに、dns
や myhostname
などで検索しないようにするためです。
Avahi で他の TLD もサポートしたい場合、以下の設定を行ってください:
mdns_minimal [NOTFOUND=return]
をmdns
に置き換えてください。IPv4 や IPv6 しか使わないモジュールmdns[46](_minimal)
も存在します。/etc/avahi/avahi-daemon.conf
のdomain-name
をカスタマイズしてください。/etc/mdns.allow
で Avahi のカスタム TLD をホワイトリストに入れてください。
ツール
Avahi にはネットワーク上で動作しているサービスを探知するのに役立つユーティリティが複数含まれています。例えば、以下のコマンドを実行するとネットワーク上のサービスが表示されます:
$ avahi-browse -alr
Avahi Zeroconf Browser (avahi-discover
) はネットワーク上の様々なサービスを表示します。使用するには Avahi の任意依存パッケージである gtk3, python-dbus, python-gobject のインストールが必要です。また、bssh
と bvnc
を使うことで 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 サービスファイルを生成することもできます。スクリプトは python2 と python2-pycupsAUR に依存しており、以下のコマンドで使用することができます:
# python2 airprint-generate.py -d /etc/avahi/services
サービスタイプデータベースの編集
上に記述したとおり、Avahi にはサービスを確認することができるツールが付属しています。avahi-browse
と avahi-discover
はどちらもデータベースファイルを使用してサービスの説明を表示します。データベースにはほとんどのサービスの名前が含まれています (全てではありません)。
残念ながら、作成したばかりの QOTD サービスはデータベースに含まれていないため avahi-browse -a
は以下のようなエントリを表示します:
+ wlp2s0 IPv4 MyServer _qotd._tcp local
ソースの取得
まずは avahi の github ミラー にある service-type-database
サブディレクトリから build-db.in
と 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
上記のスクリプトは 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
トラブルシューティング
増分番号を追加するとホスト名が変わります
これは、ホスト名の競合状態が原因で発生する 既知のバグ です。考えられる回避策の1つは、競合状態を防ぐために IPv6 を無効にする ことです。複数のインターフェースが存在する場合 [1] を使用して、Avahi を単一のインターフェースに制限します。もう1つの考えられる回避策は、キャッシュを無効にする ことで、Avahi がホスト名の競合を完全にチェックしないようにしますが、これにより Avahi はルックアップを実行できなくなります。
systemd-resolved のせいで nss-mdns が機能しない
nss-mdns は、/etc/resolv.conf
にリストされている DNS サーバーが ローカル ドメインの SOA クエリに NXDOMAIN を返す場合にのみ機能します。[2] systemd-resolved が 5 resolved.conf( 5) で MultimediaDNS=no
で構成されている場合でもこれらのクエリに対して NXDOMAIN は返されません。systemdissue21659 を参照してください。
解決策は、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
参照
- Avahi - プロジェクトの公式ウェブサイト
- wikipedia:ja:Avahi
- iTunes (includes Bonjour) - Windows で Zeroconf を有効化
- http://www.zeroconf.org/