首页 > 代码库 > 在VMware Workstation中批量创建上千台虚拟机(下)

在VMware Workstation中批量创建上千台虚拟机(下)


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

下面是学院移动版最新测试功能:文章打赏。如果你感觉作者的文章写的不错,可以通过“支付宝微信奖励作者一些银子,不需要太多,一点心意就可,不奖励就请投票吧,谢谢!

技术分享

技术分享

本文出自 “王春海的博客” 博客,谢绝转载!

在VMware Workstation中批量创建上千台虚拟机(下)