本文皆是作者工作学习中的理解或感悟,欢迎大家提出问题,一起讨论!!

一.问题提出

一般的主板上都带有两个网卡接口,linux系统启动后一般命名为eth0,eth1,当然如果我们不对eth0与eth1进行后期处理的话,每次开机eth0与eth1的位置也不会固定。所以当外置网卡时,更会出现端口混乱的问题(端口名与端口的pci位置不固定,每次启动都可能变换,内核对网络端口的命名顺序是根据检测到网卡的先后顺序来的),特别是不同驱动的网卡。

二.问题分析

1、首先我们需要了解内核给网络端口命名的执行流程:

  1)linux内核一般会在rc.sysinit里执行/sbin/udevd -d开始执行udev程序

  2)执行udev的过程中会检测所有设备,并根据不同的设备来加载不同的驱动

  3)加载完相应设备的驱动后,udev会收到一个该设备的内核事件,udev会根据相应的事件来匹配相应的规则,或者是执行某些脚本修改设备名重新书写规则(rules)

  4)当规则生成后,当再次产生此设备的内核事件时,则首先会匹配这些规则

  这里要注意udev的两点:

    1)我们可以通过udev来修改任何设备的名字

    2)在我们没修改名字之前,内核已经给给设备分配了名字(值得注意这点,否则修改的名字和内核给其他设备分配的名字冲突,则会修改失败)

2、不同的网卡设备

  目前为止我已知的网卡有如下几种(都是intel的):

   网卡型号          所用驱动

  8086:1502       e1000e

  8086:10d3       e1000e

  8086:150e       igb

  8086:105e       e1000e

  8086:1521       igb

  这只是我接触的几种网卡,不同种类的驱动对网卡端口的命名还是会有影响的

3.pci接口的bus id号

-bash-3.2# lspci -n -D | grep 0200
0000:00:19.0 0200: 8086:1502 (rev 05)
0000:01:00.0 0200: 8086:150e (rev 01)
0000:01:00.1 0200: 8086:150e (rev 01)
0000:01:00.2 0200: 8086:150e (rev 01)
0000:01:00.3 0200: 8086:150e (rev 01)
0000:03:00.0 0200: 8086:105e (rev 06)
0000:03:00.1 0200: 8086:105e (rev 06)
0000:04:00.0 0200: 8086:10d3

我们通过lspci -n -D可以查看所有的连在pci接口上的设备的busid号(第一列)和设备型号(最后一列)的对应列表,这里的0200代表的是网卡设备,通过大量的实验发现,无论网口的名字(eth*)怎么变化,在同一台机器上,他们的busid号是不变的。这里的8086:1502,8086:10d3是主板自带的两个端口,8086:150e是一个4口的Intel网卡,8086:105e是一个两口的intel网卡。由此,在这一型号的机器上,这一型号的网卡上,可已通过busid号,网卡型号来固定网口名。

