使用 systemd 在 Ubuntu 16.04 中重命名网络接口失败

使用 systemd 在 Ubuntu 16.04 中重命名网络接口失败

我正在使用无头的 Ubuntu 16.04 LTS 服务器,它有两个物理网卡,分别名为 enp5s0f0 和 enp5s0f1。

我想重命名这些接口,然后这个例子。因此我创建了如下文件/lib/systemd/network/70-myinterface.link(原始源似乎不起作用)(我设置了正确的 mac 地址):

[Match]
MACAddress=12:34:56:78:9a:bc

[Link]
Name=dmz0

并重启服务器。不幸的是,界面没有被重命名,尽管udevadm显示我的配置文件被使用:

$ udevadm info /sys/class/net/enp5s0f1
P: /devices/pci0000:00/0000:00:02.0/0000:01:00.0/0000:02:02.0/0000:05:00.1/net/enp5s0f1
E: DEVPATH=/devices/pci0000:00/0000:00:02.0/0000:01:00.0/0000:02:02.0/0000:05:00.1/net/enp5s0f1
E: ID_BUS=pci
E: ID_MODEL_FROM_DATABASE=80003ES2LAN Gigabit Ethernet Controller (Copper)
E: ID_MODEL_ID=0x1096
E: ID_NET_DRIVER=e1000e
E: ID_NET_LINK_FILE=/lib/systemd/network/70-myinterface.link  <-- my file
E: ID_NET_NAME_MAC=enx123456789abc
E: ID_NET_NAME_PATH=enp5s0f1
E: ID_OUI_FROM_DATABASE=Intel Corporation
E: ID_PATH=pci-0000:05:00.1
E: ID_PATH_TAG=pci-0000_05_00_1
E: ID_PCI_CLASS_FROM_DATABASE=Network controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_VENDOR_ID=0x8086
E: IFINDEX=3
E: INTERFACE=enp5s0f1
E: SUBSYSTEM=net
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/enp5s0f1
E: TAGS=:systemd:
E: USEC_INITIALIZED=1900192

您知道为什么重命名不起作用吗?

答案1

这可能有用,也可能没用。我会检查 /etc/udev/rules.d 并查看您是否有 70-persistent-net.rules。您应该能够使用该文件重命名它们

我的看起来像这样:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="e0:cb:ee:d7:ff:9a", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

如果此文件中有卡片条目,您可以通过更改“NAME=TheNameYouWant”将名称更改为您想要的任何名称

答案2

一个不需要 udev 规则(systemd-networkd .link 文件的替代方案)的选项适用于 Ubuntu 16.04 以及许多其他 Linux 版本

例子:

ifconfig peth0 down  
ip link set peth0 name eth0  
ifconfig eth0 up 

在上面的例子中,peth0 是原始接口名称,eth0 是所需名称。在 peth0 的位置插入您当前拥有的名称,在 eth0 的位置插入您想要的名称。无需或建议重新启动。对第二张接口卡重复此过程

在 Ubuntu 16.04 上测试,内核为 4.4.0-36-generic #55-Ubuntu

编辑:如果您正在寻找一个可以重启的持久解决方案,请参阅更改网络接口名称 Ubuntu 16.04

资料来源:https://www.freedesktop.org/software/systemd/man/systemd.link.html

http://kernelpanik.net/rename-a-linux-network-interface-without-udev/

测试。

注意:由于@antti-haapala 方法之前有效然后突然停止,您可能有兴趣知道“作为特殊情况,指向 /dev/null 的空文件(文件大小为 0)或具有相同名称的符号链接会完全禁用配置文件(它被“屏蔽”)”。<-来源

答案3

  • 三种自定义命名方法详解systemd:可预测的网络接口名称,与 udev 规则相关。

    systemd .link 和 udev 规则具有文件夹优先级。/etc覆盖/run覆盖/lib

    因此请检查当前设置。

    # links
    ls -l /*/systemd/network/
    
    # rule that read links
    ls -l /*/udev/rules.d/80-net-setup-link.rules
    
    # rule that check for /etc/.../80-net-setup-link.rules & net.ifnames
    ls -l /*/udev/rules.d/73-usb-net-by-mac.rules
    

    在这些 udev 规则中的任何更改(添加/删除覆盖文件)生效后,应该更新启动 RAM 磁盘:

    sudo update-initramfs -u
    

    默认情况下,这些是您可能找到的唯一文件

    ~$ ls -l /*/systemd/network/
    /etc/systemd/network/:
    total 0
    
    /lib/systemd/network/:
    total 12
    -rw-r--r-- 1 root root 404 Jul 12 17:28 80-container-host0.network ##(virtual-interface)
    -rw-r--r-- 1 root root 482 Jul 12 17:28 80-container-ve.network ##(virtual-interface)
    -rw-r--r-- 1 root root  80 Jul 12 17:28 99-default.link
    
    
    ~$ ls -l /*/udev/rules.d/80-net-setup-link.rules
    -rw-r--r-- 1 root root 292 Jul 12 17:28 /lib/udev/rules.d/80-net-setup-link.rules
    
    ~$ ls -l /*/udev/rules.d/73-usb-net-by-mac.rules
    -rw-r--r-- 1 root root 551 Jul 12 16:37 /lib/udev/rules.d/73-usb-net-by-mac.rules
    

    我已经在全新安装的 VBox 16.04 中测试了所有这些方法,如以下链接所述,所有方法均按预期工作:

    Ubuntu 16.04 复杂的接口名称

  • /etc/udev/rules.d/70-persistent-net-rules是来自旧版本,已被 systemd .link 取代(但它们不是自动创建的),我在这里添加它是为了检查它是否存在特定问题,而不是为了 安蒂·哈帕拉的情况。

答案4

我没有足够的声誉来发表评论,但只是为了补充标记的答案,Ubuntu 16.04 的全新安装不会有 /etc/udev/rules.d/70-persistent-net.rules 文件。但是,如果您手动创建它,您可以添加一行,如此处的答案所示,它应该像在旧版本中一样工作,但有一个显着的区别 - KERNEL 参数应该指定为默认情况下分配给接口的名称。例如,如果系统将接口命名为“ens160”并且您想将其更改为“eth0”,则该行可能看起来像:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="ens160", NAME="eth0"

这告诉规则只匹配与指定 MAC(在 ATTR{address} 参数中)匹配的接口,以及与 KERNEL 参数匹配的内核名称。或者,您也可以完全省略 KERNEL 参数,这样也应该有效。

编辑:正如前面提到的,如果您想使用 .link 文件方法,则需要更新 initramfs 才能使其生效。另请注意,自定义 .link 文件应在 /etc/systemd/network 中创建,而不是在 /lib/systemd/network 中创建(两者都可以,但最佳做法是使用 /etc/systemd/network,因为它的用途是 - 允许自定义 .link 文件覆盖 /lib/systemd/network 中的默认值)。

相关内容