systemd-networkd

dhcp

networkd 内置了 dhcp client。 如果需要更新 resolv.conf, 需要启动 systemd-resolved.service

配置文件存放在

  • /usr/lib/systemd/network (上游提供的配置),
  • /run/systemd/network (运行时配置), 以及
  • /etc/systemd/network (本地配置).

其中 /etc/systemd/network 优先级最高

有三类配置文件

  • .link 文件: 当一个网络设备出现时, udev 会寻找第一个匹配到的 .link 文件.
  • .network 文件: 给匹配到的设备应用一个网络配置
  • .netdev 文件: 给匹配到的环境创建一个虚拟的网络设备

他们都遵循一些相同的规则

如果 [Match] 部分满足了条件, 在接下来的段落中的配置会被应用
[Match] 部分可以接受不止一项条目. 在这种情况下, 只有当每一个条目都被满足时, 这个配置才会被启用
空白的 [Match] 部分表示这个配置在任何情况下都会被应用
每一项条目都是 KEY=VALUE 格式的键值对
所有的配置文件会被收集并按字典序排序后再处理, 无论它们在哪个目录
相同名字的配置文件会相互替代

.network 配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[Match]
Name= 设备名 (比如Br0, enp4s0, 也可以用通配符, 比如 en*), 可以配置多个 name
Host= 匹配的 hostname
Virtualization= 一个布尔值, 检测你的系统是否运行在一个虚拟化环境中. 也就是说, Virtualization=no 只会在宿主机上满足, 而 Virtualization=yes 会应用到任何虚拟机或 container.
[Link]
#当 "RequiredForOnline=no" 时, 如果此网络不在线(例如未能从 DHCP 获取IP地址、或者网线被拔出等原因), 那么 "systemd-networkd-wait-online" 将会自动跳过它。
# routable, make routing on this interface a dependency for network-online.target
RequiredForOnline=no

[Network]
DHCP= 一个布尔值. 设为 true 的时候, 会启用 systemd-networkd 自带的基础 DHCPv4 支持.
DNS= DNS 服务器地址.
Bridge= 如果要将这个连接加入网桥, 在这里写入目标网桥的名字
Address= 静态的 IPv4 或者 IPv6 地址, 以及相应的用/<数字>方式表示的掩码(如 192.168.1.90/24).
Gateway= 网关地址.

如果需要指定多个 DNS, Address 或者 Gateway, 你可以多次指定相应的键值对. (也就是说, 多写几行 DNS=xxx, DNS=yyy…)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
pacman -S wpa_supplicant

# start systemd-networkd and systemd-resolved service
systemctl enable systemd-networkd
systemctl start systemd-networkd
systemctl enable systemd-resolved.service
systemctl start systemd-resolved.service

# for wifi
vim  /etc/systemd/network/wifi.network

[Match]
Name=wlp3s0
[Network]
DHCP=yes

cat /etc/wpa_supplicant/wpa_supplicant-wlp3s0.conf
network={
 ssid="w1100n"
 psk="xxxxxxxx"
}

sudo systemctl start wpa_supplicant@wlp2s0


DHCP

for eth0, vim /etc/systemd/network/eth.network

1
2
3
4
[Match]
Name=en*
[Network]
DHCP=yes

配置静态 IP, 网关

1
vim /etc/systemd/network/eth.network

文件内容:

1
2
3
4
5
6
7
8
[Match]
Name=ens3

[Network]
# Address 一定要以 /24 结尾
Address=192.168.50.20/24
Gateway=192.168.50.1
DNS=192.168.50.1

把网卡加入网桥 /etc/systemd/network/10-eth1.network

1
2
3
4
5
[Match]
Name=enp3s0

[Network]
Bridge=br0

check network config

1
networkctl status -a

在吃掉 udev 和谋划收编 dbus 后, systemd 又将它的魔爪伸向了网络管理方面. 虽然这已经是 systemd 209 时候的旧闻, 不过因为整个功能太过不完善 (被吐槽有超多 bug, 以及各种基本功能缺失) 以及没有文档, 上游一直没有大力推广.

本文仅就最为简单普通的有线网络连接介绍 systemd-networkd 的打开方式. (wifi 呀, ppp 呀, vpn 呀之类的复杂配置现在都不支持哦) (大部分信息翻译自 ArchWiki)


https://blog.felixc.at/2014/04/try-new-network-configuration-tool-systemd-networkd/
https://blog.felixc.at/2014/04/try-new-network-configuration-tool-systemd-networkd/embed/#?secret=GLctgxboIR https://zhuanlan.zhihu.com/p/19770401
https://linux.cn/article-6629-1.html