最 近,筆者需要使用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系統中設備管理相關的知識。筆者在以往的維護工作中,只注重問題是否解決,忽略了對于基礎知識的探究。學無止境,只有通過不斷學習,才能更好地提升自己。