摘要


本发明涉及软件更新技术领域,尤其是一种虚拟机软件更新方法。本发明包括步骤:1、在创建虚拟机时虚拟一个光驱和串口;2、获取已安装软件的版本号;3、新版本后,将软件和版本号放入ISO镜像文件;4、将ISO镜像文件拷贝到宿主机上,并将其挂载到虚拟机的光驱中;5、在宿主机上向虚拟机的串口发送命令,获取软件版本进行比较;6、如果ISO镜像文件中的软件版本较新,那么对ISO镜像文件中的软件安装程序执行静默安装;否则,不执行任何安装。本发明提供了一种替代手工进行虚拟机软件更新的方法,可以用于虚拟机软件更新中。



权利要求(10)



1. 一种虚拟机软件更新方法,其特征在于:包括如下步骤: 步骤1 :在创建虚拟机时虚拟一个光驱,并虚拟一个串口; 步骤2 :软件安装以后,获取已安装软件的版本号; 步骤3 :新版本软件发布以后,将软件放入一个ISO镜像文件中,并将版本号放入ISO 镜像文件; 步骤4 :将ISO镜像文件拷贝到宿主机上,并将ISO镜像文件挂载到虚拟机的光驱中; 步骤5 :在宿主机上向虚拟机的串口发送命令,获取ISO镜像文件中的版本和安装在虚 拟机上的软件版本,并进行比较; 步骤6 :如果ISO镜像文件中的软件版本较新,那么对ISO镜像文件中的软件安装程序 执行静默安装; 步骤7 :如果安装在虚拟机上的软件版本与ISO镜像文件中的软件版本相同,或安装在 虚拟机上的软件版本较新,那么不执行任何安装。



2. 根据权利要求1所述的虚拟机软件更新方法,其特征在于:所述的ISO镜像文件是 以IS0-9660格式保存的光盘镜像文件,ISO镜像形式上只有一个文件,光盘上的所有文件 压缩到此文件中。



3. 根据权利要求1所述的虚拟机软件更新方法,其特征在于:所述将ISO镜像文件挂 载到虚拟机的光驱中是指在宿主机中将ISO镜像文件挂载成一个loop设备,然后把loop 设备作为虚拟机光驱的源,使得通过访问虚拟机的光驱能直接访问到ISO镜像文件中的内 容。



4. 根据权利要求2所述的虚拟机软件更新方法,其特征在于:所述将ISO镜像文件挂 载到虚拟机的光驱中是指在宿主机中将ISO镜像文件挂载成一个loop设备,然后把loop 设备作为虚拟机光驱的源,使得通过访问虚拟机的光驱能直接访问到ISO镜像文件中的内 容。



5. 根据权利要求1至4任一项所述的虚拟机软件更新方法,其特征在于:所述的向虚 拟机的串口发送命令是指在虚拟机上的一个串口监听程序收到宿主机向虚拟机串口发送 的消息,解析消息然后执行对应的操作。



6. 根据权利要求1至4任一项所述的虚拟机软件更新方法,其特征在于:所述的静默 安装是调用安装程序提供的静默安装方式执行静默安装和强制覆盖。



7. 根据权利要5所述的虚拟机软件更新方法,其特征在于:所述的静默安装是调用安 装程序提供的静默安装方式执行静默安装和强制覆盖。



8. 根据权利要求1至4任一项所述的虚拟机软件更新方法,其特征在于:所述的新旧 软件版本比较,包括如下步骤: 步骤1 :新旧版本号都进行按级分割,获取每一级的版本号; 步骤2:把每一级的版本号按从高到底排列,先将新旧版本号的第一级版本号进行比 较,如果新的版本号比旧版本号大,跳到步骤4;如果新的版本号比旧版本号小,跳到步骤 5 ;如果新的版本号跟旧版本号相同,那么执行下一级版本号的比较; 步骤3 :比较第二级的版本号,如此类推,直到最后一级的版本号都相同,那么新旧版 本号完全相同,不需要进行软件更新; 步骤4 :新版本比旧版本要高,需要进行软件更新; 步骤5 :新版本比旧版本还要旧,不需要进行软件更新。



