• Virtualbox终极无间配置篇

    Virtualbox有个问题,就是即使是相同用户启动,如果用户session不一样,那么还是会看到不同的启动结果,不能相互管理不同session启动的虚拟机(via)。这就杯具了啊,有时候,启动几个虚拟机,但是其中有一个死机了,要从主机的任务管理器里结束进程,我咋知道应该结束哪个???

    还有一个问题,就是网络默认是NAT,很灵活也很方便,端口转发很实用。但是有一个致命伤,就是大流量多连接情况下,容易导致内存溢出,虚拟机断网,甚至进程崩溃等问题。

    我看到最近几个更新的changelog有改善NAT的问题,所以卸载了原来的Virualbox,重启,安装新版,重启。然后打开虚拟机,卸载Virtualbox Guest Addtion,重启,安装新版,重启。至此,由外到里更新完毕。

    然后,开始正式的配置。

    同步全局的Virtualbox设置

    我们知道,默认的Virtualbox设置是因用户而异的,一般存放在“C:\Documents and Settings\用户名\.Virtualbox”文件夹中。我们可以设定一下,使设置文件统一存放:新建“VBOX_USER_HOME”变量,里面填入设置存放的目录即可。

    虚拟机以服务形式启动(via

    下载srvstart,编辑下面内容存为srvstart.ini,比如保存在D盘根目录下:

    env=VBOXHEADLESS="C:\Program Files\Oracle\VirtualBox\vboxheadless.exe"
    env=VBOXMANAGE="C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"

    debug=0
    debug_out=>D:\soft\vbox\srvstart.log

    wait_time=60

    [Win2003]
    startup=%VBOXHEADLESS% -startvm Win2003
    shutdown_method=command
    shutdown=%VBOXMANAGE% controlvm Win2003 poweroff

    [VMWinXP]
    startup=%VBOXHEADLESS% -startvm WinXP
    shutdown_method=command
    shutdown=%VBOXMANAGE% controlvm WinXP poweroff

    然后运行下面命令即可安装里面的WinXP为系统服务VMWinXP:

    srvstart install_desktop VMWinXP -c d:\srvstart.ini

    类似的,安装里面的Win2003为系统服务则是:

    srvstart install_desktop Win2003 -c d:\srvstart.ini

    当然,可以用系统命令sc创建系统服务,不过要注意两点:

    1. SC中,参数等于号后面要有一个空格,如“binPath= ”,后面有个空格哦,蛋疼得很。
    2. Virtualbox的服务需要开启桌面互动,否则会启动出错

    WEB管理Virtualbox:

    由于相同用户不同session也会导致虚拟机状态不同步,而且启动服务需要开启桌面互动,所以我们只能用默认的本地服务(Local Service)身份来启动服务。而Virtualbox的web service默认的验证方式是用户验证,所以我们要先把验证取消:

    VBoxManage setproperty websrvauthlibrary null

    然后设置Virtualbox的web api为服务,还是使用srvstart工具。我们先编辑刚刚的srvstart.ini,在末尾加上:

    [VboxWebSrv]
    startup=%VBOX_INSTALL_PATH%\VboxWebSrv --threads=20
    shutdown_method=kill

    并安装其为“VboxWebSrv”服务:

    srvstart install_desktop VboxWebSrv -c d:\srvstart.ini

    然后到SVN“phpvirtualbox”项目的源码,它是Virtualbox的WEB GUI。像安装PHP程序一样安装。注意要SOAP扩展,以及把config.php的用户名和密码置空。

    启动“VboxWebSrv”服务,访问你刚刚安装的“phpvirtualbox”,应该看到了正常的仿真Virtualbox面板。怎么样,可以通过web控制了吧。最重要的是,解决了不同session的虚拟机有不同状态的问题。

    要注意两点:

    1. VboxWebSrv默认占用127.0.0.1的18083端口,注意让防火墙放行。由于取消了验证,所以建议只监听本地的127.0.0.1(默认)
    2. 由于phpvirtualbox本身不设有验证机制,也就是说,Virtualbox的web控制端是可以公开访问的,所以有必要添加基于web的认证。Apache可以用.htpasswd解决。参考http://blog.creke.net/273.html

    NAT环境下的端口映射和端口转发(via

    VBoxManage modifyvm "VM name" --natpf1 "guestssh,tcp,host ip,2222, guest ip,22"

    命令解释:

    跟之前的一样,我们可以看到熟悉的VBoxManage的身影。紧随其后的是 modifyvm ,跟之前版本的命令不一样。然后就是“VM NAME”虚拟机名称,将其替换成相应的虚拟机名称就可以了。接着就是重点部分了,NAT端口映射的参数。
    1.natpf1 我们可以很容易理解这个参数,natpf即 nat port forwarding的缩写。后面紧接着的是虚拟机设置中相应网卡的数字,如果你的网卡是第一个,则为1。
    2.natpf后的参数
    (1)guestssh 是这个端口映射的名字,自行修改成容易理解的名称吧,如果填则系统会自动生成。
    (2)tcp (or udp) 是映射的协议。
    (3)host ip 则是你的主机的IP地址,如不填写则映射到主机中的所有IP地址上的相应端口。
    (4)2222(host port) 主机端口,自选吧。
    (5)guest ip 虚拟机中的IP地址,很明显,不填写则映射到虚拟机中的所有IP地址上的相应端口。
    (6)22(guest port)虚拟机端口,自选+1。

    如果要删除端口映射,只需要输入以下命令:

    VBoxManage modifyvm "VM name" --natpf1 delete "guestssh"

    清理压缩Virtualbox磁盘镜像

    可以使用VBoxManage命令中的modifyhd的compact参数解决。Windows虚拟机可以使用微软官方的SDelete工具来清理磁盘。

    具体步骤和原理参见Virtualbox官方的User Guide的Vboxmanage-modifyvdi部分

    分类: 所谓技术 | 标签: ,