三、问题处理

  1)首先我们在udev的一个和网络有关的规则文件里添加了如下代码:

    KERNEL=="eth*|ath*|wlan*|ra*|sta*", DRIVERS=="?*",IMPORT{program}="A.sh $attr{address} %b"

    当有网卡的内核事件的时候,会匹配这条规则,执行A.sh这个脚本,并且将mac地址($attr{address}),busid号(%b)作为参数传给脚本

  2)A.sh的功能就是根据mac地址和busid两个参数,来修改端口名,最终将新规则输出到一个新的规则文件B中。具体方法:

    a)先列出一个busid和网络端口名的对应表如下:

      0000:04:00.0 8086:10d3 eth0
      0000:00:19.0 8086:1502 eth1
      0000:01:00.0 8086:150e eth2
      0000:01:00.1 8086:150e eth3
      0000:01:00.2 8086:150e eth4
      0000:01:00.3 8086:150e eth5
      0000:03:00.0 8086:105e eth6
      0000:03:00.1 8086:105e eth7

    b)根据busid和这个表,来查找最终的端口名

    c)根据mac地址和最终的端口名,生成新的规则,如下:

    # PCI device 0x8086:0x150e (igb)
    BUS=="net", DRIVER=="?*", SYSFS{address}=="90:e2:ba:52:8e:b2", NAME="eth4"

    # PCI device 0x8086:0x1502 (e1000e)
    BUS=="net", DRIVER=="?*", SYSFS{address}=="0c:c4:7a:06:03:f3", NAME="eth1"

    # PCI device 0x8086:0x150e (igb)
    BUS=="net", DRIVER=="?*", SYSFS{address}=="90:e2:ba:52:8e:b3", NAME="eth5"

    # PCI device 0x8086:0x10d3 (e1000e)
    BUS=="net", DRIVER=="?*", SYSFS{address}=="0c:c4:7a:06:03:f2", NAME="eth0"

    # PCI device 0x8086:0x150e (igb)
    BUS=="net", DRIVER=="?*", SYSFS{address}=="90:e2:ba:52:8e:b0", NAME="eth2"

    #PCI device 0x8086:0x105e (e1000e)
    BUS=="net", DRIVER=="?*", SYSFS{address}=="68:05:ca:12:e0:c5", NAME="eth7"

    # PCI device 0x8086:0x150e (igb)
    BUS=="net", DRIVER=="?*", SYSFS{address}=="90:e2:ba:52:8e:b1", NAME="eth3"

    # PCI device 0x8086:0x105e (e1000e)
    BUS=="net", DRIVER=="?*", SYSFS{address}=="68:05:ca:12:e0:c4", NAME="eth6"

    d)之后的udev事件则通过规则B文件来匹配,故完成了重命名

  

  3)做完2之后,进行了大量的测试,发现存在了一个问题,概率很大:也就是重命名失败了,原因是和系统分配的端口名相同,起冲突了

    分析这个冲突问题:

      1)首先我们有三块网卡,两种驱动

      2)udev开启,扫描设备,加载驱动,内核给设备命名

      3)假如内核命名的eth0 驱动是e1000e,进入了udev的规则,我们要给它改成eth3

      4)但是在eth0进入udev没修改成eth3的时候,内核又将一个网络端口设备命名为eth3

      5)则我们将eth0修改为eth3的时候,就会冲突,eth0 变成了eth3_rename

  4)针对3)的问题,在init.d的网络服务启动之前(network),即在network脚本里靠前部分,加入一段代码,用于处理_rename问题。

    1)通过ifconfig查找当前的端口名(显示全部 加参数-a)

    2)通过1)查找的端口名和规则B进行比对,出现问题,则进行修改

四、以上就是对于外置网卡的处理过程,欢迎大家一起讨论。转载请注明出处!!http://www.cnblogs.com/yuzhaoxin/p/4083760.html

