我刚刚开始使用 systemd 网络,无法设置具有静态 IP 地址的新系统。这是默认的 Ubuntu 20.04 服务器,未安装网络管理器和 ifupdown(因此没有 /etc/network/interfaces 等)。
默认情况下,服务器启动时会启用 DHCP,并获取 IP 地址,一切正常。我现在添加了一个 /etc/systemd/network/static.network 文件,其中包含基本设置:
[Match]
Name=e*
[Network]
Address=192.168.1.20/24
Gateway=192.168.1.40
如果我执行systemctl restart systemd-networkd
此操作,则会忽略此操作,并systemctl status
显示从 DHCP ( ) 分配了地址 192.168.1.10 enp1s0: DHCPv4 address 192.168.1.10/24 via 192.168.1.40
。如果我重新启动,我会得到相同的结果;地址仍然是 DHCP 地址。似乎文件static.network
被完全忽略了,但它正在被处理 - 如果我向文件中添加明显的错误,status 命令会报告它。有什么想法我做错了吗?
该服务器实际上是在 RHEL 8 下运行的虚拟机,我希望这无关紧要。
答案1
嗯,这看起来像是 20.04 上的一个错误。.network
根据以下摘录,文件应该按词汇顺序进行处理systemd-networkd
文档:
.network 文件是从位于系统网络目录 /usr/lib/systemd/network 和 /usr/local/lib/systemd/network、易失性运行时网络目录 /run/systemd/network 和本地管理网络目录 /etc/systemd/network 中的文件读取的。所有配置文件都按词汇顺序集体排序和处理,无论它们位于哪个目录中。
但是,如果我打开systemd-networkd
调试(参见这里如果你不知道怎么做),那么最低-lexically-sorted 文件优先。我不能完全确定,因为日志不显示处理顺序,并且只在相关网络接口的第一次命中时停止。
对于普通的 Ubuntu 20.04 服务器安装,这是我所知道的:
.network
整个系统有 5 个文件- 其中一个是由 netplan 在运行时创建的,并且
/run/systemd/network/10-netplan-enp1s0.network
- 我的新文件是
/etc/systemd/network/static.network
- 在
systemctl restart systemd-networkd
netplan 文件上优先于我自己的 - 如果我手动删除 netplan 文件并重新启动网络,我的文件就会生效。不过,这只是暂时的,直到下次重新启动
- 如果我将文件重命名为,
05-static.network
则其优先级高于 netplan 文件
因此,处理顺序被破坏,除非我做了一些愚蠢的事情。
作为临时修复,您需要通过在文件前添加类似 的前缀来赋予文件较低的词汇顺序05-
。但是,如果处理顺序被反转,这可能会在未来的更新中中断。更好的修复方法是禁用 netplan(不确定如何执行此操作),但如果其他程序决定必须创建一个.network
文件来弥补缺失的 netplan 文件,这也可能会中断。
编辑-删除 netplan
您可以使用 完全删除 netplan apt purge netplan.io
。但是,这可能不是一个好主意 -cloud-init
例如,它还会删除 DigitalOcean 所需的 。因此:
# cd /etc/netplan
# rm 00-installer-config.yaml
# netplan apply
重新启动后,您不再获得自动生成的.network
文件,并且可以在文件中使用正常的文件命名.network
而不会发生冲突。