systemd.dnssd 中文手册

译者:金步国


版权声明

本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。

其他作品

本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:

联系方式

由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。


手册索引 · 指令索引systemd-241

名称

systemd.dnssd — DNS服务发现配置

大纲

network_service.dnssd

描述

DNS服务发现(DNS Service Discovery)功能由 systemd-resolved.service(8) 实现。

注意,网络服务的Dnssd文件必须以 .dnssd 作为后缀名, 否则将被忽略。

Dnssd文件分别位于: 系统网络目录(/usr/lib/systemd/dnssd)、 运行时网络目录(/run/systemd/dnssd)、 本机网络目录(/etc/systemd/dnssd)。 所有的Dnssd文件(无论位于哪个目录中),统一按照文件名的字典顺序处理。对于不同目录下的同名Dnssd文件,仅以优先级最高的目录中的那一个为准。 具体说来就是:/etc/ 的优先级最高、/run/ 的优先级居中、/usr/lib/ 的优先级最低。 如果系统管理员想要屏蔽 /usr/lib/ 目录中的某个Dnssd文件, 那么最佳做法是在 /etc/ 目录中创建一个指向 /dev/null 的同名符号链接, 即可彻底屏蔽 /usr/lib/ 目录中的同名文件。

对于例如 foo.dnssd 这样的Dnssd文件,可以同时存在对应的 foo.dnssd.d/ 目录,当解析完Dnssd文件之后,目录中所有以 ".conf" 结尾的文件,都会被按照文件名的字典顺序,依次解析(相当于依次附加到Dnssd文件的末尾)。 这样就可以方便的修改Dnssd文件,或者为Dnssd文件添加额外的设置,而无需修改Dnssd文件本身。 注意,所有配置片段(".conf" 文件)必须包含明确的小节头(例如 "[Service]" 之类)。

".d" 目录除了可以放置在 /etc/systemd/dnssd 目录中, 还可以放置在 /usr/lib/systemd/dnssd/run/systemd/dnssd 目录中。 所有 ".d/" 目录中的配置片段都会覆盖Dnssd文件的设置(无论Dnssd文件位于哪个目录)。 虽然在优先级上,/etc 中的配置片段优先级最高、 /run 中的配置片段优先级居中、/usr/lib 中的配置片段优先级最低。 但是由于 /run 是临时目录,而 /usr/lib 仅供软件包使用, 所以在实践中,".d/" 目录仅会放置在 /etc/systemd/dnssd 目录中。

[Service] 小节选项

Dnssd文件中只包含一个 "[Service]" 小节, 用于定义一个可发现网络服务, 可通过组播DNS(Multicast DNS)在局域网内宣告。

Name=

网络服务的实例名称。必须符合 RFC 6763 4.1.1小节的规范(例如"webserver")。

此选项支持的替换符:

表 1. 替换符

替换符含义
"%m"当前系统的"machine ID"字符串。详见 machine-id(5) 手册。
"%b"当前系统的"boot ID"字符串。详见 random(4) 手册。
"%H"当前系统的主机名
"%v"内核版本(uname -r 的输出)

Type=

网络服务的类型。必须符合 RFC 6763 4.1.2小节的规范(例如"_http._tcp")。

Port=

网络服务的监听端口。

Priority=

网络服务的优先级。也就是一个在 SRV 记录中表示优先级的数字。

Weight=

网络服务的权重。也就是一个在 SRV 记录中表示权重的数字。

TxtText=

一个空格分隔的"键=值"列表, 用于在 TXT 记录中提供额外的附加信息(例如 "path=/portal/index.html")。 "键"与"值"中都可以包含C风格的转义字符。

此选项与 TxtData= 都可以多次使用, 从而为该服务创建多个 TXT 记录。 设为空字符串表示撤销此选项之前的全部已设列表。

TxtData=

一个空格分隔的"键=值"列表 用于在 TXT 记录中提供额外的附加信息。 注意,其中的"值"必须是经过base64编码之后得到的字符串(例如 "data=YW55IGJpbmFyeSBkYXRhCg==")。 "键"与"值"中都可以包含C风格的转义字符。

此选项与 TxtText= 都可以多次使用, 从而为该服务创建多个 TXT 记录。 设为空字符串表示撤销此选项之前的全部已设列表。

例子

例 1. HTTP 服务

# /etc/systemd/dnssd/http.dnssd
[Service]
Name=%H
Type=_http._tcp
Port=80
TxtText=path=/stats/index.html t=temperature_sensor

这将在本机的网络接口上开启DNS组播(MulticastDNS), 并且使得本机上的HTTP服务在局域网内成为可发现服务。

现在, "resolvectl" 应该能够将此HTTP服务解析到对应的本机主机名:

$ resolvectl service meteo._http._tcp.local
meteo._http._tcp.local: meteo.local:80 [priority=0, weight=0]
                        169.254.208.106%senp0s21f0u2u4
                        fe80::213:3bff:fe49:8aa%senp0s21f0u2u4
                        path=/stats/index.html
                        t=temperature_sensor
                        (meteo/_http._tcp/local)

-- Information acquired via protocol mDNS/IPv6 in 4.0ms.
-- Data is authenticated: yes

局域网内另一台主机上运行的 "avahi" 服务应该也能够看到此HTTP服务:

$ avahi-browse -a -r
+ enp3s0 IPv6 meteo                                         Web Site             local
+ enp3s0 IPv4 meteo                                         Web Site             local
= enp3s0 IPv6 meteo                                         Web Site             local
   hostname = [meteo.local]
   address = [fe80::213:3bff:fe49:8aa]
   port = [80]
   txt = ["path=/stats/index.html" "t=temperature_sensor"]
= enp3s0 IPv4 meteo                                         Web Site             local
   hostname = [meteo.local]
   address = [169.254.208.106]
   port = [80]
   txt = ["path=/stats/index.html" "t=temperature_sensor"]

参见

systemd(1), systemd-resolved.service(8), resolvectl(1)