2 快速克隆100台Workstation虚拟机方法
在上一节的内容中,无论是创建"完全克隆"的虚拟机还是"克隆链接"的虚拟机,都是在VMware Workstation的图形界面中以向导的方式创建的,每次创建一个虚拟机都需要多个步骤才能完成。在创建的虚拟机数量有限的情况下,使用图形界面创建虚拟机还可以接受,如果需要批量创建多台虚拟机,例如创建几十台、上百台甚至上千台虚拟机时,反复的操作会让人"崩溃"。本文介绍采用VMware 提供的命令行工具vmrun.exe并通过编写批处理脚本的方式,实现虚拟机的批量创建、批量启动与批量关机。
2.1 vmrun命令简介
vmrun.exe是VMware Workstation中提供的一个命令行接口程序,可以实现对VMware Workstation虚拟机或远程VMware ESXi虚拟机的大多数管理功能,例如虚拟机的电源管理(开机、关机、休眠、重启、暂停、恢复)、快照管理(创建快照、列出快照、删除快照、恢复到指定快照点)、客户机命令管理(执行客户机中程序、添加管理共享文件夹、列表客户机进程、清除客户机进程)、注册虚拟机、删除虚拟机、克隆虚拟机等功能。
vmrun.exe保存在"C:\Program Files (x86)\VMware\VMware Workstation"文件夹中,可以在命令行中执行该程序。在命令窗口中进入C:\Program Files (x86)\VMware\VMware Workstation文件夹,执行vmrun /?可以查看帮助参数。vmrun的命令格式如下:
vmrun 认证标志 命令 参数
vmrun [AUTHENTICATION-FLAGS] COMMAND [PARAMETERS]
其中"认证标志(AUTHENTICATION-FLAGS)"包括以下选项。
--------------------
-h <hostName> (用于VMware Server、VMware ESXi、ESX Server,不适用于Workstation)
-P <hostPort> (用于VMware Server、VMware ESXi、ESX Server,不适用于Workstation)
-T <hostType> (ws|server|server1|fusion|esx|vc|player)
其中:
-T serve 用于 Server 2.0
-T server1 用于 Server 1.0
-T ws 用于 VMware Workstation
-T ws-shared 用于 VMware Workstation (shared mode)
-T esx 用于 VMware ESX
-T vc 用于 VMware vCenter Server
-u <主机系统用户名> (不适用于Workstation)
-p <主机系统用户密码> (不适用于Workstation)
-vp <加密虚拟机的密码>
-gu <客户机系统用户,客户机,指Workstation或ESXi的虚拟机>
-gp <客户机系统用户密码>
vmrun的命令包括POWER(电源)、SNAPSHOT(快照)、GUEST OS(客户机操作系统)、GENERAL(常规)等几项命令,每个命令又有参数及可选参数。下面介绍主要的vmrun命令。
为了在命令提示窗口中的任何位置执行vmrun.exe命令,你可以将vmrun.exe程序所在的路径添加到系统的PATH路径中。
(1)进入"系统属性",在"高级"选项卡中单击"环境变量"按钮,如图5-3-1所示。
图5-3-1 环境变量
(2)在"环境变量"中的"系统变量"中找到Path,单击"编辑"按钮,在"变量值"后面先输入一个英文的分号(:),然后将vmrun.exe程序的路径(C:\Program Files (x86)\VMware\VMware Workstation )"粘贴"到此,如图5-3-2所示。然后单击"确定"按钮完成设置。
图5-3-2 添加Path路径
【说明】当前示例计算机添加后的环境变量如下:
C:\ProgramData\Oracle\Java\javapath;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\VMware\VMware Workstation
你可以进入命令提示窗口之后通过执行path命令查看这一参数,如图5-3-3所示。
1 POWER COMMANDS(电源命令)。
POWER COMMANDS包括start(启动虚拟机或Team)、stop(关闭虚拟机或Team)、reset(虚拟机复位命令,可选参数为hard或soft)、suspend(休眠)、pause(暂停,暂停虚拟机的运行)、unpause(从暂停恢复)。这些命令的参数为"Path to vmx file",即包括详细路径的虚拟机配置文件。
例如,在一台Windows主机中(当前安装了VMware Workstation),启动一个虚拟机的命令如下。
vmrun -T ws start "c:\my VMs\myVM.vmx"
在安装了VMware Workstation的Windows主机中,启动远程ESXi主机中一个虚拟机的命令如下。
vmrun -T esx -h https://esxi主机的IP地址或域名/sdk -u hostUser -p hostPassword stop "[storage1] vm/myVM.vmx"
如果要停止、重启、休眠虚拟机,只要将这start换成stop、reset、suspend即可。
如果要在Mac计算机上安装了VMware Fusion,想启动其中的虚拟机,则需要如下的命令。
vmrun -T fusion start "~/Documents/Virtual Machines.localized/XP/XP.vmx"
2 SNAPSHOT COMMANDS(快照命令)
使用snapshot命令,可以管理指定虚拟机的快照,包括listSnapshots(列出指定虚拟机的快照,可选参数showTree,以树型方式显示)、snapshot(为指定虚拟机创建快照)、deleteSnapshot(删除快照)、revertToSnapshot(恢复到指定快照)。
例如在一台安装了VMware Workstation的Windows主机中,有一台Windows Server 2008 R2的虚拟机,这个虚拟机有多个快照,如图5-3-4所示。图
图5-3-4 查看当前虚拟机的快照
如果要显示该虚拟机的所有快照,可以执行如下命令:
vmrun -t ws listsnapshots "F:\VM_Temp\WS08R2-SP1数据中心版\WS08R2-SP1.vmx"
如果要以树型方式显示快照,则在vmx文件后面添加showtree参数。
vmrun -t ws listsnapshots "F:\VM_Temp\WS08R2-SP1数据中心版\WS08R2-SP1.vmx" showtree
该命令执行的结果如图5-3-5所示。图5-3-5 命令执行结果
3 GUEST OS COMMANDS(客户机系统命令)
使用GUEST OS COMMANDS命令参数,可以检查指定虚拟机中文件(fileExistsInGuest)或目录(directoryExistsInGuest)是否存在、设置共享文件夹(setSharedFolderState)、删除共享文件夹(removeSharedFolder)、启动虚拟机中指定的程序(runProgramInGuest)、列出虚拟机中执行程序进程、在虚拟机与主机之间拷贝文件等。
(1)runProgramInGuest ,在客户机中执行程序,必须参数为包括详细路径的vmx文件,可选参数为 -noWait、-activeWindow、-interactive。
例如,当前有一台Windows XP的虚拟机正在运行(这个虚拟机的配置文件为c:\VMS\XP\XP.vmx,如
图5-3-6所示。图5-3-6
一台正在运行的XP虚拟机
(2)当前虚拟机的登录帐户为Linna,密码为1234,如图5-3-7所示。图
(3)如果要在主机,启动这个虚拟机中的"计算器"程序,则可以执行如下命令
vmrun -T ws -gu linna -gp 1234 runProgramInGuest "C:\VMS\Xp\XP.vmx" "C:\windows\system32\calc.exe"
如图5-3-8所示。
图5-3-8 让虚拟机启动指定程序
在图3-3-8中,当虚拟机中的"计算器"程序退出时,命令提示符中命令行才会返回到C:提示符。如果不想让执行的程序"退出"后才返回到命令行,则可以添加-noWait。
vmrun -T ws -gu linna -gp 1234 runProgramInGuest "C:\VMS\Xp\XP.vmx"-nowait "C:\windows\system32\calc.exe"
(4)如果要检查虚拟机C:\temp中是否存在test.txt文件,则执行
vmrun -T ws -gu linna -gp 1234 fileExistsInGuest "C:\VMS\Xp\XP.vmx" "C:\\TEMP\\test.txt"
如果要想检查c:\temp文件夹是否存在,则执行
vmrun -T ws -gu linna -gp 1234 directoryExistsInGuest "C:\VMS\Xp\XP.vmx" "C:\\TEMP\\"
如果要执行脚本(脚本程序为c:\perl\perl.exe,脚本文件在根目录script.pl),格式如下。
vmrun -T ws -gu linna -gp 1234 runScriptInGuest C:\VMS\Xp\XP.vmx C:\perl\perl.exe C:\script.pl
(5)如果要禁用共享文件夹(以C:\VMS\Xp\XP.vmx为例,下同),则执行
vmrun-T ws -gu linna -gp 1234 disableSharedFolders "C:\VMS\Xp\XP.vmx"
如果要为指定虚拟机启用共享文件夹,则执行
vmrun-T ws -gu linna -gp 1234 enableSharedFolders "C:\VMS\Xp\XP.vmx"
将主机D盘根目录为指定虚拟机设置为共享文件夹,设置共享名为DDDD,命令如下
vmrun-T ws -gu linna -gp 1234 addSharedFolder "C:\VMS\Xp\XP.vmx" DDDD D:\
(6)如果要列出虚拟机中所有进程,则执行如下命令。
vmrun-T ws -gu linna -gp 1234 listProcessesInGuest"C:\VMS\Xp\XP.vmx"
如图5-3-9所示。
如果要杀除某个进程(如图图5-3-9中的“记事本”进程,该进程ID为636),则执行
vmrun-T ws -gu linna -gp 1234 killProcessInGuest "C:\VMS\Xp\XP.vmx" 636
(7)可以在主机与虚拟机之间拷贝文件,从主机到虚拟机拷贝文件命令为CopyFileFromHostToGuest,从虚拟机到主机拷贝文件命令为CopyFileFromGuestToHost。例如,如果要将主机g:\temp中的vncviewer-6.0.2.exe文件复制到虚拟机的C盘temp文件夹,命名为vnc2.exe,命令如下。
vmrun-T ws -gu linna -gp 1234 CopyFileFromHostToGuest "C:\VMS\Xp\XP.vmx" g:\temp\vncviewer-6.0.2.exe c:\temp\vnc2.exe
如果要复制的程序是带中文或空格,则需要用英文双引号包括,例如
vmrun-T ws -gu linna -gp 1234 CopyFileFromHostToGuest "C:\VMS\Xp\XP.vmx" "g:\temp\RAR3.51官方版.exe" "c:\temp\RAR3.51官方版.exe"
如果要从虚拟机复制到主机,则命令如下(从虚拟机C盘temp复制RAR3.51官方版.exe到G盘temp中命名为rar.exe。
vmrun-T ws -gu linna -gp 1234 CopyFileFromGuestToHost "C:\VMS\Xp\XP.vmx" "c:\temp\RAR3.51官方版.exe""g:\temp\rar.exe"
(7)如果要列出所有正在运行的虚拟机,则执行
vmrun–t ws list
(8)如果要为指定的虚拟机安装VMware Tools,则执行
vmrun-T ws installTools "C:\VMS\Xp\XP.vmx"
(9)如果要克隆虚拟机,则可以先关闭虚拟机,为虚拟机创建快照,之后再克隆虚拟机。
vmrun-T ws stop "C:\VMS\Xp\XP.vmx"
vmrun-T ws snapshot "C:\VMS\Xp\XP.vmx" fix1
vmrun-T ws clone "C:\VMS\Xp\XP.vmx" C:\VMS\XP01\XP01.VMX linked -snapshot=fix1 -cloneName=XP01
执行上述命令之后将为c:\vms\xp\xp.vmx虚拟机关机、创建一个名为fix1的快照,并从此快照创建出一个名为XP01、保存在c:\vms\xp01下的虚拟机。克隆的方式为“链接克隆”,如果要创建完全克隆的虚拟机,则参数改为full,命令如下。
vmrun-T ws clone "C:\VMS\Xp\XP.vmx" C:\VMS\XP02\XP02.VMX full -snapshot=fix1 -cloneName=XP02
(9)如果要删除快照,例如删除c:\vms\xp\xp.vmx中的快照fix1,则执行:
vmrun -T ws deleteSnapshot "C:\VMS\Xp\XP.vmx" fix1
2.2 编写脚本批量创建虚拟机
下面是一个编写好的批处理程序,可以实现批量创建虚拟机、批量启动虚拟机,并向虚拟机中添加配置文件、实现添加启用VNC连接并为不同虚拟机设置不同VNC连接端口的功能。
在本示例中,源虚拟机保存配置文件为“F:\VMS-2016\Windows 7\Windows 7.vmx”,该虚拟机安装好操作系统、应用程序之后关闭虚拟机。该脚本实现的功能主要如下。
(1)之后脚本会创建一个名为VM11的快照。
(2)克隆创建10个虚拟机(参数从1001到1010,如果你要修改虚拟机的数量,只需要修改文中的1010即可,例如要创建100个虚拟机则改为1100)。新克隆的虚拟机保存在F:\VMS-2017文件夹中。每个虚拟机分别保存在1001开始的子文件夹中,虚拟机名称以1001开始。
(3)向每个虚拟机添加启用VNC命令、添加虚拟机己复制命令、并指定VNC连接端口为虚拟机的顺序号,例如1001的虚拟机的VNC连接端口为1001。
(4)创建虚拟机完成后,可以间隔30秒启动虚拟机。如果你要修改启动间隔,修改ping -n 30 127.0.0.1中的30即可。
(5)之后可以间隔10秒停止虚拟机。
【注意】如果创建“克隆链接”的虚拟机,父虚拟机所在位置最好是在SSD磁盘,这样可以提高虚拟机的性能。如果要创建“完全克隆”的虚拟机,则将以下脚本中linked改为full。在实际的环境中,需要用你的虚拟机路径、克隆目标代替脚本中的路径。
编写的脚本内容如下。
REM 本批处理完成为虚拟机创建快照、从快照创建克隆链接的虚拟机、为虚拟机配置参数、启动虚拟机、停止虚拟机的功能
REM 王春海,2017年2月20日
C:
CD"C:\Program Files (x86)\VMware\VMware Workstation\"
REM 为指定的虚拟机,创建快照名称为VM11
vmrun-T ws snapshot "F:\VMS-2016\Windows 7\Windows 7.vmx" VM11
PAUSE 创建快照完成,按任意键继续
REM 创建克隆链接的虚拟机,克隆10个
for /l%%a in (1001,1,1010) do (
vmrun.exe-T ws clone "F:\VMS-2016\Windows 7\Windows 7.vmx" F:\VMS-2017\%%a\%%a.vmx linked -snapshot=VM11 -cloneName=%%a
)
PAUSE 克隆虚拟机完成,按任意键继续
REM 启用VNC,端口%%b,密码为空
@echoon
for /l %%bin (1001,1,1010) do (
echoanswer.msg.uuid.altered = "I Copied It">>F:\VMS-2017\%%b\%%b.vmx
echoRemoteDisplay.vnc.enabled = "TRUE" >>F:\VMS-2017\%%b\%%b.vmx
echoRemoteDisplay.vnc.port = "%%b" >>F:\VMS-2017\%%b\%%b.vmx
remecho RemoteDisplay.vnc.key = "" >>F:\VMS-2017\%%b\%%b.vmx
)
pause 配置端口完成,按任意键继续
REM 克隆完成,间隔30秒启动虚拟机
for /l%%c in (1001,1,1010) do (
vmrun.exe-T ws start F:\VMS-2017\%%c\%%c.vmx
ping-n 30 127.0.0.1 >nul
)
pause 启动虚拟机完成,按任意键继续
REM 下课,间隔30秒停止虚拟机
for /l%%d in (1001,1,1010) do (
vmrun.exe-T ws stop F:\VMS-2017\%%d\%%d.vmx
ping-n 30 127.0.0.1 >nul
)
PAUSE 关闭所有正在运行的虚拟机完成,按任意键退出
我在参加51CTO学院4周年最受欢迎讲师的活动,看完文章请顺手投我(王春海)一票,谢谢!投票链接:
http://edu.51cto.com/activityvote/voteLec
下面是学院移动版最新测试功能:文章打赏。如果你感觉作者的文章写的不错,可以通过“支付宝”或“微信”奖励作者一些银子,不需要太多,一点心意就可,不奖励就请投票吧,谢谢!