最 近,筆者需要使用VM軟 件(VMware Workstation)虛擬多臺(tái)Linux操作系統(tǒng)服務(wù)器進(jìn)行集群測(cè)試(本文采用Centos 6.0操作系統(tǒng)為例),虛擬機(jī)使用Host-only網(wǎng)絡(luò)模式進(jìn)行連接。在對(duì)各主機(jī)配置完IP地址后,發(fā)現(xiàn)虛擬機(jī)與宿主機(jī)(筆者的電腦)之間通訊正常,但各虛擬機(jī)之間卻不通。在虛擬機(jī)中,使用ifconfig命令顯示網(wǎng)絡(luò)接口卡配置情況,發(fā)現(xiàn)自己犯了一個(gè)低級(jí)錯(cuò)誤,雖然各虛擬機(jī)的IP地址是同一局域網(wǎng)段的不同IP地址,但網(wǎng)卡的HWADDR地址卻全部相同,都是“00:0C:29:10:AC:71”。根據(jù)OSI七層模型,以太網(wǎng)中網(wǎng)絡(luò)底層通信是二層硬件地址之間的通信,因此當(dāng)HWADDR相同時(shí),各虛擬機(jī)之間由于地址沖突,當(dāng)然無(wú)法通信。
圖1 重啟網(wǎng)絡(luò)服務(wù)后的報(bào)錯(cuò)信息
那么為什么這些虛擬機(jī)的HWADDR地址都是相同的呢?原來(lái)由于需要多臺(tái)虛擬服務(wù)器進(jìn)行測(cè)試,筆者為省事就直接對(duì)虛擬機(jī)文件進(jìn)行了拷貝,“克隆”了多臺(tái)虛擬服務(wù)器,這種做法非常簡(jiǎn)單,但克隆出來(lái)的各臺(tái)虛擬機(jī)的配置卻一模一樣,因此造成了各虛擬機(jī)的HWADDR地址相同。
發(fā)現(xiàn)問(wèn)題的原因后,接下來(lái)就是如何解決問(wèn)題。原本計(jì)劃將各虛擬服務(wù)器的HWADDR地址修改為不同的地址,從而實(shí)現(xiàn)各虛擬機(jī)的正常通信。筆者認(rèn)為憑著對(duì)Linux系統(tǒng)和虛擬機(jī)的幾年操作經(jīng)驗(yàn),問(wèn)題應(yīng)該很容易解決。但實(shí)際情況卻并非如此簡(jiǎn)單。
首先使用vi編輯器,對(duì)其中一臺(tái)虛擬服務(wù)器(以下簡(jiǎn)稱(chēng)虛擬機(jī)1)的網(wǎng)卡配置 文 件 “/etc/sysconfig/network-scripts/ifcfgeth0”進(jìn)行了編輯,將文件中的HWADDR的地址值修改為“00:0C:29:10:AC:72”。再 使 用“service network restart”命令,重啟網(wǎng)絡(luò)服務(wù),使配置文件生效。但重啟服務(wù)后出現(xiàn)報(bào)錯(cuò)信息,網(wǎng)卡重啟失?。ㄈ鐖D1)。
將虛擬機(jī)1的系統(tǒng)重啟后,問(wèn)題依然存在。使用ifconfig命令查看,網(wǎng)卡的HWADDR地址依然顯示為“00:0C:29:10:AC:71”。 但 查看“/etc/sysconfig/networkscripts/ifcfg-eth0”配置文件,HWADDR的值已經(jīng)修改為“00:0C:29:10:AC:72”了。這說(shuō)明修改沒(méi)有起作用,配置沒(méi)有生效。
在網(wǎng)上查閱資料后,將“/etc/sysconfig/networkscripts/ifcfg-eth0” 中的HWADDR修改為MACADDR。再次重啟網(wǎng)絡(luò)服務(wù),網(wǎng)絡(luò)啟動(dòng)正常。使用ifconfig命令查看網(wǎng)絡(luò)情況,發(fā)現(xiàn)回顯的HWADDR已經(jīng)成功改為“00:0C:29:10:AC:72”。 根據(jù)此方法對(duì)虛擬機(jī)網(wǎng)絡(luò)配置進(jìn)行修改,經(jīng)測(cè)試,虛擬機(jī)1與其他虛擬機(jī)通信正常,問(wèn)題已解決。
雖然硬件地址修改的方法已經(jīng)找到。但帶來(lái)新的問(wèn)題:網(wǎng)卡配置文件“ifcfgeth0”中MACADDR是什么?它和HWADDR有什么不同?
在互聯(lián)網(wǎng)中,關(guān)于網(wǎng)絡(luò)配置文件“ifcfg-eth0”文件中,在MACADDR和HWADDR參數(shù)的介紹資料很少,無(wú)法找到準(zhǔn)確的定義。筆者通過(guò)開(kāi)展一系列關(guān)于修改硬件地址的實(shí)驗(yàn),分析驗(yàn)證了這兩個(gè)參數(shù)的作用和區(qū)別,并通過(guò)實(shí)驗(yàn)對(duì)Linux操作系統(tǒng)設(shè)備管理知識(shí)有了一定的了解。
在以太網(wǎng)中,設(shè)備的網(wǎng)卡提供接口以保證設(shè)備能夠接入網(wǎng)絡(luò)實(shí)現(xiàn)通信,每塊網(wǎng)卡都有一個(gè)MAC地址(物理地址),該地址采用十六進(jìn)制數(shù),以“AA:BB:CC:DD:EE:FF”的形式表示,是以太網(wǎng)設(shè)備的硬件地址。每塊網(wǎng)卡的MAC地址是惟一的地址。在名為“ifcfg-eth0”的網(wǎng)絡(luò)配置文件中,不論是MACADDR或HWADDR參數(shù),都是用來(lái)表示網(wǎng)卡的硬件地址的(這兩個(gè)參數(shù)不能同時(shí)使用),但這兩個(gè)參數(shù)有較大的區(qū)別。
MACADDR參數(shù)的作用比較容易得出結(jié)論,之前集群測(cè)試問(wèn)題的解決,就可以當(dāng)做一次實(shí)驗(yàn),并可以得出結(jié)論。之前問(wèn)題解決過(guò) 程 中,“ifcfg-eth0” 文件 中,MACADDR參 數(shù) 的 被設(shè)置了新的網(wǎng)卡硬件地址“00:0C:29:10:AC:72”,重啟網(wǎng)絡(luò)后,該配置即生效。
由 于 新MAC地 址“00:0C:29:10:AC:72”是筆者自己編造的地址,因此可以得出以下結(jié)論:當(dāng)系統(tǒng)網(wǎng)絡(luò)配置文件使用MACADDR參數(shù)時(shí),系統(tǒng)中網(wǎng)卡的硬件地址以MACADDR設(shè)置的值為準(zhǔn)。通過(guò)這個(gè)參數(shù),Linux系統(tǒng)中可以設(shè)置一個(gè)與網(wǎng)卡實(shí)際MAC地址不一致的物理。在虛擬機(jī)環(huán)境,這種設(shè)置方法是有效的。
如之前例中所述,在“ifcfg-eth0” 文 件 中,直接將HWADDR改為“00:0C:29:10:AC:72”是無(wú)效的。那么HWADDR是否代表設(shè)備網(wǎng)卡自身的物理地址呢?這個(gè)想法,可以通過(guò)將系統(tǒng)中兩塊網(wǎng)卡的MAC地址進(jìn)行互換設(shè)置的實(shí)驗(yàn)進(jìn)行驗(yàn)證。即,兩塊網(wǎng)卡的物理地址能否通過(guò)網(wǎng)絡(luò)配置文件中HWADDR參數(shù)進(jìn)行交換設(shè)置,如果交換設(shè)置MAC地址,網(wǎng)卡配置能夠順利啟動(dòng),則可證明HWADDR參數(shù)即網(wǎng)卡的物理地址。
在虛擬機(jī)1中,再新增加1塊網(wǎng)卡。這塊新增網(wǎng)卡會(huì)被虛擬機(jī)分配一個(gè)虛擬的硬件地 址“00:0C:29:4A:40:F4”。即虛擬機(jī)1中,現(xiàn)在有兩塊實(shí)際存在的網(wǎng)卡,其第一塊網(wǎng)卡(簡(jiǎn)稱(chēng)為網(wǎng)卡1)的MAC地址 為“00:0C:29:10:AC:71”,第二塊新增網(wǎng)卡(簡(jiǎn)稱(chēng)為網(wǎng)卡2)的MAC地址為“00:0C:29:4A:40:F4”。通過(guò)“ifconfig”命令查看網(wǎng)卡的情況,目前網(wǎng)卡1對(duì)應(yīng)為設(shè)備名eth0,網(wǎng)卡2對(duì)應(yīng)為設(shè)備名eth1。 在/etc/sysconfig/network-scripts/中新建網(wǎng)卡2的配置文件ifcfgeth1,配置MAC地址和IP地址。重啟網(wǎng)絡(luò)服務(wù)“service network restart”,網(wǎng)卡啟動(dòng)正常。
編 輯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”。完成編輯后,再重啟網(wǎng)絡(luò)服務(wù),但網(wǎng)卡啟動(dòng)失敗。
難道只能網(wǎng)卡1固定對(duì)應(yīng)設(shè)備名eth0,網(wǎng)卡2固定對(duì)應(yīng)設(shè)備eth1,無(wú)法做到雙網(wǎng)卡HWADDR值的交換修改配置?這顯然與Linux系統(tǒng)的開(kāi)源精神是不符合的。經(jīng)過(guò)查閱資料,發(fā)現(xiàn)還需修改/etc/udev/rules.d/70-persistentnet.rules文件,將文件中的 NAME=”eth0”所在行的ATTR{address}數(shù)值調(diào)整為“00:0C:29:4A:40:F4”, 將文件中的 NAME=”eth1”所在行的ATTR{address}數(shù)值調(diào)整為“00:0C:29:10:AC:71”(如圖2)。重啟操作系統(tǒng)(修改“70-persistent-net.rules”文件需重啟系統(tǒng)),網(wǎng)卡啟動(dòng)正常,兩塊HWADDR的HWADDR值已順利交換。
圖 2“70-persistent-net.rules”文件
由此可以得出結(jié)論,HWADDR必須配置網(wǎng)卡的物理地址,該地址是無(wú)法隨意修改的。在多網(wǎng)卡情況下,可以通過(guò)調(diào)整網(wǎng)絡(luò)配置文件和“70-persistent-net.rules”文件,在系統(tǒng)中修改設(shè)置網(wǎng)卡與設(shè)備名的對(duì)應(yīng)關(guān)系。通過(guò)以上的實(shí)驗(yàn)帶來(lái)了新的問(wèn)題:“70-persistent-net.rules”文件的作用是什么?
“70-persistent-net.rules” 位 于/etc/udev/rules.d目錄下。通過(guò)查閱資料,可以了解到該文件的相關(guān)信息。Linux 傳統(tǒng)上使用靜態(tài)設(shè)備創(chuàng)建方法,因此大量設(shè)備節(jié)點(diǎn)在 /dev 下創(chuàng)建(有時(shí)上千個(gè)),而不管相應(yīng)的硬件設(shè)備是否真正存在。而udev是Linux kernel 2.6系列的設(shè)備管理器,它主要的功能是管理/dev目錄底下的設(shè)備節(jié)點(diǎn)。采用udev的方法,只有被內(nèi)核檢測(cè)到的設(shè)備才會(huì)獲取為它們創(chuàng)建的設(shè)備節(jié)點(diǎn)。因?yàn)?,這些設(shè)備節(jié)點(diǎn)在每次系統(tǒng)啟動(dòng)時(shí)被創(chuàng)建,它們會(huì)被貯存在ramfs(一個(gè)內(nèi)存中的文件系統(tǒng),不占用任何磁盤(pán)空間)。udev能通過(guò)定義一個(gè) udev規(guī)則(rule)來(lái)產(chǎn)生匹配設(shè)備屬性的設(shè)備文件,“70-persistent-net.rules”就是網(wǎng)絡(luò)設(shè)備的udev 規(guī)則。
那 么 通 過(guò)“70-persistent-net.rules”文件可以修改硬件地址嗎?之前做實(shí)驗(yàn)的虛擬機(jī)1有兩塊網(wǎng)卡,在“70-persistentnet.rules”文件中有兩行設(shè)備信息,一行NAME=”eth0”,另 一 行 NAME=”eth1”。 筆者 將 NAME=”eth0” 所 在行 的ATTR{address}值 由“00:0C:29:10:AC:71”改 為“00:0C:29:10:AC:72”,并 在ifcfg-eth0中將HWADDR的值也對(duì)應(yīng)修改,重啟電腦后,該修改不能生效。
查 看“70-persistentnet.rules”, 重 啟 前 的NAME=”eth0”和NAME=”eth1”的兩行信息還在。但新增 了 一 行 NAME=”eth2”,行中ATTR{address}值為“00:0C:29:10:AC:71”。說(shuō)明“70-persistent-net.rules”文件的新增內(nèi)容,是根據(jù)系統(tǒng)重啟動(dòng)時(shí),內(nèi)核檢測(cè)到的相關(guān)網(wǎng)絡(luò)設(shè)備信息而添加。重啟前將文件進(jìn)行了修改,重啟時(shí)系統(tǒng)內(nèi)核檢測(cè)到了正確的網(wǎng)卡信息,于是在該文件中增加了一行檢測(cè)到的網(wǎng)卡信息。
根據(jù)之前的實(shí)驗(yàn)可以得到以下結(jié)論:
MACADDR參數(shù)是用于給一個(gè)網(wǎng)絡(luò)接口卡分配一個(gè)MAC地址,并覆蓋物理分配的MAC地址。即,當(dāng)系統(tǒng)網(wǎng)絡(luò)配置文件使用MACADDR參數(shù)時(shí),系統(tǒng)中網(wǎng)卡的硬件地址以MACADDR設(shè)置的值為準(zhǔn)。通過(guò)這個(gè)參數(shù),Linux系統(tǒng)中可以設(shè)置一個(gè)與網(wǎng)卡實(shí)際MAC地址不一致的物理。在虛擬機(jī)環(huán)境,這種設(shè)置方法是有效的。
HWADDR參數(shù)即網(wǎng)卡的物理地址,在網(wǎng)絡(luò)配置中,用于保證網(wǎng)絡(luò)接口卡通過(guò)網(wǎng)絡(luò)配置文件分配給正確的設(shè)備,該配置必須與“70-persistent-net.rules”文件中的配置保持一致,特別是對(duì)于多網(wǎng)卡配置的情況下。
Linux系統(tǒng)通過(guò)udev設(shè)備管理器進(jìn)行設(shè)備管理?!?0-persistent-net.rules”是udev設(shè)備管理器中網(wǎng)絡(luò)設(shè)備的規(guī)則文件。通過(guò)該文件可以設(shè)置物理網(wǎng)卡與設(shè)備名稱(chēng)的對(duì)應(yīng)關(guān)系。而“/etc/sysconfig/networkscripts”下的網(wǎng)絡(luò)配置文件“ifcfg-eth*”主要是針對(duì)網(wǎng)卡參數(shù)的配置。一般情況下,網(wǎng)卡相關(guān)參數(shù)的配置應(yīng)該與設(shè)備管理器中的參數(shù)相一致。
筆者已經(jīng)使用Linux操作系統(tǒng)很多年,自己感覺(jué)已經(jīng)對(duì)于Linux操作系統(tǒng)網(wǎng)絡(luò)配置已經(jīng)非常熟悉。但近期在維護(hù)測(cè)試工作中,因硬件地址配置問(wèn)題造成了的網(wǎng)絡(luò)不通,根據(jù)實(shí)驗(yàn)研究驗(yàn)證了網(wǎng)絡(luò)配置文件中的MACADDR和HWADDR原來(lái)有著很大的不同,也學(xué)習(xí)到了Linux系統(tǒng)中設(shè)備管理相關(guān)的知識(shí)。筆者在以往的維護(hù)工作中,只注重問(wèn)題是否解決,忽略了對(duì)于基礎(chǔ)知識(shí)的探究。學(xué)無(wú)止境,只有通過(guò)不斷學(xué)習(xí),才能更好地提升自己。