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