centos 6 不支持 systemd.link,因其使用 sysv init + 老版本 udev,网卡命名依赖 /etc/udev/rules.d/70-persistent-net.rules;systemd 及 .link 机制仅从 centos 7 开始引入。

CentOS 6 本身不支持 systemd.link,因为 systemd 是从 CentOS 7(RHEL 7)开始才作为默认 init 系统引入的。而 CentOS 6 使用的是 SysV init + udev(版本较老,如 udev-147),其网卡命名机制依赖于 udev 规则文件(如 /etc/udev/rules.d/70-persistent-net.rules),不存在 .link 文件机制。
所以,问题中“在基于老旧 CentOS 6 升级到新版内核的生产机器上利用 systemd.link 文件……”这一前提技术上不成立——无论你把内核升级到 4.x、5.x 还是 6.x,只要操作系统仍是 CentOS 6(内核 + 用户空间未变更),systemd 就不会运行,.link 文件完全被忽略,systemd-networkd 也根本不存在。
但你的实际诉求很明确:在老旧硬件上稳定绑定多物理网卡到固定名称(如 eth0→eno1, eth1→ens1f0),避免因内核升级、驱动变动或热插拔导致网卡名漂移(如 eth0 ↔ eth1 互换)。这确实是生产环境的关键需求。下面分两种真实可行路径说明:
✅ 路径一:仍在 CentOS 6 上 —— 用传统 udev 规则「锁死」网卡名
适用于:已升级新内核(如 4.19/5.15)但 OS 仍为 CentOS 6 的场景。
-
确认网卡 PCI 地址与 MAC 地址
lspci | grep -i ethernet ip link show | awk -F': ' '/^[0-9]+:/ {print $2}' | while read iface; do echo "$iface:"; ethtool -i "$iface" 2>/dev/null | grep bus-info; ip link show "$iface" | grep -o -E 'link/[a-f0-9:]{17}'; done输出类似:
CentOS Linux 7.9.2009下载CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
eth0: bus-info: 0000:02:00.0 link/ether 00:11:22:33:44:55 eth1: bus-info: 0000:02:00.1 link/ether 00:11:22:33:44:56 -
编写 udev 规则(强制重命名)
创建/etc/udev/rules.d/70-net-name.rules:# 锁定第一张网卡为 eno1(对应主板板载) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:11:22:33:44:55", NAME="eno1" # 锁定第二张网卡为 ens1f0(对应 PCIe 插槽第一口) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:11:22:33:44:56", NAME="ens1f0"⚠️ 注意:
- 必须用
NAME=(不是KERNEL_NAME=或ID_NET_NAME_ONBOARD=); -
DRIVERS=="?*"确保匹配所有驱动(e1000e、igb、ixgbe 等); - 规则文件名必须以数字开头(如
70-),确保加载顺序晚于系统默认规则。
- 必须用
-
生效规则
sudo udevadm control --reload-rules sudo udevadm trigger --subsystem-match=net sudo reboot # 推荐重启,确保所有接口按新名初始化
✅ 路径二:已迁移到 CentOS 7+ / RHEL 7+ —— 正确使用 .link 文件
适用于:你已完成 OS 层级迁移(非仅内核升级),运行 systemd 的现代系统。
-
禁用预测性网卡命名(可选,但推荐统一管理)
在/etc/default/grub中添加:GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
然后
sudo grub2-mkconfig -o /boot/grub2/grub.cfg && sudo reboot
→ 恢复传统eth0/eth1命名,再用.link精准控制。 -
创建
.link文件(推荐方式)
例如/etc/systemd/network/10-eno1.link:[Match] MACAddress=00:11:22:33:44:55 [Link] Name=eno1
/etc/systemd/network/20-ens1f0.link:[Match] MACAddress=00:11:22:33:44:56 [Link] Name=ens1f0
✅ 优势:
- 优先级高于 udev,且由 systemd-networkd 原生支持;
- 支持更丰富的匹配条件(
Path=,Driver=,Property=等); - 无需重启,
sudo systemctl restart systemd-udevd即可重载。
❌ 不可行方案提醒
- 在 CentOS 6 上安装 systemd 并期望
.link生效 → 失败(基础库、dbus、logind 等严重缺失); - 仅升级内核却不升级用户空间 → 无法启用任何 systemd 功能;
- 误以为
kernel-ml(ELRepo 提供)自带 systemd 支持 → 它只是内核包,不改变 init 系统。
真正“彻底锁死”的关键不在内核版本,而在 命名机制的控制权归属:
CentOS 6 靠 udev 规则,CentOS 7+ 靠 systemd .link。
选对路径,才能让 eno1 永远是那块 Intel I210,ens1f0 永远是那张 Mellanox CX4 —— 无论内核怎么升,驱动怎么换。










