Cody Blog

Software development

解決 Geust VM 在 Nested ESXi 網路無法連外的問題

我遇到的情況是在 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

vSwitchSecuritySetting

如果 Host 是 Linux 的話,還是會有問題,因為Workstation 的 promiscuous mode 會需要讀寫 /dev/vmnet* ,而這些 device file 預設只有 root 可以讀寫。所以還需要以下步驟:

修改 /dev/vmnet 權限

新增一個 promiscuous group

::bash
$ sudo groupadd promiscuous
$ sudo usermod -a -G promiscuous <YOUR_USER_ID>

驗證已經加入成功:

::bash
$ getent group promiscuous 
promiscuous:x:1001:<YOUR_USER_ID>

接下來修改 /etc/init.d/vmware,加入下列兩行,讓每次開機都自動修改權限。因為每次重開機之後 /dev/vmnet* 會被 reset 成 root 權限

::bash
    vmwareStartVmnet() {
       vmwareLoadModule $vnet
       "$BINDIR"/vmware-networks --start >> $VNETLIB_LOG 2>&1

+      chgrp promiscuous /dev/vmnet*
+      chmod g+rw /dev/vmnet*
    }

這樣就 ok 了。

參考資料

DevOps

Related Posts

Comments