LAN 内や仮想マシンとの間で mDNS での名前解決ができると便利なので、 systemd-networkd で netplan 管理のネットワークや libvirt 管理の virbr0 などでも mDNS を有効にするようにした方法のメモです。

動作確認環境

  • Ubuntu 22.04.4 LTS (jammy)
  • Debian GNU/Linux 12 (bookworm)

以下の実行例では Ubuntu の方のプロンプトを % で Debian の方のプロンプトを $ にしています。

resolvectl mdns

mdns が有効になっているかどうかは resolvectl mdns で確認できます。

Global で yes になっている状態で、さらに mDNS を使いたい LAN につながっている interface で yes にすると使えます。

resolve なら名前解決だけ有効にします。

以下の例だと eth0virbr0 だけ mDNS が有効になっています。

% resolvectl mdns
Global: yes
Link 2 (eth0): yes
Link 3 (wlan0): no
$ resolvectl mdns
Global: yes
Link 2 (ens5): no
Link 3 (virbr0): yes

Global

/etc/systemd/resolved.confMulticastDNS=yes になっていれば有効です。

Debian 12 ではデフォルトで有効になっていたので、新しい環境だとデフォルトで有効になっているかもしれません。

% systemd-analyze cat-config systemd/resolved.conf | grep MulticastDNS
#MulticastDNS=no
MulticastDNS=yes
$ systemd-analyze cat-config systemd/resolved.conf | grep MulticastDNS
#MulticastDNS=yes

sudoedit /etc/systemd/resolved.conf などで編集した後、 sudo systemctl restart systemd-resolved.service で反映します。

sudo systemctl daemon-reload は不要です。 sudo systemctl reload systemd-resolved.serviceFailed to reload systemd-resolved.service: Job type reload is not applicable for unit systemd-resolved.service. と言われて使えませんでした。

netplan

/run/systemd/network/ で network ファイルのファイル名を調べて、 /etc/systemd/network/調べたファイル名.network.d/mdns.conf のような drop-in ファイルを作って設定します。

% ls /run/systemd/network/
10-netplan-eth0.link  10-netplan-eth0.network
% cat /etc/systemd/network/10-netplan-eth0.network.d/mdns.conf
[Network]
MulticastDNS=yes

MulticastDNS=true でも同じで、 MulticastDNS=resolve のように この interface は名前解決だけ、という指定もできます。

sudo mkdir /etc/systemd/network/10-netplan-eth0.network.d して sudoedit /etc/systemd/network/10-netplan-eth0.network.d/mdns.conf などで編集した後、 sudo systemctl reload systemd-networkd.service で反映します。 sudo systemctl daemon-reload は不要です。

systemd-analyze cat-config systemd/network/10-netplan-eth0.network でちゃんとねらった interface に設定が入っているか確認しておくと良いかもしれません。

virbr0

libvirtvirbr0systemd-networkd 管理ではないため、 network ファイルの drop-in で設定できず、 libvirt の XML のネットワーク設定でも、 試したバージョンでは mDNS の設定はできませんでした。

何か方法がないか色々と調べてみたところ、 https://www.libvirt.org/hooks.html#etc-libvirt-hooks-network/etc/libvirt/hooks/network を用意すればできそうとわかったので、 以下のような /etc/libvirt/hooks/network を用意して、 sudo virsh net-start default でスタートすると有効にできました。

#!/bin/sh
if [ "default started" = "$1 $2" ]; then
    resolvectl mdns virbr0 yes
fi

最初は [ "default started" = "$1 $2" ] && resolvectl mdns virbr0 yes と書いていたら、 /etc/libvirt/hooks/network default start begin - の段階で hook が失敗して、 net-start 自体も失敗して virbr0 ができなかったので、 動作確認はしっかりしておいた方が良さそうです。

まとめ

mDNS を有効にすることで DHCP で IP アドレスが変わっても raspi.localubuntu-vm.local のような名前でアクセスできるようになって便利になりました。

一時的に有効にするだけなら、毎回 resolvectl mdns virbr0 yes のようなコマンドを実行しても良いのですが、 ちゃんと設定することで再起動後でも自動で有効にできるようになりました。

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published