在前天通过了最后的 Go/No-Go 会议后,Fedora 15 已定于下周正式发布,这个永远站在开源技术最前沿的发行版,即将迎来又一个新的大的变动。作为 Fedora 用户,相信你已经习惯了每个新版本的新功能所带来的种种不适,Fedora 15 也不会令你意外,它所采用的新的网卡命名方式 Consistent Network Device Naming (CNDN) 就是其中的一个。

比起 Fedora 15 的其它新功能,比如众所周知的 Gnome 3,CNDN 并不是一个多大的改动,但它所引起的争论以及带来的影响却不小,看看 NetworkWorldLWN 以及 Slashdot 上铺天盖地的争论,质疑甚至嘲讽你就知道了。当然这并不表示 CNDN 这个新功能就完全一无是处,或者是画蛇添足。CNDN 还是有一定的益处,前提是你深入理解了作者的意图。现在让我们来仔细看看这个即将影响你日常 Linux 生活的新的网卡命名方式。

具体的命名方式之前已经介绍过,这里不再赘述,需要说明一点的是这个命名方式依赖于机器的 BIOS,如果你的机器比较旧,那么安装后的 Fedora 15 仍然会采用 ethX 的命名规则,并且新的命名规则只适用于有线网卡。

我在 4 个不同的环境中安装了 Fedora 15,得到了不同的结果。在一台 Dell 台式机上,网卡被命名为 em1;在一台稍旧的 hp 笔记本上,网卡仍然命名为 eth0;在 VirtualBox 4.0 虚拟机里,两块虚拟网卡分别被命名为 p2p1 与 p7p1;在 KVM 虚拟机里,网卡仍然被命名为 eth0。现在你是不是觉得这个命名方式应该叫 Inconsistent,而不是 Consistent。

当然任何处于过渡期的新功能都不可避免的会有这样不一致的现象,CNDN 这里的 Consistent 指的也并不是不同的硬件类型都 Consistent,而是在 BIOS 支持的机器上,网卡的命名将一致,最主要的命名规则是两条,主板内置的网卡将变成 emX,外插到 PCI 卡槽上的网卡将变成 pXpX,所有的数字都从 1 开始。

除了名字的字符串前缀与以前不一样以外(这一点你将在接下来的 Linux 生活中不断去适应,如果你习惯于使用 ifconfig, tcpdump 等命令行工具的话),更重要的是网卡的命名依据也将改变,网卡的名字不再与网卡的 MAC 地址绑定,而是依据网卡在主板上的位置。

在 CNDN 出现之前,可以说网卡的命名经历了几个阶段,不过在讲述这些命名方式之前,需要先指出的一点是 Kernel 内部对网卡的命名方式一直未变,那就是先探测到的网卡被命名为 eth0,其次是 eth1 等等,当然 Kernel 探测网卡的顺序结果也不是一成不变的,如果相关的硬件发生了变化的话,Kernel 探测的顺序结果也可能会改变,不过硬件不变(或者硬件型号不变)的情况下,探测顺序通常是不变的。

在 udev 出现之前(RHEL 4 或更早?),RedHat 系列对网卡的命名是简单的,在 /etc/modprobe.conf 文件里会有类似下面这样的配置:

alias eth0 e100
alias eth1 3c59x
...

modprobe.conf 配置文件并不是对网卡的名字进行修改,而是控制 Kernel 加载网卡驱动的顺序,当然也就控制了 Kernel 探测网卡的顺序,从而变相固定了网卡的名字。你可以看出这种方法只对那些不同网卡属于不同驱动的硬件配置有效,如果一个驱动对应多块网卡,则顺序就无法这 样确定了。如果 Kernel 某次启动改变了某块网卡的探测顺序,那么 RHEL 系统是否会对该网卡进行重命名,从而可以继续使用之前的网卡配置文件,我已经记不清了。

到了 RHEL 5 系列之后,udev 已经引入,此时主流的发行版都会根据网卡的 MAC 地址使用 udev 对网卡设备进行命名以确保网卡的名字不会变动。举例来说,假设一个系统有两块网卡 eth0 与 eth1,如果将两块网卡调各个,系统启动后,虽然 Kernel 内部对网卡的命名发生了改变(这里假设两块网卡由相同驱动加载),即原来的 eth0 变成了 eth1,eth1 变成了 eth0,但 /etc/udev/rules.d/60-net.rules 文件会调用 /lib/udev/rename_device 对网卡进行命名,而 rename_device 会搜索系统里的网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-eth*,如果该网卡的 MAC 地址匹配到某个配置文件中的 HWADDR 项,就将网卡命名为该文件中的 DEVICE 项。此时用 ip addr 命令查看,你会发现每块网卡仍然使用与之前相同的名字,并且 IP 地址也与之前相同,只不过 ip addr 命令的输出会将 eth1列在前面,因为 eth1 在 Kernel 内部对应的名字是 eth0。

