最 近,笔者需要使用VM软 件(VMware Workstation)虚拟多台Linux操作系统服务器进行集群测试(本文采用Centos 6.0操作系统为例),虚拟机使用Host-only网络模式进行连接。在对各主机配置完IP地址后,发现虚拟机与宿主机(笔者的电脑)之间通讯正常,但各虚拟机之间却不通。在虚拟机中,使用ifconfig命令显示网络接口卡配置情况,发现自己犯了一个低级错误,虽然各虚拟机的IP地址是同一局域网段的不同IP地址,但网卡的HWADDR地址却全部相同,都是“00:0C:29:10:AC:71”。根据OSI七层模型,以太网中网络底层通信是二层硬件地址之间的通信,因此当HWADDR相同时,各虚拟机之间由于地址冲突,当然无法通信。
图1 重启网络服务后的报错信息
那么为什么这些虚拟机的HWADDR地址都是相同的呢?原来由于需要多台虚拟服务器进行测试,笔者为省事就直接对虚拟机文件进行了拷贝,“克隆”了多台虚拟服务器,这种做法非常简单,但克隆出来的各台虚拟机的配置却一模一样,因此造成了各虚拟机的HWADDR地址相同。
发现问题的原因后,接下来就是如何解决问题。原本计划将各虚拟服务器的HWADDR地址修改为不同的地址,从而实现各虚拟机的正常通信。笔者认为凭着对Linux系统和虚拟机的几年操作经验,问题应该很容易解决。但实际情况却并非如此简单。
首先使用vi编辑器,对其中一台虚拟服务器(以下简称虚拟机1)的网卡配置 文 件 “/etc/sysconfig/network-scripts/ifcfgeth0”进行了编辑,将文件中的HWADDR的地址值修改为“00:0C:29:10:AC:72”。再 使 用“service network restart”命令,重启网络服务,使配置文件生效。但重启服务后出现报错信息,网卡重启失败(如图1)。
将虚拟机1的系统重启后,问题依然存在。使用ifconfig命令查看,网卡的HWADDR地址依然显示为“00:0C:29:10:AC:71”。 但 查看“/etc/sysconfig/networkscripts/ifcfg-eth0”配置文件,HWADDR的值已经修改为“00:0C:29:10:AC:72”了。这说明修改没有起作用,配置没有生效。
在网上查阅资料后,将“/etc/sysconfig/networkscripts/ifcfg-eth0” 中的HWADDR修改为MACADDR。再次重启网络服务,网络启动正常。使用ifconfig命令查看网络情况,发现回显的HWADDR已经成功改为“00:0C:29:10:AC:72”。 根据此方法对虚拟机网络配置进行修改,经测试,虚拟机1与其他虚拟机通信正常,问题已解决。
虽然硬件地址修改的方法已经找到。但带来新的问题:网卡配置文件“ifcfgeth0”中MACADDR是什么?它和HWADDR有什么不同?
在互联网中,关于网络配置文件“ifcfg-eth0”文件中,在MACADDR和HWADDR参数的介绍资料很少,无法找到准确的定义。笔者通过开展一系列关于修改硬件地址的实验,分析验证了这两个参数的作用和区别,并通过实验对Linux操作系统设备管理知识有了一定的了解。
在以太网中,设备的网卡提供接口以保证设备能够接入网络实现通信,每块网卡都有一个MAC地址(物理地址),该地址采用十六进制数,以“AA:BB:CC:DD:EE:FF”的形式表示,是以太网设备的硬件地址。每块网卡的MAC地址是惟一的地址。在名为“ifcfg-eth0”的网络配置文件中,不论是MACADDR或HWADDR参数,都是用来表示网卡的硬件地址的(这两个参数不能同时使用),但这两个参数有较大的区别。
MACADDR参数的作用比较容易得出结论,之前集群测试问题的解决,就可以当做一次实验,并可以得出结论。之前问题解决过 程 中,“ifcfg-eth0” 文件 中,MACADDR参 数 的 被设置了新的网卡硬件地址“00:0C:29:10:AC:72”,重启网络后,该配置即生效。
由 于 新MAC地 址“00:0C:29:10:AC:72”是笔者自己编造的地址,因此可以得出以下结论:当系统网络配置文件使用MACADDR参数时,系统中网卡的硬件地址以MACADDR设置的值为准。通过这个参数,Linux系统中可以设置一个与网卡实际MAC地址不一致的物理。在虚拟机环境,这种设置方法是有效的。
如之前例中所述,在“ifcfg-eth0” 文 件 中,直接将HWADDR改为“00:0C:29:10:AC:72”是无效的。那么HWADDR是否代表设备网卡自身的物理地址呢?这个想法,可以通过将系统中两块网卡的MAC地址进行互换设置的实验进行验证。即,两块网卡的物理地址能否通过网络配置文件中HWADDR参数进行交换设置,如果交换设置MAC地址,网卡配置能够顺利启动,则可证明HWADDR参数即网卡的物理地址。
在虚拟机1中,再新增加1块网卡。这块新增网卡会被虚拟机分配一个虚拟的硬件地 址“00:0C:29:4A:40:F4”。即虚拟机1中,现在有两块实际存在的网卡,其第一块网卡(简称为网卡1)的MAC地址 为“00:0C:29:10:AC:71”,第二块新增网卡(简称为网卡2)的MAC地址为“00:0C:29:4A:40:F4”。通过“ifconfig”命令查看网卡的情况,目前网卡1对应为设备名eth0,网卡2对应为设备名eth1。 在/etc/sysconfig/network-scripts/中新建网卡2的配置文件ifcfgeth1,配置MAC地址和IP地址。重启网络服务“service network restart”,网卡启动正常。
编 辑ifcfg-eth0和ifcfg-eth1文 件, 将ifcfg-eth0中的HWADDR由“00:0C:29:10:AC:71”修改为“00:0C:29:4A:40:F4”。ifcfg-eth1中的HWADDR由“00:0C:29:4A:40:F4”修改为“00:0C:29:10:AC:71”。完成编辑后,再重启网络服务,但网卡启动失败。
难道只能网卡1固定对应设备名eth0,网卡2固定对应设备eth1,无法做到双网卡HWADDR值的交换修改配置?这显然与Linux系统的开源精神是不符合的。经过查阅资料,发现还需修改/etc/udev/rules.d/70-persistentnet.rules文件,将文件中的 NAME=”eth0”所在行的ATTR{address}数值调整为“00:0C:29:4A:40:F4”, 将文件中的 NAME=”eth1”所在行的ATTR{address}数值调整为“00:0C:29:10:AC:71”(如图2)。重启操作系统(修改“70-persistent-net.rules”文件需重启系统),网卡启动正常,两块HWADDR的HWADDR值已顺利交换。
图 2“70-persistent-net.rules”文件
由此可以得出结论,HWADDR必须配置网卡的物理地址,该地址是无法随意修改的。在多网卡情况下,可以通过调整网络配置文件和“70-persistent-net.rules”文件,在系统中修改设置网卡与设备名的对应关系。通过以上的实验带来了新的问题:“70-persistent-net.rules”文件的作用是什么?
“70-persistent-net.rules” 位 于/etc/udev/rules.d目录下。通过查阅资料,可以了解到该文件的相关信息。Linux 传统上使用静态设备创建方法,因此大量设备节点在 /dev 下创建(有时上千个),而不管相应的硬件设备是否真正存在。而udev是Linux kernel 2.6系列的设备管理器,它主要的功能是管理/dev目录底下的设备节点。采用udev的方法,只有被内核检测到的设备才会获取为它们创建的设备节点。因为,这些设备节点在每次系统启动时被创建,它们会被贮存在ramfs(一个内存中的文件系统,不占用任何磁盘空间)。udev能通过定义一个 udev规则(rule)来产生匹配设备属性的设备文件,“70-persistent-net.rules”就是网络设备的udev 规则。
那 么 通 过“70-persistent-net.rules”文件可以修改硬件地址吗?之前做实验的虚拟机1有两块网卡,在“70-persistentnet.rules”文件中有两行设备信息,一行NAME=”eth0”,另 一 行 NAME=”eth1”。 笔者 将 NAME=”eth0” 所 在行 的ATTR{address}值 由“00:0C:29:10:AC:71”改 为“00:0C:29:10:AC:72”,并 在ifcfg-eth0中将HWADDR的值也对应修改,重启电脑后,该修改不能生效。
查 看“70-persistentnet.rules”, 重 启 前 的NAME=”eth0”和NAME=”eth1”的两行信息还在。但新增 了 一 行 NAME=”eth2”,行中ATTR{address}值为“00:0C:29:10:AC:71”。说明“70-persistent-net.rules”文件的新增内容,是根据系统重启动时,内核检测到的相关网络设备信息而添加。重启前将文件进行了修改,重启时系统内核检测到了正确的网卡信息,于是在该文件中增加了一行检测到的网卡信息。
根据之前的实验可以得到以下结论:
MACADDR参数是用于给一个网络接口卡分配一个MAC地址,并覆盖物理分配的MAC地址。即,当系统网络配置文件使用MACADDR参数时,系统中网卡的硬件地址以MACADDR设置的值为准。通过这个参数,Linux系统中可以设置一个与网卡实际MAC地址不一致的物理。在虚拟机环境,这种设置方法是有效的。
HWADDR参数即网卡的物理地址,在网络配置中,用于保证网络接口卡通过网络配置文件分配给正确的设备,该配置必须与“70-persistent-net.rules”文件中的配置保持一致,特别是对于多网卡配置的情况下。
Linux系统通过udev设备管理器进行设备管理。“70-persistent-net.rules”是udev设备管理器中网络设备的规则文件。通过该文件可以设置物理网卡与设备名称的对应关系。而“/etc/sysconfig/networkscripts”下的网络配置文件“ifcfg-eth*”主要是针对网卡参数的配置。一般情况下,网卡相关参数的配置应该与设备管理器中的参数相一致。
笔者已经使用Linux操作系统很多年,自己感觉已经对于Linux操作系统网络配置已经非常熟悉。但近期在维护测试工作中,因硬件地址配置问题造成了的网络不通,根据实验研究验证了网络配置文件中的MACADDR和HWADDR原来有着很大的不同,也学习到了Linux系统中设备管理相关的知识。笔者在以往的维护工作中,只注重问题是否解决,忽略了对于基础知识的探究。学无止境,只有通过不断学习,才能更好地提升自己。