星期二, 10月 21, 2008

VirtualBox 與 tuntap interface

從純 User 的角度來看,比起 VMWareVirtualBox 的好處是,不必載入一堆有的沒有的核心模組(只有一個 vboxdrv),而且少了一堆 init script。付出的代價是... 某些方面的設定多了一些,不過這些設定並不複雜,只是麻煩些罷了。

如果您也跟我一樣不想讓 VirtualBox 用內部的 NAT,而是透過 Host Interface 直接上網,可以這麼作。首先假設網路拓樸長這樣:

  1. 增加一個 bridge 介面
    這個根據系統,會有不同的設定。在 Gentoo(baselayout-2)下,請安裝 usermode-utilities 與 bridge-utils,並修改 /etc/conf.d/net 這個檔案:
    config_eth0="null" # eth0 設為 null,並且把其他跟 eth0 有關的設定都拿掉
    bridge_br0="eth0" # 讓 bridge 由 eth0 組成
    config_br0=( "192.168.1.254/24" ) # 改成您的 IP
    #config_br0=( "dhcp" ) # 如果您要讓這台機器走 dhcp
    brctl_br0=(
        "setfd 0"
        "sethello 0"
        "stp off"
    )
    routes_br0=( 'default via 192.168.1.1' ) # 如果用 dhcp,請註解掉。
    fallback_br0=( "apipa" ) # 可有可無...

    ...

    link_ppp0="br0" # 如果有 adsl 撥接,請改成透過 br0。

    ...
  2. 增加相應的 init script
    $ sudo ln -s /etc/init.d/net.{lo,br0}
  3. 修改 /etc/sudoers
    加入以下這行:
    %vboxusers ALL=(ALL) NOPASSWD: /usr/bin/VBoxAddIF, /usr/bin/VBoxDeleteIF
  4. 加入一個 helper script
    放在哪裡都可以。為了讓所有的 User 都可以用,我放在 /usr/bin/VBoxIFManager.sh,別忘了 chmod +x 喔!
    #!/bin/bash

    IF="${1}"
    ACTION="${2}"
    BRIDGE="br0"

    case "${ACTION}" in
    up)
        sudo VBoxAddIF "${IF}" "${LOGNAME}" "${BRIDGE}" > /dev/null 2>&1
        ;;
    down)
        sudo VBoxDeleteIF "${IF}" > /dev/null 2>&1
        ;;
    esac

    echo "${IF}"
  5. VirtualBox 內的設定
    在 Virtual Machine Settings 裡的 Networking 下...
    • Attached to 選 Host Interface
    • Interface name 留空白
    • Setup Application 填入「/path/to/VBoxIFManager.sh vbox0 up」
    • Terminate Application 填入「/path/to/VBoxIFManager.sh vbox0 down」
    其中 vbox0 可以改成任意字串,如 winxp、fbsd、palatis_is_very_handsome 之類的。