VirtualBox 虚拟机镜像文件 UUID 已存在问题

使用虚拟机的一个好处就是可以带着虚拟机镜像文件到处走,需要的时候新建一个虚拟机加载相应的镜像文件就可以了。不过在 VirtualBox 上貌似有个问题,已使用过的镜像文件拷贝到其他硬盘不能直接用,需要给镜像文件生成新的 UUID,原因是这个 UUID 已经在本机的 VirtualBox 里注册过了。今天从 USB 盘上加载一个 Windows 虚拟机就碰到这个问题,说这个 Windows 的 VDI 磁盘镜像文件的 UUID 已经存在了:

Cannot register the hard disk ‘windows.vdi’ because a hard disk ‘windows.vdi’ with UUID already exists.

virtualbox cannot register the hard drive

VirtualBox 界面选项里面没有提供解决办法,记得以前用 VMware 的时候遇到类似情况会给个提示然后可以继续强制使用已注册过的磁盘,还好,VirtualBox 提供了有用的命令行工具。

使用 VBoxManage internalcommands sethduuid 命令重新给 VDI 磁盘镜像文件生成新 UUID,后面的 /Volumes/16gb/winxp.vdi 是 VDI 文件的路径:

$ cd /Applications/VirtualBox.app/Contents/MacOS

$ VBoxManage internalcommands sethduuid /Volumes/16gb/winxp.vdi
UUID changed to: 434b7690-d86f-400a-9d82-a374946f0961

然后新建一个虚拟机加载这个镜像文件就可以了。

SunRay/Sun VDI 和 JavaOne

在今年的 JavaOne 大会上,Sun 为7000多个参会者部署了 SunRay 瘦客户端,每个参会者可以通过150台 SunRay 登录 OpenSolaris 2009.06/Ubuntu 8.10/Windows 7 RC 三种不同的操作系统,Sun 通过 Sun VDI 和 VirtualBox 为用户提供了约21000个虚拟桌面。参会者在注册的时候会领到一张 Smart Card,通过这张卡可以在任意一台 SunRay 上登录自己的桌面系统。

sunray users

VDI 架构

这次 JavaOne 提供了150个 SunRay,设计目标是让400-500个桌面同时运行。大会使用了以下一些服务器和架构:

  • 4台 VDI 服务器,每台配置为 Sun Fire X4450/4 CPUs/64GB RAM;
  • 5台 VirtualBox 服务器,每台配置为 Sun Fire X4450/4 CPUs/6 cores per CPU/64 GB RAM,每台服务器可以应付100个虚拟桌面;
  • 3台存储服务器,每台配置为 Sun Storage 7210 Unified Storage System/2 Opteron CPUs/4 cores per CPU/64GB RAM/48X250GB 3.5 SATA HDD,每台服务器其实可以应付1000个虚拟桌面,但是考虑到很多参会用户来了就启动一个虚拟操作系统查查 Email,然后就关闭虚拟系统走人,这种频繁启动/关闭系统的行为会造成大量 IO,所以用了3台存储服务器来分担负载。

sun vdi architecture

只有2个管理员

21000个虚拟桌面系统 + 12台服务器 + 150台 SunRay,只有2个系统管理员!VPSee 深有体会,现在我们部署了60台 SunRay + 2台服务器后实际只有0.1个系统管理员在管理(相当于一个星期只用半天),比起 PC + Windows 的方案要省钱省力绿色得多。

only 2 system administrators

SunRay 在 GDM 里直接启动 VirtualBox

virtualbox

最近一直在折腾的 SunRay 已经测试和部署完毕,第一批40台 SunRay 客户端已经从 Solaris 服务器切换到 Linux,用户运行正常,服务器负载也较低,性能还不错,按照部署 Sun Ray 服务器的硬件配置要求,只用了一台 SunFire X2200 M2 就搞定了,配置是 AMD Opteron Quad Core 2.7GHz,8GB RAM,等前段时间订购的内存到了以后就升到 16GB.

如果 SunRay 用户想用 Windows 怎么办?有两种方法,一种是进入 Linux 桌面后用 RDP 远程访问 Windows Terminal Server 服务器;还有一种就是做个 Windows 虚拟机,SunRay 用户登录后进入自己的 Windows 虚拟机,这就是接下来要做的 VDI(Virtual Desktop Infrastructure)服务,只要 SunRay 用户打开 SunRay 瘦客户端后,就出现一个操作系统选择界面,选定一个操作系统后就可以登录进自己的想要的虚拟机。现在的问题是 Sun VDI 只支持 Solaris,而且不是免费的,其他支持 SunRay 的 VDI 产品还有 VMware VDI,VMware 虽然开源了客户端 VMware View Client,但是 VMware View(include VMware VDI)不免费。既然没有免费可用的 VDI,VPSee 就决定用其他的方法来模拟 VDI 的效果,无非就是登录 GDM 的时候提供一个可选的操作系统菜单、选择相应的虚拟系统登录嘛。

1、在 GDM 的 Select Session 上增加一个登录选项,注意 /usr/bin/startxp 脚本现在还没有,需要在后面创建。

# vi /usr/share/xsessions/xp.desktop

[Desktop Entry]
Encoding=UTF-8
Name=Windows XP
Comment=My Virtual Windows XP
Exec=/usr/bin/startxp
Icon=
Type=Application

2、下载和安装 VirtualBox,并设置哪个用户可以运行 VirtualBox.

# yum groupinstall "Development Tools"
# yum install kernel-devel

# rpm -ivh VirtualBox-3.0.8_53138_rhel5-1.x86_64.rpm
# /usr/sbin/usermod -a -G vboxusers yourusername

3、在 VirtualBox 上创建一个叫做 myxp 的虚拟机并安装 Windows XP.

4、创建 /usr/bin/startxp 脚本

# vi /usr/bin/startxp

#!/bin/bash
VirtualBox -startvm myxp

$ chmod 755 startxp

5、在 SunRay 上 Log out 后重新登录,在 Select Session 选项里选择 Windows XP 后就登录到虚拟机上了,shutdown 虚拟机后就又回到 GDM 登录界面。按照同样的方法,可以创建 Ubuntu/OpenSolaris 等多个其他操作系统,只要 VirtualBox 支持就行。

select windows xp session

也可以用这种方法在启动 GDM 的时候用 RDP/VNC/NX 等工具连接到远程虚拟机或者远程桌面,比如:

# vi /usr/bin/startrdp

#!/bin/bash
rdesktop 172.16.39.1

$ chmod 755 startrdp

如果想用 VMware 的话,也可以把 VirtualBox 换成 VMware Player,当然 Windows XP 要重新安装在 VMware 上。

vmplayer -X "/home/vpsee/.vmware/Windows XP/Windows XP.vmx"