systemd 下接口不会重命名

systemd 下接口不会重命名

我正在尝试重命名 Ubuntu 16.04 VPS 上的网络接口,但无法做到这一点。Systemd 将我的主网络接口命名为 enp0s3。我想将此接口重命名为 eth0。

根据systemd.link 文档我创建了一个名为的文件,/etc/systemd/network/10-eth0.link其内容如下:

[Match]
MACAddress=08:00:27:f7:57:e5

[Link]
Name=eth0

MAC 地址与ip a接口输出中给出的 MAC 地址匹配。我还将文件中的 enp0s3 条目重命名为 eth0 /etc/network/interfaces。但是,当我重新启动机器时,接口仍名为 enp0s3。

输出中的以下条目dmesg对我来说很有趣:

e1000 0000:00:03.0 eth0: (PCI:33MHz:32 位) 08:00:27:f7:57:e5
e1000 0000:00:03.0 eth0: Intel(R) PRO/1000 网络连接
e1000 0000:00:03.0 enp0s3: 从 eth0 重命名

显然,它一开始是 eth0,但后来又改回了 enp0s3。我不确定为什么?

当我尝试调试链接文件时,我得到以下输出:

$ sudo udevadm test-builtin net_setup_link /etc/systemd/network/10-eth0.link
calling: test-builtin
=== trie on-disk ===
tool version:          229
file size:         6841778 bytes
header size             80 bytes
strings            1755242 bytes
nodes              5086456 bytes
Load module index
timestamp of 'etc/systemd/network' changed
Parsed configuration file /lib/systemd/network/99-default.link
Parsed configuration file /etc/systemd/network/10-eth0.link
Created link configuration context.
unable to open device '/sys/etc/systemd/network/10-eth0.link'

Unload module index
Unloaded link configuration context.

关于无法打开设备的那一行看起来很奇怪。我不确定它为什么要这么做,/sys 下根本没有 etc 目录,我应该创建它吗?

任何关于为什么我的界面名称不能保留的见解都非常受欢迎。

答案1

根据https://www.freedesktop.org/software/systemd/man/systemd.link.html,默认命名策略为:

#  /usr/lib/systemd/network/99-default.link
[Link]
NamePolicy=kernel database onboard slot path
MACAddressPolicy=persistent

因此我怀疑您可能需要在 eth0.link 中添加以下行:

NamePolicy=mac

我还没有测试过这个,所以我不确定,但我怀疑问题在于你在 MAC 上匹配,但没有命名策略来使这一点坚持下去。

每个策略都可能失败,并且将使用第一个成功的策略。名称不会直接设置,而是作为属性“ID_NET_NAME”导出到 udev,默认情况下,udev 规则会使用该属性来设置“NAME”。如果用户空间已经设置了名称,则不会执行重命名

但这只是猜测。

您还应该能够禁用 default.link,至少每个https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/

在我运行的一些 openSUSE 系统上,我遇到了类似的问题,这个问题(除了必须使用 99-default.link“技巧”)通过在 /etc/udev/rules.d 下创建两个文件来解决(参见https://unix.stackexchange.com/questions/118272/80-net-setup-link-no-longer-functions-when-i-downgraded-systemdhttps://wiki.archlinux.org/index.php/Network_configuration#Device_nameshttps://wiki.gentoo.org/wiki/Udev/Upgrade_Guide):

sudo touch /etc/udev/rules.d/80-net-setup-link.rules(或者只是确保该位置有一个同名的空文件)

我创建了/etc/udev/rules.d/10-persistent-network.rules:

ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth*", ATTR{tx_queue_len}="1000"

就您而言,您实际上可以使用该文件来设置您想要的名称:

ACTION=="add", SUBSYSTEM=="net",ATTR{address}=="08:00:27:f7:57:e5",NAME="eth0"

答案2

我已经尝试了以上所有方法。但都不起作用。我已经连续研究了 2 周。

我确实找到了答案,而且它有效。这里:

https://superuser.com/questions/914646/renaming-network-interface-with-systemd

该帖子包含 Lennart 笔记的链接,但这毫无帮助。阅读该帖子,您就会获胜。

以下是我让它工作的方法:

步骤 1:sudo nano /etc/udev/rules.d/70-local-net-names.rules

子系统=="net", 动作=="add", ATTR{address}=="74:da:38:68:55:c1", 名称="wlan1"

此文件需要排在 /usr/lib/udev/rules.d/80-net-setup-link.rules 之前

这在 Debian Stretch 上有效。它也应该在 Ubuntu 上有效。

答案3

根据 systemd 文档,这是由于新的可预测的网络接口名称

文档说你有三个选项可以禁用该行为,可能第三个是最简单的:

  1. 您禁用固定名称的分配,以便再次使用不可预测的内核名称。为此,只需屏蔽 udev 的 .link 文件以使用默认策略:ln -s /dev/null /etc/systemd/network/99-default.link

  2. 您可以创建自己的手动命名方案,例如,将接口命名为“internet0”、“dmz0”或“lan0”。为此,请在 /etc/systemd/network/ 中创建自己的 .link 文件,为一个、一些或所有接口选择一个明确的名称或更好的命名方案。有关更多信息,请参阅 systemd.link(5)。

  3. 您在内核命令行上传递 net.ifnames=0

答案4

例子现在明确说明您需要设置NamePolicy=

[Link]
NamePolicy=
Name=eth0

因此Name=eth0优先选择默认设置。否则,默认NamePolicy设置优先。

我对此进行了测试并确认它解决了该问题。

相关内容