9. 根据权利要求5所述的虚拟机软件更新方法,其特征在于:所述的新旧软件版本比 较,包括如下步骤: 步骤1 :新旧版本号都进行按级分割,获取每一级的版本号; 步骤2:把每一级的版本号按从高到底排列,先将新旧版本号的第一级版本号进行比 较,如果新的版本号比旧版本号大,跳到步骤4;如果新的版本号比旧版本号小,跳到步骤 5 ;如果新的版本号跟旧版本号相同,那么执行下一级版本号的比较; 步骤3:比较第二级的版本号,如此类推,直到最后一级的版本号都相同,那么新旧版 本号完全相同,不需要进行软件更新; 步骤4 :新版本比旧版本要高,需要进行软件更新; 步骤5 :新版本比旧版本还要旧,不需要进行软件更新。



10. 根据权利要求6所述的虚拟机软件更新方法,其特征在于:所述的新旧软件版本比 较,包括如下步骤: 步骤1 :新旧版本号都进行按级分割,获取每一级的版本号; 步骤2:把每一级的版本号按从高到底排列,先将新旧版本号的第一级版本号进行比 较,如果新的版本号比旧版本号大,跳到步骤4;如果新的版本号比旧版本号小,跳到步骤 5 ;如果新的版本号跟旧版本号相同,那么执行下一级版本号的比较; 步骤3 :比较第二级的版本号,如此类推,直到最后一级的版本号都相同,那么新旧版 本号完全相同,不需要进行软件更新; 步骤4 :新版本比旧版本要高,需要进行软件更新; 步骤5 :新版本比旧版本还要旧,不需要进行软件更新。



技术领域

[0001] 本发明涉及软件更新技术领域,尤其是一种虚拟机软件更新方法。


背景技术

[0002] 在云平台上的虚拟机运行以后,一般要对其上软件的进行维护,尤其是有部分云 平台上的虚拟机上需要安装功能增强软件的;比如Hyper-V的虚拟机上需要安装Hyper-V Integration Services,还有虚拟机支持监控需要安装的一些软件。需要更新时,一般都只 能通过人工一台一台进行安装。步骤一般如下:

[0003] 1、维护人员通过网络或挂载安装光盘或ISO镜像文件获取软件的安装程序;

[0004] 2、维护人员通过软件的版本信息对比,判断软件是否需要更新;

[0005] 3、如果需要更新,维护人员先卸载旧版本,然后运行新版本的安装程序,一步一步 进行安装。

[0006] 这种方法会有如下的问题:

[0007] 1、虚拟机上获取软件需要从其他地方下载,依赖于网络,在虚拟机网络受限(没 有配置IP地址或不能访问软件下载的地址)时,这种方法将无效;

[0008] 2、版本对比依赖于人工判断,容易出错;

[0009] 3、逐台进行人工升级,效率低,体现在两个方面:一、要登录到每台虚拟机,可能不 是一个人能掌握所有虚拟机的密码,如果不能登录,也将无法升级;二、依赖于人去逐个步 骤点击安装程序,需要的时间也比较多。


发明内容

[0010] 本发明解决的技术问题在于提供一种虚拟机软件更新方法,可以克服现有软件更 新的缺陷。

[0011] 本发明解决上技术问题的技术方案是:

[0012] 包括如下步骤:

[0013] 步骤1 :在创建虚拟机时虚拟一个光驱,并虚拟一个串口;

[0014] 步骤2 :软件安装以后,获取已安装软件的版本号;

[0015] 步骤3 :新版本软件发布以后,将软件放入一个ISO镜像文件中,并将版本号放入 ISO镜像文件;

[0016] 步骤4 :将ISO镜像文件拷贝到宿主机上,并将ISO镜像文件挂载到虚拟机的光驱 中;

[0017] 步骤5 :在宿主机上向虚拟机的串口发送命令,获取ISO镜像文件中的版本和安装 在虚拟机上的软件版本,并进行比较;

