我遇到的情況是在 Ubuntu 13.10 上面安裝 VMware Workstation,在上面安裝了 ESXi 5.5。ESXi 上面的網路是使用 NAT,但是在 ESXi 上面的 VM 卻沒辦法連外 。這邊記錄一下解決的過程,簡單的說: ESXi上的 vSwtich 需要開啟promiscuous mode,然後 ,normal user 需要有權限寫入 /dev/vmnet
Promiscuous 是什麼呢?
在一般的 swtich 設計之下,預設是流通的frame只收到收件者自己的。但是這在 Nested VM 上面會有一些問題,因為 Guest VM 上面的 Mac address 跟 ESXi VM Mac adddress 不同,所以除非 ESXi 能收到 Guest VM 的 frame,不然像是外部的 DHCP 等等協定就沒辦法跟裡面的 VM 互動。而開啟 Promiscuous mode 之後,VM 就會收到其它 interface 的 frame。ESXi 就可以把需要傳送給自己肚子裡面的 VM 按照 vSwitch 的設定轉送過去。而 Promiscuous mode 可以在 ESXi 裡面的 vSwitch/Port group 安全性設定找到。在 5.5.0 一共有三個設定:
Promiscuous mode
: 預設是 Reject (off)MAC Address Changes
預設是 Accept (on)Forged Transmits
預設是 Accept (on)
在執行 Nested VM 的時侯,建議把這三個設定值都設成 Accept 。
如果 Host 是 Linux 的話,還是會有問題,因為Workstation 的 promiscuous mode 會需要讀寫 /dev/vmnet* ,而這些 device file 預設只有 root 可以讀寫。所以還需要以下步驟:
修改 /dev/vmnet 權限
新增一個 promiscuous group
$ sudo groupadd promiscuous
$ sudo usermod -a -G promiscuous <YOUR_USER_ID>
驗證已經加入成功:
$ getent group promiscuous
promiscuous:x:1001:<YOUR_USER_ID>
接下來修改 /etc/init.d/vmware,加入下列兩行,讓每次開機都自動修改權限。因為每次重開機之後 /dev/vmnet* 會被 reset 成 root 權限
vmwareStartVmnet() {
vmwareLoadModule $vnet
"$BINDIR"/vmware-networks --start >> $VNETLIB_LOG 2>&1
+ chgrp promiscuous /dev/vmnet*
+ chmod g+rw /dev/vmnet*
}
這樣就 ok 了。