我需要提取 DHCPV6 租约信息,从 systemd-networkd 的代码来看,DHCPV6 租约似乎未存储在磁盘上,而是使用 org.freedesktop.network1.Manager 节点通过 DBUS 导出。但是,即使 DHCPv6 客户端正在运行,我也未在 busctl 输出中找到此节点。
如何在 Debian 主机上获取 DHCPv6 租约信息?我在配置中遗漏了什么吗?
答案1
这不是您在 busctl 中看到的节点 - 它是对象支持的接口(API - 函数调用和属性的特定集合)的名称。
您看到的busctl
只是您能够通过总线访问的服务列表(有点像主机名列表)。与给定服务的所有通信都通过其拥有的“服务名称”进行,但该服务通常会公开多个“对象”(类似于 HTTP 中的 URL)。
请注意,您还希望系统总线busctl --system
– 而不是默认显示的每个用户“会话”总线。这样做busctl --system --acquired
应该会显示 systemd-networkd 可访问的服务名称,这只是“org.freedesktop.network1”。然后您可以要求它提供它正在使用的对象列表busctl tree [...]
(即busctl --system tree org.freedesktop.network1
)。
一旦找到了所需的对象,busctl --system introspect <service> <object>
就会请求该对象支持的所有接口(及其方法和属性)的列表;您将在那里看到“.Manager”接口(即在“主”/org/freedesktop/network1 对象上)。
DHCP 状态是每个链接的;您在“主”对象上找到的所有内容实际上只是与整个网络管理器服务相关的方法,例如“GetLinkByName”函数,它将为您提供代表特定接口的对象的路径(比 grepping“tree”或“introspect”输出更可靠)。
$ busctl --system call org.freedesktop.network1 \
/org/freedesktop/network1 \
org.freedesktop.network1.Manager GetLinkByName s eno1
io 2 "/org/freedesktop/network1/link/_32"
(result is an integer (link index) + object path)
$ busctl --system introspect org.freedesktop.network1 \
/org/freedesktop/network1/link/_32
我没有看到任何与 DHCP 相关的属性或方法;我根本不记得 systemd-networkd 曾经有过任何属性或方法。你可能从 Describe() 方法中获取一些有用的信息:
$ busctl --system --json=pretty call org.freedesktop.network1 \
/org/freedesktop/network1/link/_32 \
org.freedesktop.network1.Link Describe \
| jq -r .data[0] \
| jq
(result is a string that contains JSON)
据我所知,您实际上需要忽略上述所有内容并直接转到 处的内部状态文件/run/systemd/netif
,其中 networkd 存储要在服务重新启动时保留的租约信息。(文件按接口索引命名,该索引显示ip link
为每个接口名称前的数字。请注意,这leases/
是 DHCPv4 租约目录,但我认为 DHCPv6 租约以相同的方式存储。)