免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 36482 | 回复: 64
打印 上一主题 下一主题

多网卡识别顺序的问题【解决方法见1楼】 [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-10 11:10 |只看该作者 |倒序浏览
本帖最后由 Godbach 于 2011-05-06 11:58 编辑

--------------
解决方法一:
ACTION=="add", SUBSYSTEM=="net", IMPORT{program}="/lib/udev/rename_device"
SUBSYSTEM=="net", RUN+="/etc/sysconfig/network-scripts/net.hotplug"
DRIVER=="e1000",ID=="0000:02:02.0",NAME="eth1"

如上面蓝色一行所示,将 drivername ,pci-id, 显示的名字做一个对应,就可以了。
初步测试没有问题。

解决方法二:
将网卡的真实 MAC 地址写入网卡的静态配置文件中 ifcfg-ethX,添加一行内容:
HWADDR=xx:xx:xx:xx:xx:xx
其中,xx:xx:xx:xx:xx:xx 为网卡的 MAC 地址


参考文档
Dell 工程师提供的方法: Linux_Enumeration_of_NICs.pdf (43.81 KB, 下载次数: 419)
Ethernet-HOWTO: Ethernet-HOWTO.pdf (311.33 KB, 下载次数: 468)

----------------
Linux系统,4张网卡,两张 82576的,两张 82571EB 的。
01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
04:00.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
04:00.1 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)


初始安装的系统是CentOS 5.5,内核版本是2.6.18-194.el5xen
/etc/modprobe.conf 文件中关于网卡的内容如下:
alias eth0 igb
alias eth1 igb
alias eth2 e1000e
alias eth3 e1000e

可见两张 82576 网卡对应 eth0 和 eth1,均使用 igb 驱动。
两张 82571EB 网卡对应 eth2 和 eth3,均使用 e1000e 驱动。

这里我重新制作了内核安装包,使用 2.6.24 的内核。由于该版本内核并没有 igb 驱动。我从 intel 官方下载 igb 驱动,并移植到内核中。
但是进入 2.6.24 的内核下,发现 eth2 网卡没有启动。
同时,检查其他三张网卡:
[root@xxx ~]# ethtool -i eth0
driver: igb
version: 2.4.8
firmware-version: 1.4-3
bus-info: 0000:01:00.0
[root@xxx ~]# ethtool -i eth1
driver: e1000
version: 7.3.20-k2-NAPI
firmware-version: 5.6-2
bus-info: 0000:04:00.1
[root@xxx ~]# ethtool -i eth3
driver: igb
version: 2.4.8
firmware-version: 1.4-3
bus-info: 0000:01:00.1
发现 eth0 和 eth3 使用的 igb 驱动,eth2 使用了 e1000 驱动。而且根据 bus-info 可以看出,新的内核下,对四张网卡识别的顺序和安装的发行版上有所不同。

同时,查看 /proc/net/dev
Inter-|   Receive                                                |  Transmit
face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:7476419692 1424305    0    0    0     0          0         0 7476419692 1424305    0    0    0     0       0          0
__tmp358702611:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
  eth1:51413066439 479078418    0  536    0     0          0         1 1146871974797 787610625    0    0    0     0       0          0
  eth0: 1825946   30420    0    0    0     0          0         0     1182      23    0    0    0     0       0          0
  eth3:48131386965 459275416    0    0    0     0          0         0 1147067104897 789553247    0    0    0     0       0          0
bond0:99544453404 938353834    0  536    0     0          0         1 2293939079694 1577163872    0    0    0     0       0          0

发现有一个 __tmp 开头的接口。我怀疑应该是 eth2,只是没有别正确识别。
另外,常见的 /proc/net/dev 是按照 eth 的编号顺序显示的,这里也发生变化了。
请大家帮忙看一下是什么原因。

论坛徽章:
0
2 [报告]
发表于 2010-12-10 11:16 |只看该作者
参考:
使用linux系统时会出现这样的情况,当你安装了某个网卡的驱动程序时,或者安装了与网卡相关的程序后。

网卡会出现所谓的漂移现象。(注意:不是飘逸)。可能的表象为:

(1):网卡顺序颠倒,比如之前你的网线连接的网口为eth0,当安装某个网卡的驱动后,可能它的名字变为eth0或者eth3,等等情况。

(2):网卡名字改变,这种情况倒不是eth0到eth1的改变,而是很诡异的变化,比如eth0找不到了,多了个网卡名字叫 __tmp3183921382193__

这个确实让人很恼火。因为有人可能会通过ifconfig | grep eth来获取信息从而完成一些开发工作,如果网卡名字变得乌七八糟了,程序肯定会出错。

(3):光口网卡和电口网卡顺序乱了,或者交叉。

总之我们的目的就是:能够指定某个网卡的名字为我们想要的物理设备。做法如下:

第一步,识别谁是谁。

要使用网卡,首现要知道哪个名字对应的哪个物理设备,做法为:从交换机拉一根网线,从上到下挨个接到网卡上面,注意每次只能接一个网卡,接上后通过ethtool命令来查看是否连着网线,比如

[root@AS5 ~]# ethtool eth0
Settings for eth0:
Supported ports: [ MII ]
Supported link modes:   10baseT/Half 10baseT/Full
                         100baseT/Half 100baseT/Full
                         1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes:  10baseT/Half 10baseT/Full
                         100baseT/Half 100baseT/Full
                         1000baseT/Full
Advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: MII
PHYAD: 2
Transceiver: external
Auto-negotiation: on
Supports Wake-on: g
Wake-on: d
Link detected: yes

看到了eth0的状态为连接着网线。如果Linked detected:no,则说明没有连接网线。

如此区分开哪个设备的名字是什么,标注好。

第二步:获取每个网卡的MAC地址

ifconfig -a能看到所有网络设备。

通过 ifconfig -a | grep HWaddr 来获取每个设备的MAC地址。

比如:

[root@AS5 ~]# ifconfig  -a | grep HWaddr
eth0      Link encap:Ethernet  HWaddr 00:30:48:7F:B5:CA
eth1      Link encap:Ethernet  HWaddr 00:30:48:7F:B5:CB
eth2      Link encap:Ethernet  HWaddr 00:04:23:A6:81:E0
eth3      Link encap:Ethernet  HWaddr 00:04:23:A6:81:E1

拿到了每个网卡的MAC地址。

第三步:进行MAC和网卡名称绑定。

我们都知道,对于RedHat的系统,网络的配置文件在:/etc/sysconfig/network-scripts/ifcfg-ethX

中存着,N=0,1,2。。。

比如:root@AS5 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
# nVidia Corporation MCP55 Ethernet
DEVICE=eth0
ONBOOT=yes
HWADDR=00:30:48:7f:b5:ca
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=192.168.42.231
GATEWAY=192.168.42.1
BOOTPROTO=static
#NAMESERVER=202.106.0.20

这个文件是对网卡进行初始化的配置文件。

比如如果我们想指定网卡MAC地址为MAC1的设备名称为ethn,那么,修改文件

/etc/sysconfig/network-scripts/ifcfg-ethn

在里面添加MAC地址绑定和名字的配置信息

DEVICE=ethn

HWADDR=MAC1(比如00:30:48:7f:b5:ca)

其它配置信息不受影响。

当对所有网卡实现绑定后,reboot系统,应该就可以了。

还有一点需要注意,就是驱动对应关系的文件:

/etc/modprobe.conf

要在该文件中修改,确保某个设备使用的就是对应它的驱动,比如:

cat /etc/modprobe.conf
alias eth0 forcedeth
alias eth1 forcedeth
alias scsi_hostadapter aic79xx
alias scsi_hostadapter1 sata_nv
alias scsi_hostadapter2 usb-storage
alias eth2 e1000
alias eth3 e1000

说明eth0和eth1用的forcedeth的驱动,eth2和eth3用的是e1000的驱动。

评分

参与人数 1可用积分 +30 收起 理由
Godbach + 30 非常感谢

查看全部评分

论坛徽章:
381
CU十二周年纪念徽章
日期:2014-01-04 22:46:58CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52CU大牛徽章
日期:2013-03-14 14:08:55CU大牛徽章
日期:2013-04-17 11:17:19CU大牛徽章
日期:2013-04-17 11:17:32CU大牛徽章
日期:2013-04-17 11:17:37CU大牛徽章
日期:2013-04-17 11:17:42CU大牛徽章
日期:2013-04-17 11:17:47CU大牛徽章
日期:2013-04-17 11:17:52CU大牛徽章
日期:2013-04-17 11:17:56
3 [报告]
发表于 2010-12-10 11:19 |只看该作者
2楼的回帖太明了了,收藏备用

论坛徽章:
0
4 [报告]
发表于 2010-12-10 11:21 |只看该作者
受教了,我也MARK一下,有时候我也遇到过这样的问题

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2010-12-10 11:22 |只看该作者
duanjigang 兄的资料非常实用啊,谢谢。

BTW,duanjigang 有没研究过这种现象的深层次的原因啊

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
6 [报告]
发表于 2010-12-10 11:31 |只看该作者
duan 兄的回复,也让我想起来了,以前的设备有更多网卡的情况下,生产系统时,有一个步骤就是要处理网卡顺序的工作。
本以为四张网卡不容易乱序,结果也出现了。

论坛徽章:
0
7 [报告]
发表于 2010-12-10 12:34 |只看该作者
duanjigang 兄的资料非常实用啊,谢谢。

BTW,duanjigang 有没研究过这种现象的深层次的原因啊
Godbach 发表于 2010-12-10 11:22



    呵呵,我觉得通过内核代码的修改应该能正确处理网卡的乱序问题,最起码能够让它不出现随机名字。
我还没亲自研究这个代码,但是以前看过ifup和ifdown触发的那几个内核消息处理函数,不知道是不是在这块能做文章?抑或是register_netdevice那块能解决。
首要问题应该是搞清楚系统识别网卡,加载网卡配置的步骤吧

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
8 [报告]
发表于 2010-12-10 12:39 |只看该作者
这个可能是pci枚举时, 深度优先 or 广度优先造成的不同。

boot时加参数可以指定枚举用的方式。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
9 [报告]
发表于 2010-12-10 12:43 |只看该作者
回复 7# duanjigang
嗯,有时间了研究一下内核代码

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
10 [报告]
发表于 2010-12-10 12:44 |只看该作者
这个可能是pci枚举时, 深度优先 or 广度优先造成的不同。

boot时加参数可以指定枚举用的方式。

多谢提示。

如果我没有指定 boot 的参数。两个不同的内核版本,有没有可能使用不同的枚举方式
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP