linux网卡命名规则与修改方法

一.前言:

       在早期的的操作系统中例如fedora13或者ubuntu15之前网卡命名的方式为eth0,eth1,eth2,属于biosdevname 命名规范。当然这是针对intel网卡的命名规则,对于realtek类型的网卡会命名为ens33。但是这个编号往往不一定准确对应网卡接口的物理顺序,为了能够方便定位和区分网络设备,目前linux的主流操作系统采用一致网络设备命名(CONSISTENT NETWORK DEVICE NAMING)规范。

二.一致网络设备命名规则(CONSISTENT NETWORK DEVICE NAMING)

        命名规范为:设备类型 + 设备位置

1. 设备类型

        en 代表以太网

        wl 代表无线局域网(WLAN)

        ww 代表无线广域网(WWANs)

2. 设备位置

格式

含义

o<on-board_index_number>

主板bios内置的网卡

s<hot_plug_slot_index_number>[f<function>][d<device_id>]

主板bios内置的PCI-E网卡

x<MAC>

MAC 地址

p<bus>s<slot>[f<function>][d<device_id>]

PCI-E独立网卡

[P<domain_number>]p<bus>s<slot>[f<function>][u<usb_port>][…][c<config>][i<interface>]

USB网卡

        例如:       

        eno1 板载1号网卡

        enp0s2 以太网0号PCI扩展卡的2号端口

        ens33 由主板 BIOS 内置的 PCI-E 接口的网卡

        wlp1s0 无线第1号PCI扩展卡的0号端口

3.优势

       (1) 设备名称是完全可预测的。

       (2) 即使添加或删除硬件,设备名称也保持固定,因为不会发生重新枚举。

       (3) 有缺陷的硬件可以无缝更换。

三.系统默认命名规则

 1. systemd rename流程

        以centos7为例,系统默认用于网卡设备重命名的服务是systemd-udevd,我们可以使用systemctl status systemd-udevd来查看目前该服务的状态

 

         在centos7中, systemd命名网卡的规则是根据一下6个配置文件来的

        /lib/udev/rules.d/60-net.rules
        /lib/udev/rules.d/71-biosdevname.rules
        /lib/udev/rules.d/75-net-description.rules
        /lib/udev/rules.d/80-net-name-slot.rules
        /lib/udev/rules.d/80-net-setup-link.rules
        /lib/udev/rules.d/99-systemd.rules

        (1) 第一步: /lib/udev/rules.d/60-net.rules

        

        使用/lib/udev/rename_device这个程序,首先查询/etc/sysconfig/network-scripts/下所有以ifcfg-开头的文件
        如果在ifcfg-xx中匹配到HWADDR=xx:xx:xx:xx:xx:xx参数的网卡接口
则选取DEVICE=yyyy中设置的名字作为网卡名称。

ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", RESULT=="?", NAME="$result"


        在不修改 udev 规则的条件下,/etc/sysconfig/network-scripts/的 ifcfg-* 文件的优先最高。在ifcfg-*文件中将DEVICE 和 mac 绑定后重命名网卡名称和避免网卡乱序。

        (2)第二步:/lib/udev/rules.d/71-biosdevname.rules

        如果系统中安装了biosdevname,且内核参数未指定biosdevname=0,且上一步没有重命名网卡,则按照biosdevname的命名规范,从BIOS中取相关信息来命名网卡。
        主要是取SMBIOS中的type 9 (System Slot) 和 type 41 (OnboardDevices Extended Information)

        (3)第三步: /lib/udev/rules.d/75-net-description.rules

        /lib/udev/rules.d/75-net-description.rules 中的规则让 udev 通过检查网络接口设备,填写内部 udev 设备属性值 ID_NET_NAME_ONBOARD、ID_NET_NAME_SLOT、ID_NET_NAME_PATH,但是有些设备属性可能处于未定义状态。


        可以通过udevadm test-builtin net_id /sys/class/net/xxx 网络接口比如ens33来查看相关属性。

 

         (4)第四步: /lib/udev/rules.d/80-net-name-slot.rules

 

        如果在60-net.rules ,71-biosdevname.rules这两条规则中没有重命名网卡,且内核未指定net.ifnames=0参数,udev依次尝试来自udev规则文件75-net-description.rules属性值来命名网卡,
