biosdevname网卡命名方式
在前天通过了最后的 Go/No-Go 会议后,Fedora 15 已定于下周正式发布,这个永远站在开源技术最前沿的发行版,即将迎来又一个新的大的变动。作为 Fedora 用户,相信你已经习惯了每个新版本的新功能所带来的种种不适,Fedora 15 也不会令你意外,它所采用的新的网卡命名方式 Consistent Network Device Naming (CNDN) 就是其中的一个。
比起 Fedora 15 的其它新功能,比如众所周知的 Gnome 3,CNDN 并不是一个多大的改动,但它所引起的争论以及带来的影响却不小,看看 NetworkWorld,LWN 以及 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网卡命名方式的更多相关文章
- CentOS7.3将网卡命名方式设置为传统方式
CentOS7.3将网卡命名方式设置为传统方式 生产环境可能拥有不同系列的操作系统,比如,既有CentOS6系列,也有CentOS7系列的系统,而CentOS6和CentOS7在网卡命名方面有着较大区 ...
- 01-Redhat/Centos7网卡命名介绍及修改方式
1. Redhat/Centos7网卡命名介绍 1.1 网络设备命名 Redhat/Centos7提供在网络接口中使用新的网络设备命名方法.这些功能会更改系统中的网络接口名称,以便定位和区分这些接口. ...
- CentOS 7 网卡命名修改为ethx格式
Linux 操作系统的网卡设备的传统命名方式是 eth0.eth1.eth2等,而 CentOS7 提供了不同的命名规则,默认是基于固件.拓扑.位置信息来分配.这样做的优点是命名全自动的.可预知的,缺 ...
- CentOS7网卡命名规则
CentOS6之前基于传统的命名方式如:eth1,eth0.... Centos7提供了不同的命名规则,默认是基于固件.拓扑.位置信息来分配.这样做的优点是命名是全自动的.可预知的,缺点是比eth0. ...
- centos7 网卡命名
CentOS6 及之前以太网网卡进行顺序命名的:多网卡如:eth0,eth1 依次.Centos7 则不同,命名规则默认是基于固件.拓扑.位置信息来分配.一.网卡命名的策略systemd对网络设备的命 ...
- CentOS 7 网卡命名修改为eth0格式
Linux 操作系统的网卡设备的传统命名方式是 eth0.eth1.eth2等,而 CentOS7 提供了不同的命名规则,默认是基于固件.拓扑.位置信息来分配.这样做的优点是命名全自动的.可预知的,缺 ...
- RHEL7网卡命名规则
systemd 和 udev 引入了一种新的网络设备命名方式:一致网络设备命名(CONSISTENT NETWORK DEVICE NAMING).根据固件.拓扑.位置信息来设置固定名字,带来的好处是 ...
- Linux网卡命名规则
网卡命名 一.为什么需要这个 服务器通常有多块网卡,有板载集成的,同时也有插在PCIe插槽的.Linux系统的命名原来是eth0,eth1这样的形式,但是这个编号往往不一定准确对应网卡接口的 ...
- linux centos7 修改默认网卡命名规则为eth0脚本
CentOS6之前基于传统的命名方式如:eth1,eth0.... Centos7提供了不同的命名规则,默认是基于固件.拓扑.位置信息来分配.这样做的优点是命名是全自动的.可预知的,缺点是比eth0. ...
随机推荐
- angular2-scroll-module
这篇介绍一下,写一个自己的angular2滚动监听插件 目录结构: /scrollModule: ztw-scroll.module.ts; scrollBind.directive.ts; scro ...
- ubuntu16.04 添加中文ibus输入法
ubuntu版本 16.04 在terminal 输入命令 sudo apt-get install ibus-pinyin sudo apt-get ibus-setup 设置 选择拼音,添加选择 ...
- Node.js小白开路(一)-- console篇
在所有内容的学习之中我们经常首先要接受到的常常很大一部分为命令行或是工具的内容展示,console内容为node.js在命令行中答应数据内容的一个途径. Console是nodejs中的元老级模块了. ...
- 【zzulioj-2115】乘积最大(区间dp)
题目描述 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得 ...
- Java基础摘要(一)
三大特性 封装 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是面向对象的特征之一,是对象和类概念的主要特性.简单的说,一 ...
- SurfaceView基本使用--动态画正弦函数
package com.zzw.TestSurfaceView; import android.content.Context; import android.graphics.Canvas; imp ...
- Qt中切换窗口功能的实现
两条语句就能够实现了: this->newNC.setWindowFlags(Qt::WindowStaysOnTopHint); this->newNC.show(); mark一下,防 ...
- FlashDevelop安装配置
1.下载 FlashDevelop,flash sdk,flash sdk debug,.net framework,java sdk(32位,不管机器是多少位,否则不能单步调试的) 2. 安装Fl ...
- linux中的阻塞机制及等待队列
阻塞与非阻塞是设备访问的两种方式.驱动程序需要提供阻塞(等待队列,中断)和非阻塞方式(轮询,异步通知)访问设备.在写阻塞与非阻塞的驱动程序时,经常用到等待队列. 一.阻塞与非阻塞 阻塞调用是没有获得资 ...
- pg_buffercache
查看缓冲区缓存的内容: create extension pg_buffercache; select c.relname, count(1) as buffers from pg_class c j ...