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 FilesOracleVirtualBoxvboxheadless.exe”
env=VBOXMANAGE=”C:Program FilesOracleVirtualBoxVBoxManage.exe”
debug=0
debug_out=>D:softvboxsrvstart.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 部分。