使用 Virtual Box 從 host OS 連向 guest OS

2011-06-05 更新

剛發現可以透過 GUI 介面直接從 Network -> Advanced -> Port forwarding 裡新增 forwarding rules, 以下的記錄就當歷史吧......。

( 原文如下 )

之前在 Windows 下試過一些寫 Python 的方案, 最後得到的結論是: 裝 andLinux 再用 putty 連 localhost 開 screen 最好用!! 姑且不論這種作法到底還算不算是「在 Windows 下寫 Python」, 我個人覺得這樣滿順手的, 而且只要習慣一種開發環境即可。不幸的是, andLinux 無法裝在 64bit Windows 下, 只好改裝 VirtualBox 再裝 Ubuntu 10.04。

裝 VirtualBox 和 Ubuntu 10.04 超級簡單, 就和裝一般軟體沒兩樣。反正是 VM, 而且是自己練習 coding 用的系統, 直接一個大 partition 搞定, 什麼設定也不管, 沒多久就裝好了。裝好後如同 andLinux, 網路都設好了, guest OS 透過 host OS 用 NAT 的方式可連到 Internet。但是, host 預設無法連回 guest, 於是找了一下設法。

參考 Howto Access via ssh a Virtualbox Guest machine 的說明和留言的指示, 外加一些 try & error, 整理出方法如下:
  1. 在 guest OS 用 ifconfig 找出網卡名稱 (如 eth0)
  2. 在 guest OS 用 dmesg 配合網卡名稱找出 device (?) 類型 (dmesg | grep eth0), 可能會找到 pcnet 或 e1000。我的情況是 e1000
  3. 在 host OS 的命令列執行指令 VBoxManage (Windows 的見下面補充說明):
    VBoxManage setextradata "GuestName" "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/HostPort" 2222
    VBoxManage setextradata "GuestName"  "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/GuestPort" 22
    VBoxManage setextradata "GuestName" "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/Protocol" TCP
  4. 用 VBoxManage getextradata "Guest Name" enumerate 查看是否有設進去。
  5. 關閉 guest OS, 再重開 guest OS。記得要關掉再開機, 不能用 reboot, 因為要重設 VM 的網路設定
  6. 成功的話, 若 host OS 是 Windows, 應該會跳出防火牆設定的通知, 詢問是否同意讓 VirtualBox 使用網路之類的問題。接著按「允許」
  7. 用 ssh/putty 連向 localhost 的 port 2222, 會透過 port forwarding 的方式導到 guest OS 的 22 port。
補充說明
  1. Windows 7 的 VBoxManage 放在 c:\Program Files\Oracle\VirtualBox\ 下, 進 cmd 後要切到該目錄下才能執行。不然就是將它加到 environment path 裡
  2. 注意大小寫, 別把 VBoxInternal 打成 VboxInternal, 或是 Protocol 打成 Protocal
  3. 注意 guest OS 用的 device adapter, 網路上的範例有的是 pcnet 有的是 e1000, 要查一下自己的是什麼
  4. 在 Windows 下可用 netstat -a 確認是否有聽 port 2222; 在 Linux 下用 netstat -lntp 查看。
  5. 若用 VBoxManage 設錯 extradata, 刪除的方法是用 setextradata 配合空的 value 
滿好奇背後是怎麼運作的, VirtualBox 怎麼將 guest 和 host 的網路串起來? 改天有機會再來看看吧。

2011-06-05 更新
透過指令列用 VBoxManage 設定實在是太麻煩了, 試了一下, 找出直接改設定檔的方法。首先要關掉 virtual box host server, 不然手動改完後之後又會被覆蓋回去。關掉 server 後編輯 C:\Users\*YOUR_ACCOUNT*\VirtualBox VMs\*YOUR_VM*\*YOUR_VM*.vbox。改完後再啟動 virtual box host server。

留言

  1. 如果local有gateway, 直接把vm的網卡設成bridged, 然後用static ip就好了 XD

    回覆刪除
  2. 我也有查到有人這麼寫, 隨便試一下沒成功, 又換回 VBoxManage 設 port forwarding 的路線。待要弄的服務太多時, 改試這方案看看, 謝啦。

    回覆刪除

張貼留言

這個網誌中的熱門文章

(C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

熟悉系統工具好處多多

virtualbox 使用 USB 裝置