读过https://wiki.archlinux.org/title/Network_configuration有好几次,我仍然发现自己在这个看似简单的任务上遇到了困难。
在一个系统上,通过创建文件,我的工作完全正常:
/etc/systemd/network/eth0.network
包含以下内容:
[Match]
Name=eth0
[Network]
Address=192.168.1.200/24
Gateway=192.168.1.1
DNS=192.168.1.1
但请注意,它使用 eth0,因此仅将设置应用于 eth0。
更新并重新启动后,eth0 突然被命名为 enu1u1。
作为一个没有连接任何显示器或键盘的系统,这一点突然变得不可能实现。
现在我有一个文件 enu1u1.network 并且它可以再次工作,并且在重新启动后仍然有效。
处理这个问题的正确方法是什么?我真的需要为此创建一个 udev 规则吗?系统的更新是什么,只是覆盖了我制定的这条规则,然后我又回到了原点?
我有一个非常简单的设置:
该系统有一个并且将永远有一个以太网接口。
这就是我要的:
我希望这个以太网接口始终获得 IP 192.168.1.200。
我该如何做到这一点,并保证它在更新和重新启动后仍然存在?
我的想法是使用 udev,有足够的规则来尝试很好地匹配它,然后使 udev 规则文件不可变以适应更新。然而,即便如此,我也并不感到完全安全。如果某个我不认识的网络管理器变得活跃或默认安装,并且现在覆盖静态 IP,想要使用 DHCP,该怎么办?
总之,我感觉现在设置静态IP很乱。我可能只是变老了,并且由于不知道执行此操作的正确方法而滥用系统。
我想要一个可以编辑的简单 RC 文件,只需指定 DHCP=no、IP=...,它就应该始终有效。
答案1
从 v197 开始systemd/udev
分配“所有本地接口的可预测、稳定的本地接口名称”。请参阅 systemd.io 发布的内容可预测的网络接口名称。
在 Arch 中你可以恢复为传统的接口名称并通过屏蔽udev
规则来禁用可预测的接口名称
# ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules
或添加net.ifnames=0
到内核参数。
答案2
enu1u1
是 systemd 197 中引入的“可预测”接口名称:https://systemd.io/PREDICTABLE_INTERFACE_NAMES/
我建议坚持使用这个新命名,因为旧的命名方案(eth0、eth1...)高度依赖于内核探测接口的顺序。由于您关心的是更新和重新启动后的生存情况,因此这个新的可预测名称就是正确的选择(并且您已经配置了它)。