「systemd」- 可预测网络接口名

问题描述

传统的网络接口命名方式(eth0, eth1, …)与驱动的探测顺序有关,这样带来的问题是:
1)如果有多张网卡,某个接口是以 eth0 命名,重启后下次就可能变成以 eth1 命名;
2)再比如,当做 Bonding 时候,怎么能接受网卡名变来变去呢?
3)再比如,防火墙,接口命名发生变化,但是防火墙还作用于原来的接口,这就会导致安全问题;

解决方案

可预测网络接口名

从 systemd v197 开始,会给网络设备一个稳定的、可预测的命名。这区别于传统的 eth0、eth1、wlan0 之类的命名规则;

关于可预测网络接口名的命名规则,参考源码说明:https://github.com/systemd/systemd/blob/master/src/udev/udev-builtin-net_id.c#L20

如何启用

首先,要确保的系统使用 systemd 为初始化进程,这是 systemd 197 引入的功能;

/etc/default/grup 中,参数 GRUB_CMDLINE_LINUX_DEFAULT=”” 不要添加 net.ifnames=0 参数(而添加表示禁用);
确保 /etc/systemd/network/99-default.link 没有指向 /dev/null 设备(这是用于禁用可预测网络接口名功能的);
最后,确保没有使用 /etc/systemd/network/ 中没有自定义的命名规则文件(扩展名为.link 的文件);

1)在 Debian 中,通过命令 update-grub 来更新引导,这一步是为了修改传递给内核的启动参数(net.ifnames=0);
2)至于其他的发行版配置方法,需要参考发行版的文档说明;

如何禁用

如果觉得这种命名比较傻,可以使用下面的三种方式来使用旧的网卡命名方式:

掩盖网络设备配置文件

You disable the assignment of fixed names, so that the unpredictable kernel names are used again. For this, simply mask udev’s .link file for the default policy:

# ln -s /dev/null /etc/systemd/network/99-default.link

创建上述的软链接即可;

自定义命名方案

You create your own manual naming scheme, for example by naming your interfaces “internet0”, “dmz0” or “lan0”. For that create your own .link files in /etc/systemd/network/, that choose an explicit name or a better naming scheme for one, some, or all of your interfaces. See systemd.link(5) for more information.

使用内核命令参数

在内核的命令行上传递”net.ifnames=0“。这通常可以在各个 Linux 发行版中通过修改/etc/default/grub文件中的GRUB_CMDLINE_LINUX_DEFAULT参数来实现,然后更新 GRUP 引导;

在 Debian 9 中,可以修改/etc/default/grub文件中的GRUB_CMDLINE_LINUX_DEFAULT参数,然后加入”net.ifnames=0“,然后执行update-grub2命令

接口名称发生变化

systemd.link/Example 2

问题描述

虽然我们开启可预测的接口名称,但是接口名称却发生变化:
1)我们的主板具有 3 个 PCIE 接口,其中 2 个接入 PCIE 网卡,另 1 个接入磁盘阵列卡;
2)随着磁盘阵列卡的插拔,我们发现 PCIE 网卡的名称发生变化,同时主板网卡的名称也发生变化;

原因分析

我们并不具备相关的知识背景,问题暂时搁置;

解决方案

通过 systemd.link 服务,来配置固定接口名称:

# /etc/systemd/network/10-dmz.link

[Match]
MACAddress=00:a0:de:63:7a:e6

[Link]
Name=dmz0

参考文献

www/Software/systemd/PredictableNetworkInterfaceNames
How to enable “Predictable Network Interface Names”?
serverfault/predictable network interface names in systemd
Change network interface names to eth0 schema in Debian Stretch
Use of Predictable Network Interface Names with alternate kernels
如何在 CentOS7 上改变网络接口名的方法与步骤