插入外置网卡端口顺序混乱--linux系统相关推荐

  1. hosts文件 端口_在Linux系统中使用Vim读写远程文件

    大家好,我是良许. 今天我们讨论一个 Vim 使用技巧--用 Vim 读写远程文件.要实现这个目的,我们需要使用到一个叫 netrw.vim 的插件.从 Vim 7.x 开始,netrw.vim 就被 ...

  2. linux怎么修改sftp默认端口,如何在 Linux 系统中如何更改 SFTP 端口

    SFTP(SSH文件传输协议)是一种安全文件协议,用于通过加密连接在两个主机之间传输文件. 它还允许您对远程文件执行各种文件操作并恢复文件传输. SFTP可以替代旧版FTP协议. 它具有FTP的所有功 ...

  3. linux多网卡bind发送数据,Linux系统多网卡绑定实战

    原标题:Linux系统多网卡绑定实战 纯手工打造每一篇开源资讯与技术干货,数十万程序员和Linuxer已经关注. 导读 对于服务器来说,网络设备的稳定也是比较重要的,特别是网卡.在生产型的系统中,网卡 ...

  4. linux重启网卡的命令行,linux系统重启网卡命令

    关于win10系统开机总是要禁用重启网卡才能联网如何解决就为大家介绍到这边了,有遇到同样情况的用户们可以采取上面的方法步骤来解决.问题2已知win7下不需要删除qos协议,在跑无盘模式下以前最好不要安 ...

  5. linux网卡端口绑定bond,Linux下双网卡绑定bond0

    一:原理: linux操作系统下双网卡绑定有七种模式.现在一般的企业都会使用双网卡接入,这样既能添加网络带宽,同时又能做相应的冗余,可以说是好处多多.而一般企业都会使用linux操作系统下自带的网卡绑 ...

  6. linux 扫描开放的端口命令,在Linux系统中检查(扫描)开放端口的方法

    无论是对网络连接问题进行故障排除还是配置防火墙,首先要检查的是在系统上实际打开的端口,本文介绍几种查找系统外部打开端口的方法,即在Linux系统中检查(扫描)开放端口. 什么是开放端口 侦听端口是应用 ...

  7. linux 查询usb端口名称,在Linux系统里识别USB设备名字的4种方法

    对于初学者来说,在 Linux 系统里你必须掌握的技术之一就是识别出插入系统里的各种设备.这也许是你的系统硬盘.外部的存储设备或者是可移动设备,比如 USB 设备或 SD 闪存卡等. 现如今,使用 U ...

  8. linux下开放sftp端口,如何在 Linux 系统中如何更改 SFTP 端口

    如何在 Linux 系统中如何更改 SFTP 端口 SFTP(SSH文件传输协议)是一种安全文件协议,用于通过加密连接在两个主机之间传输文件. 它还允许您对远程文件执行各种文件操作并恢复文件传输. S ...

  9. linux网卡ens33,如何解决Linux 系统下 ifconfig 命令无网络接口 ens33

    今天我在做Redis的哨兵集群模式的时候,以前都是好的,也不知道从什么时候开始就无法连接Redis服务器了,就是运行如下命令,没有效果:redis-server redis.conf,然后在通过命令查 ...

最新文章

  1. linux kill命令信号,linux kill命令详解
  2. 软件工程概论 课堂练习 第2次作业2【静态结构建模——画出相应对象模型】
  3. Could not find a suitable table factory for ‘org.apache.flink.table.factories.TableSinkFactory‘
  4. 20135206于佳心【家庭作业汇总】
  5. centos7 python3安装numpy_centos下pip3安装numpy
  6. 正则表达式5-分组突击
  7. C语言:编写一个程序,从键盘读入一个矩形的两个边的值(整数),求矩形面积
  8. android的adb命令总结
  9. HTTP中GET与POST的区别,99 %的人都理解错了
  10. 个人Web自动化测试学习点总结
  11. ai软件基础教程自学网,怎么快速学会ai软件
  12. pc机器人软件哪里买_买电脑,机器人仿真,3D建模软件,PLC程序,需要什么配置的电脑?...
  13. 电子邮件工作原理简介(个人整理)
  14. 英特尔oneAPI—开发生物序列聚类工具
  15. 判断无线网卡是否支持监听模式
  16. s5p6818 Smart6818 nanopi3开发板,uboot启动linux,配置nfs文件系统,设置bootargs
  17. oracle 中 的 =,oracle中=是什么意思
  18. K8S报错network is not ready: container runtime network not ready
  19. 寒门如何出贵子(摘抄)
  20. 首届 Rust China Hackathon Online 来啦!

热门文章

  1. 安信可Ai-WB1系列固件烧录指导
  2. 准备4个月过华为测试岗,拿个23k应该不多吧
  3. 【已解决】win10禁止更新-服务、组策略两步解决
  4. 直播带货app源码+搭建教程
  5. python异步任务
  6. 二进制表示浮点数_二进制数的浮点表示
  7. 响应式网站建设小程序开发网站模板源码
  8. Android 关于.9图设置拉伸区域无效问题
  9. autoware 激光-相机联合标定
  10. matlab之匿名函数