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

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

一.问题提出

一般的主板上都带有两个网卡接口,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

时间: 2024-07-29 10:23:24

插入外置网卡端口顺序混乱--linux系统的相关文章

《Linux系统静态路由和火墙路由》

本篇主要写的是关于静态路由表的添加,和如何让你不能上网的主机通过火墙路由表实现上网的功能. 静态路由表: 要是你的主机是2块网卡,并且做了网卡的绑定,依照我下面的方法是成功不了的,你可以去编辑: # vim /etc/rc.d/rc.local ip route add 12.0.0.1/24 via 192.168.1.113 sh /etc/rc.d/rc.local        //这样做就行了 下面我们来看常规的路由表的添加: 我的系统默认的路由表. 下面添加一块路由表:这样的添加只是

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

直接ping  linux的ip 直接就失败了. 现在我的windows有两个虚拟网卡 接下来让linux使用VMnet8网卡 修改我的linux系统下的lo网卡的ip地址为VMnet8的ip地址 现在ping就可以了 没有什么路由包的缓慢问题,时间非常短. 版权声明:本文为博主原创文章,未经博主允许不得转载.

linux系统防火墙相关问题及常用命令介绍

今天介绍关于linux系统防火墙:centos5.centos6.redhat6系统自带的是iptables防火墙,centos7.redhat7自带firewall防火墙,ubuntu系统使用的是ufw防火墙.本平台www.gxdeqiong.com 安装的是iptables防火墙(其他云服务供应商可能使用的是其他防火墙). 防火墙导致服务不正常的问题: 在服务器安装某些服务之后,服务无法连接.无法正常启动等情况.查看下系统防火墙有没开放相关的服务端口.(linux系统防火墙开放相关端口后还要

老男孩教育每日一题-2017年5月11-基础知识点: linux系统中监听端口概念是什么?

1.题目 老男孩教育每日一题-2017年5月11-基础知识点:linux系统中监听端口概念是什么? 2.参考答案 监听端口的概念涉及到网络概念与TCP状态集转化概念,可能比较复杂不便理解,可以按照下图简单进行理解? 将整个服务器操作系统比喻作为一个别墅 服务器上的每一个网卡比作是别墅中每间房间 服务器网卡上配置的IP地址比喻作为房间中每个人 而房间里面人的耳朵就好比是监听的端口 当默认采用监听0.0.0.0地址时,表示房间中的每个人都竖起耳朵等待别墅外面的人呼唤当别墅外面的用户向房间1的人呼喊时

linux系统双网卡绑定

linux系统做双网卡绑定,经过实验得出以下步骤 系统版本:CentOSrelease 6.8 (Final) 系统内核版本:2.6.32-642.el6.x86_64 1.1网卡配置如下 cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=dhcp cat /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 ONBOOT=yes BO

超好用linux系统查询网卡等流量参数的工具,分享给大家!!!

超好用linux系统查询网卡等流量参数的工具,分享给大家!!! 工作中大家或许会遇到这类情况:托管服务器流量超出限额,可是突然又不能像windows主机那样通过QQ管家或者360卫士等软件工具那样很直观的测出服务器的实时网卡进出口流量,那么福利来了!   linux查看网卡流量六种方法(本人使用Centos 6.4系统) 方法一.nload工具 wget http://heanet.dl.sourceforge.net/project/nload/nload/0.7.2/nload-0.7.2.

保证Linux系统安全之firewalld防火墙配置地址伪装和端口转发详解

通过保证Linux系统安全之firewalld防火墙入门详解认识Linux系统firewalld防火墙,并可以编写一些相对简单一些的防火墙规则.Linux防火墙可以充当路由器(网关).路由器上的NAT技术,同样可以通过Linux防火墙来实现.地址伪装和端口转发说白了就是路由器中的NAT技术. 一.地址伪装和端口转发简介 firewalld防火墙支持两种类型的NAT: (1)地址伪装 地址伪装:基于源地址进行转换,通过地址伪装,NAT设备将经过设备的数据包转发到指定接收方,同时将通过的数据包的源地

Linux系统的相关知识、常用命令及拓展、centos 7网卡配置

一.Linux系统的相关知识 1.Linux中根目录下所有文件夹的含义和用途 目录 功能 /bin 存放可执行文件 /dev 存放设备文件 (如:网卡.CPU) /media 存放可移除设备文件 (如:U盘.CD/DVD.VMTools) /opt 存放第三方软件的默认位置 /tmp  存放临时文件 (如:日志文件) /root root用户的家目录,主文件夹 /home 普通用户的家目录,文件夹的命名是以用户的名字来命名的 /etc 存放配置文件 /usr 存放操作系统软件资源 /var 存放

linux系统做双网卡绑定

linux系统双网卡绑定: 在做双网卡绑定之前一定要备份配置文件! linux系统网卡配置文件位置:cd /etc/sysconfig/network-scripts cp ifcfg-eth0  ifcfg-bond0 例如我们需要绑定的网卡分别是ifcfg-eth0 对应eth0   ifcfg-eth1 对应eth1  这两个网卡! #vi ifcfg-bond0 需要修改四个地方:1.设备名称:DEVICE=bond0 2.配置IP地址,掩码,网关等信息:IPADDR=1.1.1.1NE