当然这样的情况并不常见,没有人会闲得蛋疼去交换两块网卡玩。常见的与网卡名字相关的情况是替换其中的某块网卡,比如将某个虚拟机映像拷到另一个虚 拟机 Host 里,此时就相当于将网卡替换。在 RHEL 5 里,系统启动后,你会发现替换后的网卡名字未变,但网卡配置变成了 DHCP,原来的配置文件自动保存为 /etc/sysconfig/network-scripts/ifcfg-ethX.bak。名字未变是因为 rename_device 未找到 MAC 地址对应的配置文件,所以保留该名字与 Kernel 里的名字一致(当然这里还有一个前提是网卡的型号未变,并且 Kernel 的探测顺序也未变,大部分情况都是这样的),至于配置文件改变则是 Kudzu 造成的,Kudzu 会检测硬件,并对新添加的网卡默认生成 DHCP 配置,当然这里与网卡命名无关了。

到了 RHEL 6 后,仍然使用 udev 对网卡进行命名,所以原理上对网卡进行命名的方式未变,不过 udev 的规则有了一些改变,变成了 /etc/udev/rules.d/70-persistent-net.rules。该文件由 /lib/udev/write_net_rules 在每次启动时生成,里面的内容与如下类似:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:be:19:20", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

也就是说不管 Kernel 启动时检测到的网卡顺序如何,udev 都会按照该文件里 MAC 地址对应的名字对网卡进行命名。如果某块网卡被替换了,那么在启动时 /lib/udev/write_net_rules 会更新该 70-persistent-net.rules 文件,更新的方式并不是将该行里的 MAC 地址修改为新网卡的 MAC 地址,而是在该文件后面附上新的一行,并生成一个新的网卡名字,此时用 ip 命令查看,你会发现网卡名字变成了 eth1。

现在我们来看看 CNDN 是怎么命名的,CNDN 的原理其实很简单,它仍然采用了 udev 的机制,只不过将 70-persistent-net.rules 文件去掉,换成了 /lib/udev/rules.d/71-biosdevname.rules 文件,71-biosdevname.rules 比起 70-persistent-net.rules 文件要稍微复杂点,但也无非就是调用 biosdevname,并根据该命令的输出对网卡进行相应的命名。biosdevname 内部则调用了 dmidecode 等 BIOS 工具来获取 PCI 号等 BIOS 信息,从而为网卡取一个有意义(但愿如此)的名字,比如 em1 表示网卡内置在主板上,p2p1 表示 PCI 第二个插槽的网卡上的第一个口,还有其它更特殊的命名方式等等。

CNDN 对于那些每天与包含 N 个网卡设备打交道的人来说是一个福音,这会减轻他们在辨别网卡名字所对应的物理网卡时的痛苦。但对于普通用户来说,即使你某天心血来潮买了个包含四块网卡 的 Dell 服务器,即使你知道 em1 对应的是第一块内置网卡,你也很难从服务器的后面板上区分出哪块网卡是第一块内置网卡。

不过由于 CNDN 的命名方式不再将网卡名字与 MAC 地址绑定,那么上面所说的那种替换网卡的问题也许会得到解决,即如果将某块网卡替换,那么系统在包含新的网卡启动之后,应该不需要做任何网卡配置上的改 动,就能保持与之前网卡相同的网络设置。不过目前这一点还做不到,因为 /etc/sysconfig/network-scripts/ifcfg-ethX 里的 HWADDR 选项还在。不清楚 Fedora 15 或者后继版本是否会将 HWADDR 从生成的网卡配置中去掉,或者说这种需求根本就不是一个正常的需求?

最后,如果你无法忍受这个新的憋八的命名方式,你仍然可以回退到之前的命名方式。在 Kernel 的启动参数里加上 biosdevname=0 ,系统在下次启动时会为你生成熟悉的 70-persistent-net.rules 文件,由于该文件在 /etc/udev/rules.d 下,所以优先级要比在 /lib/udev/rules.d/ 下的 71-biosdevname.rules 文件高。如果哪天你又想再回来试试该命名方式,只需将 Kernel 的 biosdevname 参数置成 1,同时不要忘了将 70-persistent-net.rules 文件删掉。