如果这些属性值都没有,则网卡不会被重命名,沿用内核给定的ethx来命名

   (5)第五步 /lib/udev/rules.d/80-net-setup-link.rules
     用内建的的path_id 和net_setup_link来查询 键值ID_NET_NAME,并赋给设备名字
NAME=="", ENV{ID_NET_NAME}!="", NAME="$env{ID_NET_NAME}"

 

 (6)第六步  /lib/udev/rules.d/99-systemd.rules

 用sysctl 改变内核的一些默认参数

 /lib/systemd/systemd-sysctl --prefix=/net/ipv4/conf/name --prefix=/net/ipv6/conf/name

所以针对60-net.rules, 可以添加类似如下规则文件去固定命名。

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?", ATTR{address}=="08:00:27:84:e3:82", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth", NAME="eth0"
/# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?", ATTR{address}=="08:00:27:f0:c8:7f", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth", NAME="eth2"
/# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?", ATTR{address}=="08:00:01:63:bd:f1", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth", NAME="eth1"

        也可以修改/etc/sysconfig/network-scripts/下的 ifcfg-* 文件,在ifcfg-*文件中将DEVICE 和 mac 绑定,固定网卡名称,其中device条目即为设备名字,如DEVICE=eno2

        强调:这个step顺序是在我们没有自定义自己的rules的前提下,如果用户自定义了自己的rules,则用户自定义为优先级最高;

2.scheme次序

        systemd 会使用以下策略,采用支持的命名方案为接口命名:

        Scheme 1(方案 1): 如果从BIOS中能够取到可用的板载网卡的索引号,则使用这个索引号命名,例如: eno1,如不能则尝试Scheme 2

        Scheme 2(方案 2): 如果从BIOS中能够取到可以用的网卡所在的PCI-E热插拔插槽的索引号,则使用这个索引号命名,例如: ens1,如不能则尝试Scheme 3

        Scheme 3(方案 3): 如果能拿到设备所连接的物理位置信息,则使用这个信息命名,例如:enp2s0,如不能则尝试Scheme 5

        Scheme 4(方案 4): 使用网卡的MAC地址来命名,这个方法一般不使用。enx78e7d1ea46da

        Scheme 5(方案 5):传统的kernel命名方法,例如: eth0,这种命名方法的结果不可预知的,即可能第二块网卡对应eth0,第一块网卡对应eth1。      

四.修改为biosdevname命名规则

    1. 修改启动参数   

        (1)编辑/etc/default/grub
        root@ubuntu:~# vi /etc/default/grub

        找到GRUB_CMDLINE_LINUX="" 

        改为GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

        (2)重新生成GRUB的启动菜单配置文件(/boot/grub/grub.cfg)
        root@ubuntu:~# update-grub

        (3)重启系统后,网卡名称变成eth0和wlan0

        2. 修改网卡配置文件

        原来网卡配置文件名称为ifcfg-ens33,这里需要修改为eth0的格式,并适当调整网卡配置文件。 

        mv /etc/sysconfig/network-scripts/ifcfg-ens12 /etc/sysconfig/network-scripts/ifcfg-eth0        #修改ifcfg-eth0文件如下内容(其它内容不变),NAME=eth0 DEVICE=eth0

        systemctl restart network.service #重启网络服务

        3.  创建70-persistent-net.rules

        直接在/etc/udev/rules.d/中创建或修改70-persistent-net.rules文件,加上或修改信息为:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", NAME=="eth0"

 五.ubuntu18修改网卡名称

      上面讲过的都是在centos7中,在ubuntu18中,则简单很多,没有看到/lib/udev/rules.d/60-net.rules, /lib/udev/rules.d/71-biosdevname.rules,/lib/udev/rules.d/75-net-description.rules这些文件

        ubuntu18识别网卡,名称默认会根据 /lib/udev/rules.d/目录下的80-net-setup-link.rules文件定义的规则来。如果你要更改规则,需要先将文件80-net-setup-link.rules从/lib/udev/rules.d目录复制到/etc/udev/rules.d目录。因为/etc/udev/rules.d目录下规则的优先级高于/lib/udev/rules.d目录,识别网卡并命名时,会优先从/etc/udev/rules.d目录下寻找规则文件。将ID_NET_NAME改成ID_NET_SLOT即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/45894.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(七)「消息队列」之 RabbitMQ 发布者确认(使用 .NET 客户端)

发布者确认&#xff08;Publisher Confirms&#xff09; 发布者确认是一个 RabbitMQ 扩展&#xff0c;用于实现可靠的发布。当在通道上启用发布者确认时&#xff0c;客户端发布的消息将由代理异步确认&#xff0c;这意味着它们已在服务器端得到处理。 0、引言 先决条件 本教程…

uni-app个人中心

一. 介绍uni-app&#xff1a; uni-app 是基于Vue.js框架开发的一个跨平台移动应用开发框架&#xff0c;可以同时支持多个平台&#xff08;如iOS、Android、Web等&#xff09;的应用开发。采用了统一的语法和组件规范&#xff0c;可以大大简化跨平台开发的工作&#xff0c;提高…

SZ:zip/内部函数外部函数/VGG模型/nn

zip&#xff1a; -r recursion-d delete-m move (move隐藏的意思是&#xff0c;原文件会消失&#xff09;想增加文件&#xff0c;不需要加参数什么参数也没有。如果zip压缩文件不存在&#xff0c;执行以上命令将会创建一个新的zip文件并将指定的文件添加进去。如果zip压缩文件…

需求管理中最易忽视的6大重点

需求管理是产品经理的重点工作&#xff0c;如果无法有效进行需求管理&#xff0c;往往会引起需求变更、项目延期以及成本增加等问题。那么如何对需求进行高效管理&#xff0c;我们在需求管理中&#xff0c;往往最容易忽视的重点都有哪些&#xff1f; 1、重视项目整体管理计划 首…

【前后端数据交互】原生JS的Fetch请求封装

一、 AJAX 和 Fetch 对比 1.1 AJAX 概述 AJAX 是最早出现请求数据的方式&#xff0c;它不需要不需要刷新整个页面即可更新部分数据。 属于原生 JS 范畴 &#xff0c;技术核心是 XMLHttpRequest 对象。 AJAX 请求过程&#xff1a;创建 XMLHttpRequest 对象、连接服务器、发送请…

Qt Core学习日记——第六天QMetaMethod

Qt子类会将每一个函数封装成QMetaMethod存储在对应的QMetaObject中&#xff0c;包括信号、槽函数、普通函数、构造函数、析构函数 函数解析 QMetaMethod::methodSignature 获取方法的签名 比如函数slot2&#xff0c;对应签名是“slot2(int*)” QMetaMethod::name 方法名称。…

你能说说“淘宝购物车”怎么测试么?

前言 今天我给大家整理一篇面试高频问到的问题“淘宝购物车”怎么测试。 测试思维 依然附上测试任何事物的测试思路&#xff1a; 第一步&#xff1a;梳理产品的核心业务流程&#xff1a;明白这是个什么项目&#xff0c;实现了什么业务&#xff0c;以及是怎么实现的&#xf…

从Vue层面 - 解析发布订阅模式和观察者模式区别

目录 前言一、发布订阅模式什么是发布订阅模式&#xff1f;应用场景 二、观察者模式1&#xff09;什么是观察者模式&#xff1f;2&#xff09;应用场景3&#xff09;vue中的观察者模式观察者&#xff08;订阅者&#xff09; - Watcher目标者&#xff08;发布者&#xff09; - D…

STM32 串口实验(学习一)

本章将实现如下功能&#xff1a;STM32通过串口和上位机对话&#xff0c;STM32在收到上位机发过来的字符串后&#xff0c;原原本本返回给上位机。 STM32 串口简介 串口作为MCU的重要外部接口&#xff0c;同时也是软件开发重要的调试手段&#xff0c;其重要性不言而喻。现在基本…

