專利名稱::一種在虛擬機(jī)中自動(dòng)獲取和安裝軟件的方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及軟件獲取與安裝
技術(shù)領(lǐng)域:
,特別是一種在虛擬機(jī)中自動(dòng)獲取和安裝軟件的方法。
背景技術(shù):
:云計(jì)算對(duì)于虛擬機(jī)的應(yīng)用是通過(guò)預(yù)先安裝軟件,制作好虛擬機(jī)鏡像模板以達(dá)到快速、批量生成虛擬機(jī)的目的。在面臨操作系統(tǒng)與軟件眾多,且兩者之間可通過(guò)自由搭配來(lái)提供服務(wù)的應(yīng)用場(chǎng)景時(shí),需要預(yù)先制作的虛擬機(jī)模板數(shù)量就比較多,且會(huì)帶來(lái)以下問(wèn)題一是鏡像擴(kuò)展不方便,增加一個(gè)軟件時(shí),那么可能就需要重新制作與操作系統(tǒng)數(shù)量相匹配的虛擬機(jī)鏡像;二是耗時(shí)較長(zhǎng),制作鏡像時(shí)需要在物理機(jī)上相應(yīng)的操作系統(tǒng)里先做好對(duì)應(yīng)軟件的安裝,然后通過(guò)P2V的方式導(dǎo)出虛擬機(jī)鏡像,在P2V成功率無(wú)法達(dá)到100%的情況下,這樣做耗費(fèi)的時(shí)間無(wú)疑是比較長(zhǎng)的;三是用戶獲取軟件的途徑各種各樣,獲取的軟件無(wú)法保證其安全性,軟件中可能含有惡意代碼或病毒,一旦爆發(fā),對(duì)云計(jì)算中心的網(wǎng)絡(luò)將造成極大的影響;四是讓用戶自行安裝軟件時(shí)可能會(huì)發(fā)生誤操作而導(dǎo)致軟件無(wú)法正確安裝,或者配置有誤導(dǎo)致軟件無(wú)法正常工作。為了提升虛擬機(jī)應(yīng)用的效率,增強(qiáng)虛擬機(jī)鏡像制作的可擴(kuò)展性,需要一種通過(guò)預(yù)先定制虛擬機(jī)鏡像和相應(yīng)軟件,在虛擬機(jī)運(yùn)行起來(lái)后,進(jìn)行軟件自動(dòng)安裝的方式。
發(fā)明內(nèi)容本發(fā)明解決的技術(shù)問(wèn)題在于提供一種在虛擬機(jī)中自動(dòng)獲取和安裝軟件的方法,解決了為滿足不同的業(yè)務(wù)需求而需要制作大量虛擬機(jī)鏡像、獲取軟件而把病毒和惡意代碼引入虛擬機(jī)及軟件安裝復(fù)雜等問(wèn)題。本發(fā)明解決上述技術(shù)問(wèn)題的技術(shù)方案是包括如下步驟步驟I:制作一個(gè)虛擬機(jī)鏡像,上面包含一個(gè)虛擬串口,并默認(rèn)運(yùn)行一個(gè)代理客戶端模塊;步驟2:向虛擬機(jī)的串口發(fā)送預(yù)定的串口命令;步驟3:虛擬機(jī)的代理客戶端模塊監(jiān)聽(tīng)指定的虛擬串口,解析包含所要安裝軟件地址的串口命令;如果解析出來(lái)的軟件地址有效,執(zhí)行步驟4;如果解析出來(lái)的命令不正確或軟件地址無(wú)效,執(zhí)行步驟6;步驟4:虛擬機(jī)的代理客戶端模塊從地址獲取軟件;步驟5:虛擬機(jī)的代理客戶端模塊對(duì)獲取到的軟件執(zhí)行靜默安裝;步驟6:安裝結(jié)束。所述代理客戶端模塊包括串口命令處理模塊、軟件獲取模塊和軟件靜默安裝模塊,當(dāng)虛擬機(jī)進(jìn)入操作系統(tǒng)以后自動(dòng)運(yùn)行;所述串口命令處理模塊是一個(gè)跨平臺(tái)的模塊,接收特定串口的命令,并且負(fù)責(zé)解析串口命令,判斷命令是否符合約定的格式以及軟件地址是否能被訪問(wèn);所述軟件獲取模塊是一個(gè)從軟件庫(kù)中下載程序到虛擬機(jī)上的模塊,軟件庫(kù)可由FTP或HTTP服務(wù)器提供;所述軟件靜默安裝模塊是一個(gè)按照預(yù)先設(shè)置的值自動(dòng)執(zhí)行,不需要人工干預(yù)去安裝軟件的1吳塊;所述軟件靜默安裝模塊是一個(gè)同時(shí)滿足Windows虛擬機(jī)與Linux虛擬機(jī)的靜默安裝模塊。所述的串口命令格式為類型+分隔符()+URI,如10::ftp://192.168.1.2/office,rar,其中類型部分預(yù)留給程序擴(kuò)展使用,目前默認(rèn)為10,代表軟件地址。向虛擬機(jī)串口發(fā)送的軟件獲取和安裝的命令直接寫(xiě)入理機(jī)的設(shè)備文件。軟件靜默安裝模塊自動(dòng)適配操作系統(tǒng)的類型,根據(jù)類型的不同,Windows操作系統(tǒng)調(diào)用WindowsInstaller的msiexec.exe命令,Linux操作系統(tǒng)調(diào)用rpm命令(紅帽發(fā)行版)或deb命令(debian發(fā)行版)命令完成軟件的靜默安裝。本發(fā)明通過(guò)串口命令按需控制虛擬機(jī)自動(dòng)獲取與自動(dòng)安裝軟件,可以從一個(gè)基本的虛擬機(jī)鏡像自動(dòng)按需生成滿足不同業(yè)務(wù)需求的虛擬機(jī),而不需要去手動(dòng)制定大量的鏡像,同時(shí)在大量虛擬機(jī)需要統(tǒng)一安裝補(bǔ)丁的時(shí)候,本發(fā)明也提供了很大的便利性。本發(fā)明的虛擬機(jī)從指定軟件庫(kù)獲取所需軟件,各種軟件可以在一個(gè)地方統(tǒng)一管理,降低了虛擬機(jī)中安裝軟件而引入惡意代碼和病毒的風(fēng)險(xiǎn)。本發(fā)明向虛擬機(jī)串口發(fā)送的軟件獲取和安裝的命令直接通過(guò)寫(xiě)物理機(jī)的設(shè)備文件來(lái)實(shí)現(xiàn),不受網(wǎng)絡(luò)環(huán)境的影響,區(qū)別于一般的軟件安裝和升級(jí)程序受限于網(wǎng)絡(luò)的缺點(diǎn)。本發(fā)明能自動(dòng)適配操作系統(tǒng)的類型,區(qū)別于一般的軟件安裝和升級(jí)程序只能單一用于Windows或Linux的限制。下面結(jié)合附圖對(duì)本發(fā)明進(jìn)一步說(shuō)明圖I為本發(fā)明方法流程圖2為本發(fā)明代理客戶端模塊結(jié)構(gòu)框圖。具體實(shí)施例方式如圖I所示,先制作一個(gè)虛擬機(jī)鏡像,上面包含一個(gè)虛擬串口,并默認(rèn)運(yùn)行一個(gè)代理客戶端模塊,本過(guò)程可以由libvirt.xml中定義的一個(gè)虛擬串口來(lái)實(shí)現(xiàn),定義如下〈consoletype='pty'tty='/dev/pts'>〈sourcepath='/dev/pts'/>〈targettype='serial'port='0'/></console)這里定義了一個(gè)串口,端口號(hào)是0,表示C0MM1,并且映射到了物理機(jī)的/dev/pts設(shè)備文件上;代理客戶端模塊中的串口命令處理模塊接收串口命令并解析其內(nèi)容,本程序可由JavaCommunicationsAPI實(shí)現(xiàn),代碼如下/林*初始化串口監(jiān)聽(tīng)氺*throwsExceptionVpublicSerialMonitorinit()throwsException{try{portld=CommPortIdentifier.getPortldentifier(“C0MM1”);serialPort=(SerialPort)portld.open(“SerialMonitor,,,2000);System,out.println("Starttomonitordatafromserialport+portName);log.info(^Starttomonitordatafromserialport〃+portName);inStream=serialPort.getlnputStreamO;isPortOpen=true;}catch(NoSuchPortExceptionex){thrownewException(ex.toString());}catch(PortInUseExceptionex){thrownewException(ex.toString());}returnthis;}/#*處理接收到的數(shù)據(jù),分為3部分,一是類別,標(biāo)識(shí)符分別為10(軟件)、11(數(shù)據(jù))*二是軟件或數(shù)據(jù)源地址,三是軟件的默認(rèn)安裝命令,若沒(méi)有則以N替代*/publicvoidreadData(){try{byte[]readBuffer=newbyte[512];inti=0;while(inStream.available()>0){i=inStream.read(readBuffer);}Stringcommand=newString(readBuffer,0,i-I);log.info(^ReceiveCommand:\n〃+command);String口comms=command,split(〃〃);DataTypetype=DataType.getType(Integer.parselnt(comms));Stringparams=comms[2];DataRetrievedataRetieve=newDataRetrieve(type,comms[I],params);dataRetieve.retrieveData();}catch(Exceptione){log.error(e);e.printStackTrace();}}/#*解析URI,分解出協(xié)議頭、地址、端口、文件名、賬號(hào)等信息VprivatevoidparseURI(){//若為ftpif(uri.startsWith(〃ftp〃)){Stringaccount=uri.substring(uri.indexOf(〃//〃)+2,uri.indexOf("@"));String口accountArr=account.split(〃〃);userName=accountArr;password=accountArr[I];Stringpath=uri.substring(uri.indexOf(〃@〃)+1);Stringurl=path.substring(0,path.indexOf(〃/〃));String口urIArr=UrI.split(〃〃);host=urlArr;if(urlArr.length>l){PORT=Integer.parselnt(uriArr[I]);}ftPath=path.substring(path.indexOf(〃/〃)+1);fileName=path.substring(path.IastIndexOf(〃/〃)+1);IocalPath=Main.Default_Directory+fiIeName;}//處理HTTP協(xié)議請(qǐng)求的數(shù)據(jù)elseif(uri.startsWith(〃http〃)){}}代理客戶端模塊的軟件獲取模塊從串口命令輸入的軟件地址獲取軟件,本程序可由NettyClientAPI實(shí)現(xiàn),代碼如下/林*獲取數(shù)據(jù)*OthrowsException*/publicStringretrieveData()throwsException{try{client,download(ftPath,newFiIe(IocalPath),newDataTransferListener());if(type==DataType.SOFTWARE){Il執(zhí)行下一步安裝操作newSoftwareDeploy(localPath,fiIeName,instalIParams);}returnlocalPath;}catch(Exceptione){e.printStackTrace();thrownewException(e);}}代理客戶端的軟件靜默安裝模塊對(duì)下載的軟件進(jìn)行自動(dòng)安裝,針對(duì)Linux系統(tǒng),調(diào)用rpm命令或deb命令進(jìn)行靜默安裝;針對(duì)Windows系統(tǒng),分別針對(duì)zip壓縮文件與exe文件進(jìn)行不同的處理,代碼如下/林*處理壓縮文件*/privatevoidprocessCompressedFile(FiledestDir){StringBuffercomm=newStringBuffer(〃\〃〃).append(Main.Default—Directory)append(〃WinRar\\〃);//.zip和.rar壓縮文件解壓命令稍有不同if(filename.endsWith(〃zip〃)){comm,append(^WinRar.exe\"");}elseif(filename.endsWith(〃rar〃)){comm,append(^Rar.exe\";}comm,append(^x_o+V")append(path)append("V.append(destDir.getAbsolutePath()).append(〃\\\〃〃);System,out.println(comm.toString());intexitVal=0;try{Runtimetr=Runtime.getRuntimeO;Processproc=tr.exec(comm.toString());InputStreames=proc.getErrorStream();InputStreamReaderreader=newInputStreamReader(es);BufferedReaderbr=newBufferedReader(reader);StringBuffersb=newStringBuffer();StringI=〃〃;while((I=br.readLine())!=null){sb.append(I+'n");}log.error(sb.toString());exitVal=proc.waitFor();if(proc.waitFor()==0){if(proc.exitValue()==0){log.info("Uncompressingcomplete.〃);}}//查找并啟動(dòng)exe文件FileexeFile=findExeFile(destDir);Processproc2=tr.exec(〃\〃〃+exeFile.getAbsolutePath()+"\"");proc2.waitFor();}catch(IOExceptione){log.error(e);e.printStackTrace();}catch(InterruptedExceptione){e.printStackTrace();log.error(e);}System,out.println(exitVal);}/#*處理可執(zhí)行文件VprivatevoidprocessExecutableFile(){Stringcommand=path+〃〃+instalIParams;try{Runtimert=Runtime.getRuntimeO;Processproc=rt.exec(command);proc.waitFor();log.info("Software〃+filename+〃installsuccefully!〃);}catch(Exceptione){log.error(e);e.printStackTrace();}}/#*查找給定目錄中的第一個(gè)exe文件,若無(wú)則返回null氺paramdir氺returnVprivateFilefindExeFile(Filedir){File口children=dir.IistFiles();booleanisFind=false;for(Filefile:children){if(isFind){break;}if(file.isDirectory()){findExeFile(file);}elseif(file.isFile()){if(file.getAbsolutePath()endsWith("exe")){exeFile=file;}}}returnexeFile;}然后,向虛擬機(jī)的串口發(fā)送預(yù)定的串口命令,在宿主機(jī)上向虛擬機(jī)發(fā)送命令,本程序可用C語(yǔ)言在Linux下寫(xiě)串口設(shè)備的文件,代碼如下/**打開(kāi)串口,dev串口設(shè)備名,mode打開(kāi)方式,**/intopendev(char*dev,mode_tmode){intfd;fd=open(dev,mode);if(-1==fd){perror(〃Can,tOpenSerialPort〃);return-I;}else{fcntl(fd,F(xiàn)—SETFL,F(xiàn)NDELAY);returnfd;}}/口/#defineRSDEV—NAMEVdev/ttySl"intmain(void){intrsfd=0;intnwrite;charinput—buf[64];rsfd=opendev(RSDEV_NAME,0_RDWR|0—NOCTTY|0—NDELAY);if(rsfd<0){printf(〃openerror:/n〃);exit(-1);}set_speed(rsfd,9600);/*設(shè)置速率B9600*/if(set_parity(rsfd,8,I,'N')==FALSE){/*8位數(shù)據(jù)位,一位停止位*/printf(〃SetParityError/n〃);exit(-1);}while(I){fgets(input_buf>sizeof(input_buf),stdin);printf(〃input_buf=%s〃,input_buf);nwrite=write(rsfd,input_buf,strlen(input_buf));if(nwrite==-I){perror("ERROR!");exit(I);}else{printf(〃ret=%d/n〃,nwrite);}}}然后,虛擬機(jī)的代理客戶端模塊監(jiān)聽(tīng)指定的虛擬串口,解析串口命令,此操作由上述串口命令處理程序完成;然后,虛擬機(jī)的代理客戶端模塊從地址獲取軟件,此操作由上述軟件獲取模塊完成;最后,虛擬機(jī)的代理客戶端模塊對(duì)獲取到的軟件執(zhí)行靜默安裝,此操作由上述軟件靜默安裝模塊完成。權(quán)利要求1.一種在虛擬機(jī)中自動(dòng)獲取和安裝軟件的方法,其特征在于包括如下步驟步驟I:制作ー個(gè)虛擬機(jī)鏡像,上面包含一個(gè)虛擬串ロ,并默認(rèn)運(yùn)行ー個(gè)代理客戶端模塊;步驟2:向虛擬機(jī)的串ロ發(fā)送預(yù)定的串ロ命令;步驟3:虛擬機(jī)的代理客戶端模塊監(jiān)聽(tīng)指定的虛擬串ロ,解析包含所要安裝軟件地址的串ロ命令;如果解析出來(lái)的軟件地址有效,執(zhí)行步驟4;如果解析出來(lái)的命令不正確或軟件地址無(wú)效,執(zhí)行步驟6;步驟4:虛擬機(jī)的代理客戶端模塊從地址獲取軟件;步驟5:虛擬機(jī)的代理客戶端模塊對(duì)獲取到的軟件執(zhí)行靜默安裝;步驟6:安裝結(jié)束。2.根據(jù)權(quán)利要求I所述的在虛擬機(jī)中自動(dòng)獲取和安裝軟件的方法,其特征在于所述代理客戶端模塊包括串ロ命令處理模塊、軟件獲取模塊和軟件靜默安裝模塊,當(dāng)虛擬機(jī)進(jìn)入操作系統(tǒng)以后自動(dòng)運(yùn)行;所述串ロ命令處理模塊是ー個(gè)跨平臺(tái)的模塊,接收特定串ロ的命令,并且負(fù)責(zé)解析串ロ命令,判斷命令是否符合約定的格式以及軟件地址是否能被訪問(wèn);所述軟件獲取模塊是ー個(gè)從軟件庫(kù)中下載程序到虛擬機(jī)上的模塊,軟件庫(kù)可由FTP或HTTP服務(wù)器提供;所述軟件靜默安裝模塊是一個(gè)按照預(yù)先設(shè)置的值自動(dòng)執(zhí)行,不需要人工干預(yù)去安裝軟件的ホ吳塊;所述軟件靜默安裝模塊是ー個(gè)同時(shí)滿足Windows虛擬機(jī)與Linux虛擬機(jī)的靜默安裝模塊。3.根據(jù)權(quán)利要求I所述的在虛擬機(jī)中自動(dòng)獲取與自動(dòng)安裝軟件的方法,其特征在于所述的串ロ命令格式為類型+分隔符()+URI,其中類型部分預(yù)留給模塊擴(kuò)展使用。4.根據(jù)權(quán)利要求2所述的在虛擬機(jī)中自動(dòng)獲取與自動(dòng)安裝軟件的方法,其特征在于所述的串ロ命令格式為類型+分隔符()+URI,其中類型部分預(yù)留給模塊擴(kuò)展使用。5.根據(jù)權(quán)利要求I至4任一項(xiàng)所述的在虛擬機(jī)中自動(dòng)獲取與自動(dòng)安裝軟件的方法,其特征在干向虛擬機(jī)串ロ發(fā)送的軟件獲取和安裝的命令直接寫(xiě)入理機(jī)的設(shè)備文件。6.根據(jù)權(quán)利要求2或4所述的在虛擬機(jī)中自動(dòng)獲取與自動(dòng)安裝軟件的方法,其特征在于軟件靜默安裝模塊自動(dòng)適配操作系統(tǒng)的類型,根據(jù)類型的不同,Windows操作系統(tǒng)調(diào)用WindowsInstaller的msiexec.exe命令,Linux操作系統(tǒng)調(diào)用rpm命令或deb命令完成軟件的靜默安裝。7.根據(jù)權(quán)利要求5所述的所述的在虛擬機(jī)中自動(dòng)獲取與自動(dòng)安裝軟件的方法,其特征在于軟件靜默安裝模塊自動(dòng)適配操作系統(tǒng)的類型,根據(jù)類型的不同,Windows操作系統(tǒng)調(diào)用WindowsInstaller的msiexec.exe命令,Linux操作系統(tǒng)調(diào)用rpm命令或deb命令完成軟件的靜默安裝。全文摘要本發(fā)明涉及軟件獲取與安裝
技術(shù)領(lǐng)域:
,特別是一種在虛擬機(jī)中自動(dòng)獲取和安裝軟件的方法。本發(fā)明首先制作一個(gè)虛擬機(jī)鏡像,里面默認(rèn)開(kāi)通一個(gè)虛擬串口,并且設(shè)置開(kāi)機(jī)運(yùn)行一個(gè)代理客戶端模塊;虛擬機(jī)管理程序向虛擬串口發(fā)送軟件安裝的命令;虛擬機(jī)上的代理客戶端模塊監(jiān)聽(tīng)虛擬串口,接收并解析串口命令,命令中包含了要安裝軟件的獲取地址;如果地址有效的話,那么代理客戶端模塊就獲取軟件并執(zhí)行靜默安裝,否則不安裝。本發(fā)明解決了為滿足不同的業(yè)務(wù)需求而需要制作大量虛擬機(jī)鏡像、獲取軟件而把病毒和惡意代碼引入虛擬機(jī)及軟件安裝復(fù)雜等問(wèn)題;可應(yīng)用于虛擬機(jī)的軟件獲取與安裝上。文檔編號(hào)G06F9/445GK102707971SQ201210125940公開(kāi)日2012年10月3日申請(qǐng)日期2012年4月26日優(yōu)先權(quán)日2012年4月26日發(fā)明者季統(tǒng)凱,岳強(qiáng),莫展鵬申請(qǐng)人:廣東電子工業(yè)研究院有限公司