[0018] 步骤6 :如果ISO镜像文件中的软件版本较新,那么对ISO镜像文件中的软件安装 程序执行静默安装;

[0019] 步骤7 :如果安装在虚拟机上的软件版本与ISO镜像文件中的软件版本相同,或安 装在虚拟机上的软件版本较新,那么不执行任何安装。

[0020] 所述的ISO镜像文件是以IS0-9660格式保存的光盘镜像文件,ISO镜像形式上只 有一个文件,光盘上的所有文件压缩到此文件中。

[0021] 所述将ISO镜像文件挂载到虚拟机的光驱中是指在宿主机中将ISO镜像文件挂载 成一个loop设备,然后把loop设备作为虚拟机光驱的源,使得通过访问虚拟机的光驱能直 接访问到IS0镜像文件中的内容。

[0022] 所述的向虚拟机的串口发送命令是指在虚拟机上的一个串口监听程序收到宿主 机向虚拟机串口发送的消息,解析消息然后执行对应的操作。

[0023] 所述的静默安装是调用安装程序提供的静默安装方式执行静默安装和强制覆盖。

[0024] 所述的新旧软件版本比较,包括如下步骤:

[0025] 步骤1 :新旧版本号都进行按级分割,获取每一级的版本号;

[0026] 步骤2 :把每一级的版本号按从高到底排列,先将新旧版本号的第一级版本号进 行比较,如果新的版本号比旧版本号大,跳到步骤4;如果新的版本号比旧版本号小,跳到 步骤5 ;如果新的版本号跟旧版本号相同,那么执行下一级版本号的比较;

[0027] 步骤3 :比较第二级的版本号,如此类推,直到最后一级的版本号都相同,那么新 旧版本号完全相同,不需要进行软件更新;

[0028] 步骤4 :新版本比旧版本要高,需要进行软件更新;

[0029] 步骤5 :新版本比旧版本还要旧,不需要进行软件更新。

[0030] 本发明方案的有益效果如下:

[0031] 1、本发明的方法不依赖于人工判断,版本信息完全在虚拟机操作系统或软件安装 介质中取得,更新过程绝对准确;

[0032] 2、本发明的方法不依赖于虚拟机的网络,具有很广的使用范围;

[0033] 3、本发明的方法不需要人工干预,适合批量虚拟机更新软件,具有很高的效率。


附图说明

[0034] 下面结合附图对本发明进一步说明:

[0035] 附图是本发明的流程图。


具体实施方式

[0036] 如图所示,创建虚拟机、在虚拟机上安装旧版本软件以及获取ISO镜像文件都是 常规操作,不赘述。本发明下面以python语言实现一个虚拟机串口监听程序,以批处理脚 本实现windows虚拟机下的版本比较和软件静默安装为例,说明一种虚拟机软件更新方法 的实现。

[0037] 首先checkout出新旧两份源代码。

[0038] 然后在虚拟机中实现一个串口监听程序,启动以一个服务进程的方式运行于虚拟 机等待宿主机传来的串口命令,代码如下:

[0039] def listening(port):

if len(port) == 0: 
serport = serial.Serial(O) serport.baudrate = 9600 else serport = serial.Serial(port, 9600) try: 
serport, close() serport.open() except: mils.record_log("can't open serail port") 
return 1 
# before formal reading serial port,
 clean it's butfei #serport.flushOutput()
[0040] #serport.flushlnput〇
 serport. timeout = 1 serport.readlines() # flushlnput() not work, thus I read everythings out serport.closeQ
 try: while 1: 
msg = recv_msg(poit) send」
Tisg(port, process_msg(msg)) except Keyboardlnterrupt: print "caught terminate signal" return 0
[0041] 以上定义了一个listening函数,利用"whilel"死循环调用recv_msg(port)监 听指定的port端口。
[0042] 串口命令解析和实现功能根据串口命令监听功能接收到的msg信息,调用 process_msg(msg)进行msg消息的解析,代码如下:
[0043] def process_msg(msg):
 # the last params contain the \n code, 