Fiddler使用说明及中文绿化版

Fiddler是最常用的Web调试工具之一。 对于开发来说&#xff0c;前端可以通过fiddler代理来调试JS、CSS、HTML样式。后端可以通过fiddler查看请求和相应&#xff0c;定位问题。 对于测试来说&#xff0c;可以通过抓包方式修改前端请求参数和模拟后端返回&#xff0c;快速定位缺…

如何创建vue2,vue3项目

前提需安装node.js和Vue CLI node.js:https://nodejs.org/zh-cn Vue CLI&#xff1a; npm install -g vue/cli 如何创建一个vue2项目 &#xff08;1&#xff09; 使用cmd终端直接创建 进入到vue项目所创建的目录里&#xff08;我是直接创建在桌面上&#xff09; 选择vue2 …

STL中的string类的模拟实现【C++】

文章目录 默认成员函数构造函数拷贝构造函数 赋值运算符重载函数析构函数beginendsizecapacityreserveeraseresizepush_backappendoperatorinsertswapsubstrc_stroperator[ ]findcleargetline>>运算符的重载<<运算符的重载 默认成员函数 构造函数 构造函数设置为…

现代控制理论

B站学习视频https://space.bilibili.com/230105574/channel/seriesdetail?sid1569601 一.引入状态-空间表达 &#xff08;本质上是使用一组向量的线性组合来表示整个系统任意物理量&#xff0c;也就是一个特征分解的过程&#xff09; 现代控制理论的基础是 状态-空间表达方…

IDEA以服务列表的形式展示

IDEA以服务列表的形式展示 要是没有要显示的服务列表的话就右键将启动的全部添加进去。正常是懒加载的形式&#xff0c;正常启动了就会添加进去。

Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)(A-G)

Contest Duration: 2023-07-22(Sat) 20:00 - 2023-07-22(Sat) 21:40 (local time) (100 minutes) 头文件和宏 #include<iostream> #include<string> #include<vector> using namespace std; #define int long long #define fer(i,a,b) for(int ia;i<b;i…

【时间复杂度】

旋转数组 题目 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 /* 解题思路&#xff1a;使用三次逆转法&#xff0c;让数组旋转k次 1. 先整体逆转 // 1,2,3,4,5,6,7 // 7 6 5 4 3 2 1 2. 逆转子数组[0, k - 1] // 5 6 7 4 3…

Pytorch个人学习记录总结 03

目录 Transeforms的使用 常见的transforms Transeforms的使用 torchvision中的transeforms&#xff0c;主要是对图像进行变换&#xff08;预处理&#xff09;。from torchvision import transforms transeforms中常用的就是以下几种方法&#xff1a;&#xff08;Alt7可唤出…

多源BFS-- 矩阵距离

关于多源BFS&#xff0c;基本上就是单源BFS的简单升级了一下&#xff0c;比如在queue中队头开始时只有一个&#xff0c;我们通过这一个队头去推导其他的东西。而多源最短路就是队头一开始有1-n个可能的数&#xff0c;一个一个去BFS。 题目思路&#xff1a; 这个题就直接把所有的…

0成本搭建自己的云数据库

第一步&#xff0c;租免费的云服务器 www.aliyun.com 阿里云的&#xff0c;可以免费租三个月 进入主页后选择云服务器ESC 选择这款&#xff0c;点击试用就行 第二步&#xff0c;配置服务器 在配置服务器系统的时候选择centos&#xff0c;省事&#xff0c;别选ubuntu&#x…

[Spring] 三级缓存解决循环依赖详解

什么是循环依赖 注册一个bean对象的过程&#xff1a; Spring扫描class得到BeanDefinition – 根据得到的BeanDefinition去生成bean – 现根据class推断构造方法 – 根据推断出来的构造方法&#xff0c;反射&#xff0c;得到一个对象 – 填充初始对象中的属性(依赖注入) – 如果…