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创建系统服务,不过要注意两点:
SC中,参数等于号后面要有一个空格,如“binPath= ”,后面有个空格哦,蛋疼得很。
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的虚拟机有不同状态的问题。
要注意两点:
VboxWebSrv默认占用127.0.0.1的18083端口,注意让防火墙放行。由于取消了验证,所以建议只监听本地的127.0.0.1(默认)
由于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部分。