cut it off first ret_msg = 0 cmd_param = msg.split(V) if cmd_param[0] in FUNCTION: 
ret_msg = FUNCTION[cmd_param[()]](cmd_param[l:]) mils.record_log("process command %s" %((lambda x: x==0 and
[0044] "success" or "fai1ed")(rel_msg))) else: rniis.record_log('receive unrecognized command (%s)' %(cmd_param [0])) ret_msg = 1 return str(ret_msg)
[0045] 代码中的FUNCTION对应的宏定义表示预定义的串口命令中相关格式,串口服务 中串口命令解析和实现功能解析成功以后,执行系统的命令。
[0046] def exec_cmd(cmd): log("Command to exec:(%s)!, %cmd) jprint('Cominand to exec is [%s]! %cmd) return os.system(cmd) # do not » 8, because windows not like linux

[0047] 代码中的cmd就是要执行的批处理脚本,如下:

[0048] @echo off :在安装目录中获取己安装软件的版本号 :getoldversion IF NOT EXIST ,instal14j\i4jparams.conf ( ECHO .install4j'\i4jparams.conf文件小存在,'尤法获取3前版木号 set oidversion=0.0.0 goto getCdrom ) FOR /F tokensA=4A delimsA=A" %%A in ('find "general
[0049] applicationName=,' .install4j\i4jparams.conf) do ( set oldversion=%%A ) echo 现有版本:%oldversion% :获取Windows虚拟机中所有的光驱盘符 :如果光驱盘符中有updates.xml文件(保存有新软件的版本号),则在此文件中 获取新版本号 :getCdrom wmic logicaldisk Where DriveType=5 Get Deviceld > disk.txt FOR /F tokensA=lA delimsA=A: %%A in ('find disk.txt') do ( IF EXIST %%A:\updates.xi-nl ( ECHO %%A:\updates.xml 文件存在 set diskName=%%A goto gctncwvcrsion ) ) echo请插入升级光盘,然后冉试 goto end :读取updates.xml文件中的新软件的版本号 :getnewversion
[0050] FOR /F tokensA=8A delimsA=A" %%A in ('find "entry targetMediaFileId=" %diskName%:\updates.xmr) do ( set newversion=%%A ) echo 可升级版本:%newversion% :比较新旧版本号 :compare version for/f"tokens= 1,2,3 delims=." %%a in ("%oldversion%") do ( set o 1 =%%a set o2=%%b set o3=%%c ) for /f"tokens= 1,2,3 delims=," %%a in ("%newversion%") do ( set n 1 =%%a set n2=%%b set n3=%%c ) if %〇!% lss %nl% (goto update) else (goto compare 1)
[0051] :compare 1 if %〇1% gtr %nl% (goto noupdate) else (goto compare2) :compare2 if %o2% lss %n2% (goto update) else (goto compare2_l) :cornpare2_l if %o2% gtr %n2% (goto noupdate) else (goto compare3) :compare3 if %o3% lss %n3% (goto update) else (goto compare3_l) :compare3_l if %o3% gtr %n3% (goto noupdate) else (goto sameversion) :执行静默安装 :update echo正在升级 if/i "%PROCESSOR-IDENTIF正R:〜0,3%" == "X86"(set arch=x86) else (set arch=x64) set fileNaine=VmAgent_%arch%_%n 1 %_%n2%_%n3%.exe IF NOT EXIST %diskName%:\%fileName% goto noupdatefile
[0052] echo正在安装升级文件 %diskName%:\%fileName% -q -overwrite echo安装升级完成 goto end :noupdate echo现有版本高于可升级版本,取消升级 goto end :sameversion echo现有版本与可升级版本相同,无需升级 goto end moupdatefile echo 升级义'件%diskName%:\%fileName%斗、存在 goto end :end〇


附图:


如何更新虚拟机BIOS 虚拟机软件更新_如何更新虚拟机BIOS