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

一.问题提出

一般的主板上都带有两个网卡接口,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. Linux 系统开启随机端口数量 调优

    Linux系统随机端口 默认Linux系统开启的随机端口范围为 32768 ~ 65535.客户端连接服务监听端口需要使用到随机端口连接. Linux系统随机端口调优 1.添加内核配置参数:/etc/ ...

  2. ping通windows下虚拟机上的linux系统

    直接ping  linux的ip 直接就失败了. 现在我的windows有两个虚拟网卡 接下来让linux使用VMnet8网卡 修改我的linux系统下的lo网卡的ip地址为VMnet8的ip地址 现 ...

  3. Linux 系统分级及root权限相关

    单用户模式修改用户密码 救援模式 让我们先来了解一下linux的运行步骤 1. Linux系统引导的顺序掌握Linux系统引导的顺序:BIOSMBRKernelinit其中,BIOS的工作是检查计算机 ...

  4. Kali Linux破解wifi密码(无须外置网卡)

    环境准备:  方式一(选择该方式):Kali Linux.笔记本一台.U盘(至少8G)  方式二:Kali Linux.外置网卡.笔记本一台.VM   特别说明,主要是使用方式一进行破解,如果有外置网 ...

  5. 在CentOS Linux系统上,添加新的端口,启用ssh服务

    SSH作为Linux远程连接重要的方式,如何配置安装linux系统的SSH服务,如何开启SSH? SSH是什么? SSH 为 Secure Shell 由 IETF 的网络工作小组(Network W ...

  6. centos linux系统日常管理复习 CPU物理数逻辑核数,iftop ,iotop ,sar ,ps,netstat ,一网卡多IP,mii-tool 连接,ethtool速率,一个网卡配置多个IP,mii-tool 连接,ethtool速率 ,crontab备份, 第十八节课

    centos linux系统日常管理复习 物理CPU和每颗CPU的逻辑核数,uptime ,w,vmstat,iftop ,iotop ,sar ,ps,netstat ,一个网卡配置多个IP,mii ...

  7. 由安装两块网卡的linux系统中引起网络不通想到的

    由安装两块网卡的linux系统中引起网络不通想到的 一天,小王突然急匆匆的来找我,他说:"我在机子上刚装的redhat怎么老也ping不通服务器,我网卡的驱动都安装了,ping 自己的两块网 ...

  8. linux系统telnet端口不通能收到SYN但不回SYN+ACK响应问题排查(转载)

    linux系统telnet端口不通能收到SYN但不回SYN+ACK响应问题排查 一:背景:一台机器从公司办公网登录不上且所有tcp端口都telnet不通,但是通过同机房同的其它机器却可以正常访问到出问 ...

  9. Linux系统nmtui/nmcli绑定双网卡为team

    今天给大家带来图形化界面网络配置工具—nmtui的使用方法,可以省去敲命令的繁琐,较少误操作,结果更加直观. 小知识: nmtui:Network Manager Text User Interfac ...

随机推荐

  1. #PHP# 华为云 API 方式发送短信

    使用给华为云 消息 服务 API 方式发送短信 代码来自华为云,已通过测试 <?php /** * 华为云发送短信示例代码 * 本段代码需要使用自己的配置信息才能正常运行,出配置信息外,不需要改 ...

  2. 13.Reflect

    1.概述 Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API.Reflect对象的设计目的有这样几个. (1) 将Object对象的一些明显属于语言内部的方法(比如O ...

  3. First Android application

    In eclipse ADT : 1.创建一个新工程 File -> New -> Android Application Project 2.三个主要的文件 /src/MainActiv ...

  4. 剑指offer(31-35)编程题

    整数中1出现的次数(从1到n整数中1出现的次数) 把数组排成最小的数 丑数 第一个只出现一次的字符位置 数组中的逆序 31.求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数 ...

  5. IDEA 启动项目,tomcat中配置的虚拟路径无法使用

    有时候,使用idea启动项目,非动静分离项目,直接根据图片url地址显示图片,会发现图片无法显示,tomcat中配置的虚拟路径无法使用,这时候需要配置idea.选择路径,然后给与一个访问名就行了.

  6. CentOS7手动修改系统时间

    CentOS7 永久修改系统时间 安装在虚拟机上的CentOS7的时间分为系统时间和硬件时间.二者都修改,重启系统(init 6 )才会永久生效.修改步骤如下 查看当前系统时间 date    修改当 ...

  7. Python制作回合制手游外挂简单教程(中)

    接着上篇的博文,今天我们讲如何实现自动组队刷道 引入: 自动组队刷道的流程是先点击刷道按钮.再点击前往按钮.再点击便捷组队······ 这些操作上篇博文已经告诉我们怎么做了,利用picpick丈量坐标 ...

  8. 航空公司客户价值分析(KMeans聚类)

    PS.图片可能不清楚,代码 数据集都在 https://github.com/xubin97/Data-Mining_exp1 项目介绍: 本案例的目标是客户价值识别,通过航空公司客户数据识别不同价值 ...

  9. UEditor图片焦点错位,火狐document.body.scrollTop不管用的问题

    转自 http://liyunpeng.iteye.com/blog/2068751 关于 document.body.scrollTop 在火狐浏览器中不管用的问题 看网上有人写通过判断docume ...

  10. Spring.Net---4、IoC/DI注入方式

    spring.net里实现了控制反转IOC(Inversion of control),也即依赖注入DI(Dependency Injection),以达到解耦的目的,实现模块的组件化.程序在调用sp ...