開場白
最近在機房的服務器上裝kvm虛擬主機。
不經意間,上演了一場由MAC地址異常而引發的服務器與xshell之間的血案!
問題描述
在一臺服務器上裝了兩個虛擬機,其中一臺是從另一臺上克隆的。克隆的虛擬機開機之後,發現ssh不能遠程連接:
然後在虛擬機管理界面本地去連接上服務器排查:
查看IP地址,想確認xshell是不是連錯了IP,找錯了對象,卻發現ifconfig居然查看不到IP??
圖:
查看network的啓動狀態,看到的是綠油油的active狀態。
然後又查看配置文件/etc/sysconfig/network-scripts/ifcfg-eth0 ,檢查IP。
配置明明是正確的啊,咋看不到IP呢?
查看/var/log/messages日誌,發現有下面這樣的報錯信息,提示MAC地址有異常:
Jun 24 22:21:05 devops02 network: Shutting down interface eth0: ERROR : [/etc/sysconfig/network-scripts/ifdown-eth] Device has MAC address 00:00:00:00:00:00
Jun 24 22:21:05 devops02 network: 52:54:00:72:E3:FB, instead of configured address 52:54:00:32:43:34. Ignoring.
Jun 24 22:21:05 devops02 /etc/sysconfig/network-scripts/ifdown-eth: Device has MAC address 00:00:00:00:00:00
52:54:00:72:E3:FB, instead of configured address 52:54:00:32:43:34. Ignoring.
Jun 24 22:21:05 devops02 network: [FAILED]
問題排查
根據上面的報錯信息,開始了排查的長征!
日誌提示MAC地址異常,查看ifcfg-eht0配置的MAC地址是HWADDR=52:54:00:32:43:34:
然鵝,ifconfig顯示出來的MAC地址卻是52:54:00:72:e3:fb!
圖:
原來,是兩邊的MAC地址不一樣,引起的問題!
原因分析
爲什麼會導致一臺主機上有兩個MAC地址?
原因是在KVM的界面克隆虛擬機的時候,有一個設置mac地址的“Random MAC address”按鈕:
克隆主機的時候,因爲害怕克隆主機和原始主機的mac地址產生衝突,所以在克隆的時候點了“Random MAC address”按鈕,就隨機生成了一個新的MAC地址52:54:00:72:e3:fb。
這個MAC地址就是後面在ifconfig裏面看到的那個mac地址52:54:00:72:e3:fb。
而在克隆界面的旁邊還有一個XML配置界面,裏面也有一個MAC地址的配置:
XML界面的MAC地址<mac address='52:54:00:32:43:34'/>就是後面寫入到配置文件ifcfg-eth0的MAC地址:52:54:00:32:43:34。
這就導致ifconfig和ifcfg-eth0兩邊的MAC地址不一致了。
另外:
測試了一下,即使在前面點了“Random MAC address”按鈕,生成新的mac地址,再把新的MAC地址修改到後面的XML文件,然後再點擊克隆主機。新克隆的主機ifcfg-eth0文件裏面的MAC地址還是以前的52:54:00:32:43:34,跟ifconfig的MAC地址也是不一樣。還是要手動改配置文件。
在這之前也有在KVM上克隆了十幾臺服務器,但是以前都習慣於在剛剛克隆好主機之後,第一步就是刪掉配置文件ifcfg-eth0文件裏面的MAC地址和UUID地址,而恰好之前的原始主機配置文件ifcfg-eth0文件裏面又配置了DEVICE(關於DEVICE見後文),所以刪掉配置文件的MAC地址之後,網卡就順利起來了,並沒有注意到克隆主機MAC地址不一致的問題。
解決方法
這個問題有兩種解決方法:
1、修改配置文件ifcfg-eth0的MAC地址,改成和ifconfig一樣的。然後再重啓network:
2、刪掉ifcfg-eth0裏面的“HWADDR=52:54:00:32:43:34”這一行,重新添加一行“DEVICE=eth0”,然後重啓network:
注意:
刪了MAC地址之後,一定要確認配置文件上有DEVICE配置,否則啓動network的時候,messages日誌裏面會有這樣的報錯:
Jun 24 22:24:40 devops02 network: Shutting down interface eth0: ERROR : [ipv6_test_device_status] Missing parameter 'device' (arg 1)
Jun 24 22:24:40 devops02 ipv6_test_device_status: Missing parameter 'device' (arg 1)
上面兩種解決方法都嘗試過了,重啓network,再查看IP地址,就顯示正常了:
xshell再次遠程連接已經OK:
結束語:
回顧上面的問題,小小總結:
1、ifconfig的MAC地址和ifcfg-eth0的MAC地址一定要相同;
2、如果在ifcfg-eth0裏面刪除了MAC地址,就要保證有DEVICE配置,因爲 DEVICE 和 HWADDR至少得有一個;
3、“/var/log/messages”文件和Google是個好東西;
4、多踩坑,就會避免這種low low的尷尬。
解決問題參考:
https://bugzilla.redhat.com/show_bug.cgi?id=1331276 :