biosdevname网卡命名方式的更多相关文章

  1. CentOS7.3将网卡命名方式设置为传统方式

    CentOS7.3将网卡命名方式设置为传统方式 生产环境可能拥有不同系列的操作系统,比如,既有CentOS6系列,也有CentOS7系列的系统,而CentOS6和CentOS7在网卡命名方面有着较大区 ...

  2. 01-Redhat/Centos7网卡命名介绍及修改方式

    1. Redhat/Centos7网卡命名介绍 1.1 网络设备命名 Redhat/Centos7提供在网络接口中使用新的网络设备命名方法.这些功能会更改系统中的网络接口名称,以便定位和区分这些接口. ...

  3. CentOS 7 网卡命名修改为ethx格式

    Linux 操作系统的网卡设备的传统命名方式是 eth0.eth1.eth2等,而 CentOS7 提供了不同的命名规则,默认是基于固件.拓扑.位置信息来分配.这样做的优点是命名全自动的.可预知的,缺 ...

  4. CentOS7网卡命名规则

    CentOS6之前基于传统的命名方式如:eth1,eth0.... Centos7提供了不同的命名规则,默认是基于固件.拓扑.位置信息来分配.这样做的优点是命名是全自动的.可预知的,缺点是比eth0. ...

  5. centos7 网卡命名

    CentOS6 及之前以太网网卡进行顺序命名的:多网卡如:eth0,eth1 依次.Centos7 则不同,命名规则默认是基于固件.拓扑.位置信息来分配.一.网卡命名的策略systemd对网络设备的命 ...

  6. CentOS 7 网卡命名修改为eth0格式

    Linux 操作系统的网卡设备的传统命名方式是 eth0.eth1.eth2等,而 CentOS7 提供了不同的命名规则,默认是基于固件.拓扑.位置信息来分配.这样做的优点是命名全自动的.可预知的,缺 ...

  7. RHEL7网卡命名规则

    systemd 和 udev 引入了一种新的网络设备命名方式:一致网络设备命名(CONSISTENT NETWORK DEVICE NAMING).根据固件.拓扑.位置信息来设置固定名字,带来的好处是 ...

  8. Linux网卡命名规则

    网卡命名 一.为什么需要这个      服务器通常有多块网卡,有板载集成的,同时也有插在PCIe插槽的.Linux系统的命名原来是eth0,eth1这样的形式,但是这个编号往往不一定准确对应网卡接口的 ...

  9. linux centos7 修改默认网卡命名规则为eth0脚本

    CentOS6之前基于传统的命名方式如:eth1,eth0.... Centos7提供了不同的命名规则,默认是基于固件.拓扑.位置信息来分配.这样做的优点是命名是全自动的.可预知的,缺点是比eth0. ...

随机推荐

  1. Eclipse_下载地址

    1. http://www.eclipse.org/downloads/ http://www.eclipse.org/downloads/packages/ http://archive.eclip ...

  2. 【C#笔札】1 string类型

    C中没有string这个类型,而是用字符串数组来实现,相对来说比较麻烦. LABVIEW相对来说要简单太多,毕竟他主要的精力集中在硬件控制上,软件操作方面极其简单. C#类似,C#中有System.S ...

  3. storm 入门介绍(持续更新)

    storm的集群表面上看和hadoop的集群非常像.但是在Hadoop上面你运行的是MapReduce的Job, 而在Storm上面你运行的是Topology.它们是非常不一样的 — 一个关键的区别是 ...

  4. java中商业数据计算时用到的类BigDecimal和DecimalFormat

    1.引言 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确 ...

  5. 利用 localStorage 储存css js

    链接  版本号, 可以后台输出到jsp页面上 移动端webapp值得一试: 兼容性好 网速慢,LS读取+eval大多数情况下快于304 webapp不需要seo,css也可以缓存,再通过js加载 浏览 ...

  6. Android以root起一个process[shell脚本的方法]

    有时候我们写的app要用uid=0的方式启动一个process,framework层和app层是做不到的,只有通过写脚本,利用am来实现.下面是具体步骤: 1.创建一个包含Main()方法Java p ...

  7. C#当中利用Attribute实现简易AOP

    首先看一段简单的代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } //来自UI层的调用 ...

  8. File I|O(八)

    1.I/O:input/output 1.1.java.io.File 表示:文件或者文件夹(目录) File f=new File("文件路径") 注意:相对路径:非web项目的 ...

  9. 解决AndroidStudio导入项目在 Building gradle project info 一直卡住

    Android Studio导入项目的时候,一直卡在Building gradle project info这一步,主要原因还是因为被墙的结果.gradle官网虽然可以访问,但是速度连蜗牛都赶不上.. ...

  10. tf随笔-1

    生成新的计算图,并完成常量初始化,在新的计算 图中完成加法计算 import tensorflow as tf g1=tf.Graph() with g1.as_default(): value=[1 ...