我正在尝试重命名 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-systemd,https://wiki.archlinux.org/index.php/Network_configuration#Device_names和https://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 文档,这是由于新的可预测的网络接口名称
文档说你有三个选项可以禁用该行为,可能第三个是最简单的:
您禁用固定名称的分配,以便再次使用不可预测的内核名称。为此,只需屏蔽 udev 的 .link 文件以使用默认策略:ln -s /dev/null /etc/systemd/network/99-default.link
您可以创建自己的手动命名方案,例如,将接口命名为“internet0”、“dmz0”或“lan0”。为此,请在 /etc/systemd/network/ 中创建自己的 .link 文件,为一个、一些或所有接口选择一个明确的名称或更好的命名方案。有关更多信息,请参阅 systemd.link(5)。
您在内核命令行上传递 net.ifnames=0
答案4
这例子现在明确说明您需要设置NamePolicy=
:
[Link]
NamePolicy=
Name=eth0
因此Name=eth0
优先选择默认设置。否则,默认NamePolicy
设置优先。
我对此进行了测试并确认它解决了该问题。