如何在 Linux 上从网络管理器切换到 systemd-networkd
在 Linux 世界中,systemd 的采用一直是一个激烈争论的话题,其支持者和批评者之间的争论仍在继续。截至目前,大多数主要 Linux 发行版都采用 systemd
作为默认 init 系统。
systemd
被其作者标榜为“从未完成,从未完成,但正在跟踪技术进步”,它不仅仅是 init 守护进程,而且被设计为一个更广泛的系统和服务管理平台,其中包含不断增长的核心系统守护进程、库和实用程序生态系统。
systemd
的众多新增功能之一是 systemd-networkd
,它负责 systemd
生态系统内的网络配置。使用systemd-networkd,您可以为网络设备配置基本的DHCP/静态IP网络。它还可以配置虚拟网络功能,例如桥接、隧道或 VLAN。无线网络不是由 systemd-networkd
直接处理的,但您可以使用 wpa_supplicant
服务来配置无线适配器,然后将其与 systemd-networkd
连接起来。
在许多 Linux 发行版上,网络管理器已经并且仍然用作默认网络配置管理器。与 Network Manager 相比,systemd-networkd
仍在积极开发中,并且缺少功能。例如,它没有网络管理器的智能来让您的计算机始终通过各种接口保持连接。它不提供用于高级脚本编写的 ifup/ifdown
挂钩。然而,systemd-networkd
与其余 systemd
组件(例如,用于 DNS 的 resolved
、用于 NTP 的 timesyncd
、用于命名的 udevd
)很好地集成,并且 systemd-networkd
的作用可能只会随着时间在 systemd
环境中的发展而增长。
如果您对 systemd 的发展方式感到满意,您可以考虑的一件事是从 Network Manager 切换到 systemd-networkd。如果您强烈反对 systemd,并且对 Network Manager 或基本网络服务非常满意,那是非常酷的。
但对于那些想要尝试 systemd-networkd
的人来说,您可以继续阅读并在本教程中了解如何在 Linux 上从网络管理器切换到 systemd-networkd
。
要求
systemd-networkd
在 systemd
版本 210 及更高版本中可用。因此,Debian 8 Jessie (systemd
215)、Fedora 21 (systemd
217)、Ubuntu 15.04 (systemd
219) 或更高版本等发行版与 systemd-networkd
兼容。
对于其他发行版,请在继续之前检查您的 systemd
版本。
$ systemctl --version
从网络管理器切换到 systemd-networkd
从 Network Manager 切换到 systemd-networkd 相对简单(反之亦然)。
首先,禁用 Network Manager 服务,然后启用 systemd-networkd
,如下所示。
$ sudo systemctl disable NetworkManager
$ sudo systemctl enable systemd-networkd
您还需要启用 systemd-resolved
服务,systemd-networkd
使用该服务进行网络名称解析。该服务实现了缓存 DNS 服务器。
$ sudo systemctl enable systemd-resolved
$ sudo systemctl start systemd-resolved
启动后,systemd-resolved
将在 /run/systemd
目录下的某个位置创建自己的 resolv.conf
。然而,将 DNS 解析器信息存储在 /etc/resolv.conf
中是一种常见的做法,并且许多应用程序仍然依赖 /etc/resolv.conf
。因此,出于兼容性原因,请按如下所示创建到 /etc/resolv.conf
的符号链接。
$ sudo rm /etc/resolv.conf
$ sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
使用 systemd-networkd 配置网络连接
要使用 systemd-networkd
配置网络设备,您必须在扩展名为 .network
的文本文件中指定配置信息。然后,这些网络配置文件将从 /etc/systemd/network
存储和加载。当有多个文件时,systemd-networkd
会按照词法顺序一一加载并处理它们。
让我们首先创建一个文件夹 /etc/systemd/network
。
$ sudo mkdir /etc/systemd/network
DHCP 网络
我们首先配置 DHCP 网络。为此,创建以下配置文件。文件的名称可以是任意的,但请记住文件是按词法顺序处理的。
$ sudo vi /etc/systemd/network/20-dhcp.network
[Match]
Name=enp3*
[Network]
DHCP=yes
正如您在上面所看到的,每个网络配置文件都包含一个或多个部分,每个部分前面都有[XXX]
标题。每个部分包含一个或多个键/值对。 [Match]
部分确定此配置文件配置哪些网络设备。例如,此文件匹配名称以 ens3 开头的任何网络接口(例如,enp3s0、enp3s1、enp3s2 等)。对于匹配的接口,它会应用 [Network]
部分中指定的 DHCP 网络配置。
静态IP网络
如果要为网络接口分配静态 IP 地址,请创建以下配置文件。
$ sudo vi /etc/systemd/network/10-static-enp3s0.network
[Match]
Name=enp3s0
[Network]
Address=192.168.10.50/24
Gateway=192.168.10.1
DNS=8.8.8.8
您可以猜到,接口 enp3s0
将被分配一个地址 192.168.10.50/24
、一个默认网关 192.168.10.1
和一个 DNS 服务器 8.8.8.8
。这里的一个微妙之处是,接口的名称 enp3s0
实际上也与早期 DHCP 配置中定义的模式规则相匹配。但是,由于根据词汇顺序,文件 10-static-enp3s0.network
在 20-dhcp.network
之前处理,因此在 enp3s0
接口的情况下,静态配置优先于 DHCP 配置。
创建完配置文件后,重新启动 systemd-networkd 服务或重新启动。
$ sudo systemctl restart systemd-networkd
通过运行以下命令检查服务的状态:
$ systemctl status systemd-networkd
$ systemctl status systemd-resolved

使用 systemd-networkd 配置虚拟网络设备
systemd-networkd 还允许您配置虚拟网络设备,例如网桥、VLAN、隧道、VXLAN、绑定等。您必须在扩展名为 .netdev 的文件中配置这些虚拟设备。
这里我将展示如何配置桥接接口。
Linux桥
如果要创建 Linux 网桥 (br0
) 并向该网桥添加物理接口 (eth1
),请创建以下配置。
$ sudo vi /etc/systemd/network/bridge-br0.netdev
[NetDev]
Name=br0
Kind=bridge
然后使用 .network
文件配置桥接口 br0
和从接口 eth1
,如下所示。
$ sudo vi /etc/systemd/network/bridge-br0-slave.network
[Match]
Name=eth1
[Network]
Bridge=br0
$ sudo vi /etc/systemd/network/bridge-br0.network
[Match]
Name=br0
[Network]
Address=192.168.10.100/24
Gateway=192.168.10.1
DNS=8.8.8.8
最后,重新启动systemd-networkd:
$ sudo systemctl restart systemd-networkd
您可以使用brctl
工具来验证桥br0
是否已创建。
概括
当 systemd
承诺成为 Linux 的系统管理器时,难怪像 systemd-networkd
这样的东西应运而生来管理网络配置。不过现阶段,systemd-networkd 似乎更适合网络配置相对稳定的服务器环境。对于涉及各种瞬态有线/无线接口的台式机/笔记本电脑环境,网络管理器可能仍然是首选。
对于那些想要了解有关 systemd-networkd 的更多信息的人,请参阅官方手册页以获取支持的部分和键的完整列表。