检测 netplan 是否正在管理网络配置(shell)

Arn*_*i J 7 network-manager networking netplan 18.04

我想在 LXD 容器中的 shell 脚本中弄清楚该容器是否由 Netplan 管理。这可能有点未知,因为我混合了 16.04 系统、18.04 系统和升级的 18.04 系统。

为了将正确的网络配置写入容器,我需要检测配置是/etc/network/interfaces在 Netplan yaml 文件中还是在 Netplan yaml 文件中是静态的。

我真的可以使用类似的东西,netplan status但由于该命令不存在,我需要替代方案。

我问了很多,似乎没有正式的方法。到目前为止我的建议:

  1. cat /etc/network/interfaces并在那里查找 Netplan 信息消息。我不喜欢这种方法,因为这显然容易损坏。
  2. 有人建议我可以只查找 /etc/netplan - 但这不适用于升级的系统,因为 Netplan 已禁用但仍在安装。
  3. 另一个建议是相反的:我可以检查 ifupdown 或 systemd 是否正在管理网络。问题是,我不确定如何在实际意义上做到这一点。

Mat*_*rre 5

您可以从 ifupdown 中检查ifstate文件,它会告诉您这是否用于配置网络:

/run/network/ifstate
Run Code Online (Sandbox Code Playgroud)

如果它在那里并且包含文本,您可以预期 ifupdown 正在使用中。如果它不存在,则系统可能是通过 netplan 管理的(但这不会告诉您它是 NetworkManager 还是 systemd)

然后,如果您想知道特定接口使用什么后端,您可以询问 netplan,并解析输出以获得您需要的信息:

netplan generate --mapping enp3s0
Run Code Online (Sandbox Code Playgroud)

它输出这样的文本:

id=enp3s0, backend=NetworkManager, set_name=(null), match_name=enp3s0, match_mac=(null), match_driver=(null)
Run Code Online (Sandbox Code Playgroud)

这样,您还可以知道使用接口配置的匹配规则(您使用接口的“最终”名称来检查映射,它会告诉您与它匹配的 netplan YAML 中的匹配规则是什么)。

  • 在我的 20.04 系统上,`/run/network/ifstate` 存在并包含文本(`lo=lo`),但我相当确定 netplan 正在使用中。答案是否需要修改为不说“并包含文本”,而是“并包含有问题的接口名称”?还是我错了,我的系统实际上不使用 netplan?`netplan generate --mapping eth0` 确实显示了 `backend=networkd` 所以我很确定这意味着 netplan 正在使用中...... (2认同)