Convertim mașinile virtuale VMWare în Hyper-V și invers. Exportarea și importul unei mașini virtuale Hyper-V

Simptomele problemei

În cazul în care doriți să transferați o mașină virtuală de pe un server Hyper-V 2008 R2 pe un server Hyper-V 2012 R2, veți întâmpina probleme: după exportarea mașinii virtuale de pe Hyper-V 2008 R2 și copierea fișierelor pe noul server , când încercați să importați în Hyper-V 2012 R2 Veți primi un mesaj ca:
Hyper-V nu a găsit mașini virtuale de importat din locația d:\..
sau
Hyper-V nu a putut găsi mașini virtuale de importat din locația d:\..

Cauzele problemei

Hyper-V în 2012 R2 utilizează o nouă versiune a WMI 2.0, care nu acceptă fișiere .EXP rezultate din export Mașini Hyper-V 2008 R2, care utilizează WMI 1.0. Prin urmare, soluția în în acest caz,: copiere+import, deoarece importul fără export al unei mașini virtuale este acceptat la nivelul Server 2012 R2 și aceste .exp pur și simplu nu sunt prezente în timpul importului, așa că totul merge bine).
@Spațiul de nume pentru versiunea 1.0 a WMI este depreciat. Pregătiți-vă să adaptați scripturile pentru un spațiu de nume revizuit.@
@Rădăcina WMI\spațiul de nume de virtualizare este depreciat. Noul spațiul de nume este root\virtualization\v2.@
http://technet.microsoft.com/en-us/library/hh831568.aspx

Rezolvarea problemei

Este necesar să folosiți nu export+import, ci copiere+import. Faceți următoarele:

  1. Opriți mașina virtuală (VM) care trebuie migrată.
  2. Copiați fișierul .XML care conține configurația mașinii virtuale, precum și fișierele .VHD sau .VHDX hard disk-uri mașină virtuală către noul server.
  3. Importați o mașină virtuală în Hyper-V 2012 R2
  4. Dacă ați exportat deja o mașină virtuală, pur și simplu ștergeți (sau redenumiți) fișierul cu extensia .EXP situat în folderul cu VM-ul exportat.
  1. Când exportați (sau pregătiți o mașină virtuală pentru transfer), opriți mașina virtuală, accesați configurația acesteia și comutați adresa MAC placă de rețea de la dinamică la statică. În acest caz, în mod implicit, cea veche va fi oferită ca adresă MAC statică Rețeaua MAC carduri.
    Acest lucru vă va permite să nu reconfigurați parametrii TCP/IP în mașina virtuală după transfer, deoarece adresa MAC a cardului nu se va schimba și sistemul de operare va presupune că placa de retea aceeasi.
  2. Puteți (acest lucru este recomandat de Microsoft) să schimbați (în timpul transferului mașinii virtuale) tipul de utilizare RAM: Atribuiți alocarea RAM statică. După importarea mașinii virtuale (pe noul server), puteți configura din nou alocarea RAM dinamică.
  3. Dacă aveți mai multe mașini virtuale pe aceeași gazdă, uneori poate fi dificil să aflați ce fișier .XML aparține mașinii virtuale dorite: toate fișierele XML pot ajunge în același folder. E bine! Copiați-le pe toate! Când importați o mașină virtuală, specificați folderul care conține aceste fișiere XML, iar Hyper-V 2012 R2 vă va cere să selectați mașina virtuală dorită de importat.
  4. La import (dacă transferați o mașină virtuală - adică pe vechiul server, aceasta va fi ștearsă ca rezultat și aceeași VM ar trebui să ruleze pe cel nou), selectați cum să importați:
    1. Înregistrați mașina virtuală în loc - înregistrați un VM într-o locație cu același ID;
    2. Restaurați mașina virtuală - copiați VM-ul într-un alt folder, lăsați ID-ul neschimbat;
      Pentru a migra o VM, selectați această opțiune.
    3. Copiați mașina virtuală - copiați VM într-un alt folder și generați un nou ID pentru acesta.
  5. Deoarece importarea (printre altele) necesită copierea fișierelor de pe hard disk, în caz că fișiere mari VHD(X) Vreau să accelerez acest proces. În acest scop, copiați (sau mutați) fișierul VHD direct în folderul în care va fi localizat după importarea mașinii virtuale. Apoi, în timpul procesului de import, Hyper-V 2012 R2 vă va întreba în ce folder să obțineți fișierele hard disk ale mașinii virtuale importate, precum și unde să le copiați în timpul procesului de import. Pentru ambele întrebări, indicați folderul în care ați plasat fișierul VHD al VM-ului importat. Adică veți avea același folder „de unde să copiați disc virtual„ și „unde să salvezi discul virtual”.

Materialele au fost folosite la pregătirea articolului.

Hyper-V - configurarea rețelei, crearea puncte de control, import și export de mașini virtuale.

În mod implicit, toate mașinile virtuale Hyper-V sunt în esență sandbox și complet izolate de alte computere și rețele. Și dacă doriți ca mașina dvs. virtuală să comunice cu alte VM, computere fizice, rețea și Internet, trebuie să creați un comutator virtual. Puteți face acest lucru în managerul Hyper-V făcând clic pe Virtual Switch Manager în panoul său din dreapta.

Dar mai întâi trebuie să decideți ce fel de comutator virtual creați. Și Virtual Switch Manager oferă o descriere text a fiecărui tip de comutator.

Dacă doriți ca dvs. să vadă și să acceseze fișierele de pe computerul gazdă și din rețeaua dvs., trebuie să selectați un comutator extern. Aceeași opțiune oferă acces VM la Internet. Opțiunile de comutare interne și private permit virtual Mașini Hyper-V comunica doar între ele. Odată ce v-ați decis asupra acestei opțiuni, faceți clic pe butonul de creare a comutatorului virtual.

În continuare, trebuie să configurați opțiunile pentru comutatorul dvs. virtual. Lucrul important aici este să determinați la ce adaptor de rețea de pe computerul dvs. îl conectați. Computerul dvs. poate fi cu fir sau conexiune fără fir. Alege-l pe cel potrivit.

Cheie. Să presupunem că doriți ca mașina dvs. virtuală să acceseze fișierele de pe computerul gazdă, dar să nu aibă acces la rețea sau la Internet. Dacă computerul are o conexiune prin cablu și fără fir, conectați comutatorul la ceva pe care nu îl utilizați pentru a accesa Internetul. Daca nu ai fizic cablu de rețea, selectați nu Conexiune WiFi. În acest fel, VM-ul va avea acces doar la PC-ul principal și va fi izolat de malware și atacuri externe.

După ce ați creat un comutator virtual, trebuie să îl conectați la mașina virtuală. În zona centrală a Hyper-V Manager, faceți clic pe VM-ul corespunzător. Apoi, în zona din dreapta jos, faceți clic pe setări. Care va deschide setările mașinii virtuale.

În panoul din stânga, faceți clic pe opțiunea adaptor de conectare. Dacă nu vedeți această opțiune, faceți clic pe Adăugare hardware și adăugați adaptor de rețea. Caracteristica utilă- gestionarea lățimii de bandă, care poate controla utilizarea VM lățime de bandă rețeaua dvs. Această ajustare asigură că mașina virtuală are necesarul conexiune la rețea, dar nu consumă resurse suplimentare.

În partea de sus a setărilor adaptorului de rețea, selectați comutatorul virtual pe care l-ați creat și faceți clic pe OK. Nu este nevoie să configurați nimic altceva. Mașina ta virtuală are acum acces la rețea.

Atenţie. Deși multe opțiuni pot fi modificate în setările mașinii virtuale în sine, unele dintre ele care au fost setate la crearea mașinii virtuale pot fi modificate doar prin oprirea acesteia.

Crearea punctelor de control Hyper-V

Dacă faceți modificări semnificative Windows 8.1, de exemplu, instalarea program desktop sau Actualizări Windows, este creat un punct de restaurare a sistemului. Adică, o copie a fișierelor critice ale sistemului de operare este salvată, cum ar fi Registrul Windows, înainte de a se schimba. Și dacă ceva nu merge bine, modificarea poate fi anulată și revenită la o stare anterioară a Windows.

Hyper-V are și propria funcție de punct de control - . Acesta este un instantaneu pe care îl puteți face oricând. Pentru a face acest lucru, în panoul central al managerului Hyper-V, selectați VM pentru care doriți să creați un instantaneu și în colțul din dreapta jos al ferestrei de control, faceți clic pe linkul punctului de control.

Punctele de control pe care le creați apar în Hyper-V Manager Center. Puteți să faceți clic pe oricare dintre ele și să rulați înapoi mașina virtuală la acel punct, să exportați instantaneul sau să îl ștergeți.

Hyper-V - import și export de mașini virtuale

Uneori poate fi necesar să creați o mașină virtuală și să o utilizați pe alt computer sau să salvați o copie a mașinii virtuale. Pur și simplu creați un VM, copiați acest fișier pe alt computer și deschideți-l acolo nu va funcționa. Pentru a importa o mașină virtuală în Hyper-V, există o opțiune specială de import și export. Pentru a exporta VM, în Hyper-V Manager, selectați această opțiune. În colțul din dreapta jos al ferestrei Hyper-V Manager, vor apărea opțiunile de export. Faceți clic pe el și veți fi întrebat în ce folder doriți să salvați copia VM-ului. Procesul de export este invizibil și destul de rapid.

  • Puteți importa apoi o mașină virtuală exportată anterior în Hyper-V. Pentru a face acest lucru, fără a selecta VM-ul în colțul din dreapta sus al ferestrei managerului Hyper-V, faceți clic pe link-ul de import mașină virtuală.

  • Asistentul de importare a mașinii virtuale se va deschide și vă va întreba în ce folder (nu fișier) se află copia salvată a mașinii virtuale.

  • Veți vedea apoi numele VM și detaliile de creare a acestuia. Dacă acesta este ceea ce căutați, faceți clic pe următorul.

  • Acum veți fi întrebat cum doriți să importați VM. Există trei posibilități pentru aceasta:
  1. Mașină virtuală înregistrată. Folosit dacă efectuați un import direct. VM-ul se află în același folder în care a fost exportat și doriți să îl lăsați acolo.
  2. Restaurarea unei mașini virtuale. Folosit dacă VM-ul nu se află în folderul în care a fost exportat. De exemplu, aceasta este o copie realizată din imaginea principală de pe server.
  3. Copie mașină virtuală. Folosit dacă doriți să creați o copie locală a unui VM existent, lăsând-o pe cea „principală” intactă, de exemplu, pentru a o importa ulterior pe un alt PC. Această opțiune este folosită și dacă creați o copie a unui VM deja importat.

Atenţie. Dacă importați un VM fără să faceți o copie a acestuia, orice modificări pe care le faceți și orice problemă vor rămâne în el și vă pierdeți efectiv copia principală curată.

  • Dacă doriți să creați o copie a mașinii virtuale, veți fi întrebat unde doriți să o salvați.

  • Ultimul pas este confirmarea setărilor selectate.

Integrarea serviciilor suplimentare într-o mașină virtuală

Unele sisteme de operare, mai ales mai multe versiuni timpurii Windows nu oferă acces la rețea sau altele funcțiile necesare. Și va trebui să activați funcții suplimentare VM. Acest lucru trebuie făcut într-o mașină virtuală care rulează.

Aceste caracteristici suplimentare care sunt cerute de unii sisteme de operare, includ capacitatea de a muta cursorul mouse-ului între desktopul principal și mașina virtuală deschisă. Acestea includ, de asemenea, suport pentru rețea și USB.

În meniul Acțiuni, faceți clic pe Instalare servicii de integrare. Și se va încărca pentru tine Fișier ISO conţinând softwareîmbunătățirea funcționalității mașinii virtuale.

3 iunie 2011 la 20:40

PowerShell+Hyper-V

  • Virtualizare

nu mai pot folosi gui...

Cam așa a început conversația mea cu un prieten care, într-o perioadă scurtă de timp, a trebuit să exporte mașini virtuale din Hyper-V de mai multe ori la rând. De obicei, acest lucru se face folosind Hyper-V Manager (HVM), care este instalat împreună cu rolul Hyper-V sub Windows Server 2008 R2. Trebuie să recunosc că interfața acestui program nu trezește în mine nicio emoție negativă. Dintre toate programele de management pe care Microsoft le furnizează pentru Server, acesta mi se pare cel mai convenabil și de înțeles (compar, de exemplu, cu IIS Manager, care provoacă confuzie în rândul utilizatorilor noi și indignare violentă în rândul celor care au folosit IIS 6 în 2003 Server) . Cu toate acestea, dacă trebuie să exportați sau să importați o mașină virtuală în cantitate de N bucăți într-o perioadă de timp de t, atunci folosind Hyper-V Manager puteți rupe butonul mouse-ului și urâți îngrozitor Hyper-V. Aici vine PowerShell în ajutor.
Import-Modul HyperV
... Și implicit nu există un astfel de modul în PowerShell. Microsoft a decis că nimeni nu va scrie cmdleturi pentru a gestiona Hyper-V (o idee cu adevărat sălbatică). Pe de altă parte, această lume este plină de oameni care știu cum și sunt gata să simplifice viața pentru ei înșiși și pentru alți utilizatori. Așa a luat naștere PowerShell management Library pentru Hyper-V.
Primul lucru pe care trebuie să-l faci este să descarci acest modul + documentație, după gustul tău. (Ambele disponibile la: http://pshyperv.codeplex.com/releases)
Apoi, trebuie să instalați acest modul. Procesul nu este complicat (fișierul de instalare pe care îl rulați se dă de la sine).
Acum poți lucra. Lansăm PowerShell, importăm modulul (ce este scris în subtitrare).
Și avem acces la toate funcțiile pe care le-am putea folosi prin HVM, iată câteva dintre ele:

Conectarea la o mașină virtuală
New-VMConnectSession

Manipularea stării mașinilor virtuale
Obține-VMState, Set-VMState, Convert-VmState,
Ping-VM, Test-VMHeartBeat, Shutdown-VM, Start-VM, Stop-VM, Suspend-VM
Obțineți-VMKVP, Adăugați-KVP, Eliminați-KVP, Obțineți-VMJPEG

Abilitatea de a face copii de rezervă, de a exporta mașini virtuale și de a face instantanee
Export-VM, Import-VM, Obține-VMSnapshot, Alege-VMSnapshot, Aplică-VMSnapshot, Nou-VMSnapshot ,Elimină-VMSnapshot, Redenumire-VMSnapShot, Actualizare-VMSnapshot, Get-VMSnapshotTree, Get-VmBackupScript

Adăugarea și eliminarea virtualului. mașini, stabilindu-le proprietățile
New-VM, Remove-VM, Set-VM, Get-VMCPUCount, Set-VMCPUCount, Get-VMMemory, Set-VMMemory, Set-VMSerialPort

Gestionarea controlerelor de disc
Get-VMDiskController
Adăugați-VMSCSIcontroller, Eliminați-VMSCSIcontroller
Get-VMDriveByController, Add-VMDRIVE, Remove-VMdrive
Get-VMDiskByDrive, Add-VMDISK, Set-VMDisk, Get-VMDisk
Obțineți-VMFloppyDisk, Adăugați-VMFloppyDisk
Adăugați-VMNewHardDisk

Managementul interfeței de rețea
Get-VMNIC, List-VMNic, Choose-VMNIC, Add-VMNIC, Remove-VMNIC, Set-VMNICAddress, Set-VMNICConnection, Get-VMNICport,
Get-VMnicSwitch, Alege-VMSwitch, New-VMSwitchPort, Get-VMByMACaddress, Alege-VMExternalEthernet,
New-VMExternalSwitch, New-VMInternalSwitch, New-VmPrivateSwitch

Lucrul cu fișiere VHD
Get-VHDDefaultPath, Get-VHDInfo, New-VHD, Compact-VHD, Test-VHD, Convert-VHD, Merge-VHD, Mount-VHD, Unmount-VHD

Toate comenzile date vorbesc de la sine.
De exemplu, pentru a obține starea unei mașini virtuale, trebuie doar să introduceți:
Listă-VMState nume virt. mașini
si ca urmare:

În exemplul meu, există o singură mașină virtuală => nu am specificat niciun parametru, dar dacă aveți mulți dintre ei, atunci probabil că ar trebui să specificați în mod explicit numele acesteia dacă nu doriți să treceți prin ieșirea consolei mai târziu.
De asemenea, este ușor, de exemplu, să aflați despre cel folosit interfețe de rețea pentru mașinile virtuale, trebuie doar să introduceți:
Ia-VMNic
și obținem:

Ei bine, cel mai bun lucru este ceea ce aveam nevoie prieten - oportunitate exportați în fundal, într-un program. Pentru a face acest lucru, puteți scrie un cmdlet pe care apoi îl puteți introduce în Scheduler. De exemplu, pentru mine acest cmdlet oprește mașina virtuală, o exportă, o pornește din nou și îmi trimite o scrisoare despre eroarea sau succesul cmdlet-ului. După aceasta, controlul este transferat către un alt script care arhivează și trimite o copie de rezervă la un ftp la distanță.
Export: export-vm -vm MyVM1 -path D:\backups\VM -copystate -wait -force
Parametrul -copystate spune că totul trebuie copiat (inclusiv discul virtual => dimensiunea exportului de ieșire poate fi foarte mare)

În loc de o concluzie
După cum puteți vedea, gestionarea dvs mașini virtuale de la PowerShell poate fi foarte convenabil și fără stres. Trebuie doar să citiți parametrii comenzilor de care aveți nevoie și să vă scrieți scriptul.

P.S. Nu pretind deloc că „descoperă America” doar am decis că cineva va găsi utile informațiile despre acest modul util. Am descris doar cele mai multe opțiuni simple pentru care puteți utiliza biblioteca de gestionare PowerShell pentru Hyper-V. Dacă cineva știe sau și-a scris mai multe instrumente convenabile pentru a optimiza lucrul cu Hyper-V, voi fi bucuros să aflu despre ele.

Mecanismul de export-import din hypervisorul Hyper-V este conceput pentru a muta mașinile virtuale de la un computer sau server la altul. Exportul înseamnă, în esență, copierea unei mașini virtuale, păstrând complet configurația acesteia. La export, virtualul hard disk, setări hardware, momente salvate ale sistemului de operare invitat, create (instantanee).

Mecanismul de export-import Hyper-V poate fi folosit și pentru a crea o mașină virtuală clonă pe același server sau computer pentru testare și interacțiune cu mașina virtuală originală. O mașină de clonare poate primi un alt ID (identificator), o adresă IP internă diferită în rețeaua Hyper-V, drept urmare, de fapt, nu va fi diferită de mașinile virtuale create de la zero.

Mai jos vom analiza mai detaliat procesul de export și import a unei mașini virtuale folosind exemplul inclus în Windows 10.

Probleme acoperite:

1. Exportați o mașină virtuală

Unul dintre avantaje noua versiune Hyper-V, inclus în Windows Server 2012 R2, client sisteme Windows 8.1 și 10, este capacitatea de a efectua unele sarcini care necesită mult resurse, în special, exportul din mers, în timp ce mașina virtuală rulează, fără a o opri, chiar și fără a o întrerupe. Exportul se efectuează către fundal, nu trece repede pentru ca implica o cantitate mica resursele sistemului, lăsând utilizatorului posibilitatea de a continua lucrul cu mașina virtuală.

Cum se exportă o mașină virtuală? Selectați mașina virtuală dorită în managerul Hyper-V și apelați meniul contextual. Avem nevoie de o comandă „Export”.

2. Exportați un instantaneu al mașinii virtuale

Altul referitor la caracteristică nouă Hyper-V, care nu era prezent în vechile camere de server versiuni Windows– capacitatea de a exporta un punct de control separat, adică starea mașinii virtuale la momentul creării acestui punct de control. Anterior, hypervisorul Microsoft asigura doar export-import al întregii mașini virtuale. Și dacă era nevoie de starea unui anumit punct de control, era necesar să exportați mașina virtuală cu toate punctele sale de control și, după importare, să reveniți la cel dorit. Hyper-V vă permite acum să exportați fiecare punct de control individual. După ce a exportat un singur instantaneu, acesta poate fi apoi importat ca o nouă mașină virtuală, în special cu propriul său ID unic, pe același server sau computer.

Pentru a exporta o mașină virtuală dintr-un punct de control, selectați atât mașina, cât și punctul de control în managerul Hyper-V. În ultimul, apelați meniul contextual și selectați „Export”.

3. Fiabilitatea formatului de export Hyper-V

Exportarea unei mașini virtuale Hyper-V nu se face într-un format de fișier comprimat separat, unde și virtual hard disc și fișierele de configurare și starea salvată a sistemului de operare invitat, așa cum, de exemplu, aceasta este oferită de mecanismul de export-import în Programul VirtualBox. În cazul virtualului Aparatele VirtualBox Export-import este posibil cu participarea unui intermediar - un fișier OVA. Dacă acest fișier este deteriorat, importați fișierul virtual Aparatele VirtualBox s-ar putea să nu se întâmple. Dar în cazul Hyper-V, exportul unei mașini virtuale înseamnă copierea completă a virtualului hard diskîn formatul său original – VHDX (sau VHD).

În acest fel, dacă alte date de export sunt corupte, mașina virtuală poate fi încă recreată. Va trebui să creați o nouă mașină virtuală folosind Hyper-V folosind fișier existent VHDX (VHD).

4. Importați o mașină virtuală

Mașina virtuală exportată poate fi importată ulterior în versiune compatibilă Hyper-V ca parte a edițiilor de server ale Windows și Client Windows 8.1 și 10.

Pentru a importa o mașină virtuală, selectați funcția corespunzătoare în Hyper-V Manager.

În fereastra următoare, utilizați butonul de răsfoire și specificați calea către folderul cu mașina virtuală exportată. Faceți clic pe „Următorul”.

Selectați mașina virtuală dorită dacă există mai multe dintre ele în folderul specificat. Faceți clic pe „Următorul”.

Apoi trebuie să alegeți cum va fi importată mașina virtuală. Dacă a fost transferat de pe un alt server sau computer, puteți utiliza primul tip de import, care presupune înregistrarea lui folosind identificatorul original. Această opțiune înregistrează mașina virtuală în același dosar în care sunt stocate fișierele sale de export, astfel încât să nu fie nevoie de timp pentru copierea fișierelor.

Cel de-al doilea tip de import este potrivit și pentru cazurile de transfer a unei mașini virtuale de pe un alt server sau computer, dar atunci când o utilizați, fișierele exportate vor fi transferate în folderul specificat. ID-ul mașinii virtuale va rămâne același.

Dacă mașina virtuală este mutată pe același server sau computer, ar trebui să utilizați al treilea tip de import, care implică generarea unui nou identificator. La urma urmei, pe una calculator fizic nu pot exista mașini virtuale Hyper-V cu același ID.

În cazul nostru, copiem o mașină virtuală, acesta este al treilea tip de import. Faceți clic pe „Următorul”.

Calea implicită pentru stocarea fișierelor de configurare, puncte de control și alte date ale mașinii virtuale importate, specificate de Hyper-V, poate fi modificată. Trebuie să bifați caseta pentru schimbarea locației de stocare și să specificați manual căile necesare.

În cazul nostru, vom adăuga pur și simplu creație în cale (prin o bară oblică) folder separat"Copie". Faceți clic pe „Următorul”.

Vom indica aceeași cale pentru fișierul VHDX, astfel încât totul să fie într-un singur loc. Faceți clic pe „Următorul”.

Pasul final al expertului este un rezumat al datelor de import. Faceți clic pe „Terminare”.

Acum, în cazul nostru, există două mașini virtuale identice în Hyper-V Manager. Au ID-uri diferite, dar au același nume. Să schimbăm numele mașinii virtuale nou importate.

Asta este - procesul de import a fost finalizat. Mașina virtuală importată poate fi lansată și testată.

O zi bună!

11.02.2012 - 18:26

Să ne uităm la un script pentru exportul de VM pe un server Hyper-V.
Scopul este de a automatiza procesul cu o logică maximă fără a compromite productivitatea. Drept urmare, am scris un scenariu pe care l-am trimis mai devreme. Situația se schimba în fiecare zi, sistemul funcționa deja în producție, așa că era necesar să se reducă la minimum riscul de a sparge ceva. Ca urmare, am modificat scriptul, al cărui concept nu s-a schimbat:

  1. Găsirea unui VM
  2. Opriți VM-ul
  3. Exportarea VM-ului
  4. Porniți VM

Au fost adăugate doar „volante” și „monograme”.
Cerința principală este să salvați 2 copii ale VM, cea actuală și cea anterioară. Când se formează o nouă copie, cea anterioară este ștearsă, iar cea actuală este redenumită cu cea anterioară. Totul este implementat folosind exemplul cataloagelor Today și Yesterday.

Principalele caracteristici ale scenariului:

  1. Verifică prezența VM-ului necesar în lista de VM. Toate acțiunile sunt înregistrate într-un fișier jurnal.
  2. Dacă VM-ul este găsit - Șterge directorul cu intrarea anterioară, redenumește directorul curent cu cel anterior, creează un director pentru intrarea curentă.
  3. Verifică starea mașinii virtuale. Dacă VM rulează - Oprește VM-ul. Exportă VM în directorul desemnat. Lansări.
  4. Dacă VM-ul este oprit, exportă VM-ul în directorul desemnat.
  5. Dacă VM-ul este într-o stare diferită, scrie în jurnal.
  6. Dacă VM-ul nu este găsit, acesta scrie în jurnal.
  7. După export - elimină toate informațiile despre VHD, testează VHD-ul. Scrie în jurnal.
  8. Trimite e-mail-uri către destinatari despre operațiunile finalizate, stabilind importanța scrisorii în caz de eșec.

Există câteva caracteristici:

  1. Când trimiteți o scrisoare, jurnalul care este planificat să fie trimis ca atașament nu poate fi localizat într-o cale UNC. Cu alte cuvinte, dacă doriți să trimiteți jurnalul ca atașament, trebuie să îl plasați disc local sau conectați directorul de rețea cu un disc separat.
  2. Scriptul colectează informații despre discul VHD cu funcții suplimentare. Pentru a rezolva cu succes funcțiile de audit, discul nu ar trebui să fie localizat pe o cale UNC, va trebui să conectați din nou o unitate de rețea.
  3. Pentru a controla execuția exporturilor de mașini conform programului, s-a încercat introducerea parametrului „Nume VM”.

Pentru munca de succes script, trebuie să instalați acest modul. Cred că nu vor fi dificultăți.
Scenariul:

param ($VM) # Parametrul de intrare al mașinii virtuale (VM)

dacă (! (Get-Module -Name hyperv) )
{
# Activați modulul
import-modul hiperv
}
dacă ($VM -eq $null )
{
Scrie-gazdă „Introduceți numele mașinii virtuale”.
}

# ==== Parametri inițiali
$ComputerName = Get-Content env:COMPUTERNAME
# Conectați unitatea R: pentru a obține informații despre VHD
Invoke-Expression -Comandă „net use R: \\Server /y”
# Resetați contoarele
$număr = $fals # Declanșarea VM găsită
$export_count = $false # Contor de export de succes VM
# Definiți numele/adresa fișierului jurnal
$log = "\\Server\backup\Jurnale \$VM\" + (Get-Date -Format " aaa-LL") +" .log "
# Determinați calea către folder cu RK
$BackupDir = "
\\Server\backup\" +$VM
# Calea către folderul cu RK pentru a elimina informațiile din VHD
$InfoDir = "R:\backup \" +$VM
# Date pentru e-mail
$Sender = "
[email protected]"
$SMTP = " smtp.contoso.com"
$Destinatari = @(" [email protected] ") # grup de distribuție cu destinatarii care monitorizează backup-ul
$AttachePath = "
R:\backup\Logs\$VM \" + (Get-Date -Format "aaa-LL" ) +".log"

# Funcție pentru trimiterea unui mesaj, la momentul scrierii nu știam despre funcția Send-MailMessage și am scris propria mea funcție. Nu vreau să o refac, „Funcționează - nu-l atingeți!”
funcția Trimite e-mail($Subiect ,$Body ,$Prioritate )
{
$Message = New-Object System.Net.Mail.MailMessage
$Server = New-Object System.Net.Mail.SMTPClient
$Attache = New-Object System.Net.Mail.Attachment($AttachePath )
# ==== Mesaj
$Destinatari |
Pentru fiecare obiect ($Message .To.Add($_ ) )
$Message .From = $Sender
$Message .Subject = $Subject
$Message .Body = $Body
$Message .Atașamente.Adăugați($Atașare )
$Message .Priority = [ System.Net.Mail.MailPriority] ::$Priority
# ==== Se trimite
$Server.Host = $SMTP
}

# =========================================
$Server.Send($Message)
# Începeți înregistrarea (Get-Date) + "`r` n Pornirea scriptului de export VM " +$VM + " server: " + $ComputerName + "

`r` n Obținerea unei liste de mașini virtuale... `r` n"
# Obțineți o listă de VM
$VMArray = Get-VM |
{
Select-Object -Property VMElementName
foreach($element în $VMArray )
{
# Căutați o anumită VM dacă ($VM -eq $element .VMElementName)
$log_string = $log_string +
"Mașina virtuală a fost găsită. Efectuez acțiunile specificate... `r` n"

$număr = $adevărat
# ========== Operații cu foldere ===============
# Ștergeți folderul Ieri
{
Remove-Item -Path ($BackupDir + "\Yesterday" ) -Recurse -ErrorVariable err
dacă ($err)
# Dacă există o eroare de ștergere, opriți execuția.`r`n"
}
" Eliminarea directorului Ieri a eșuat, exportul $VM a fost anulat. Eroare: "
{
# Căutați o anumită VM + $err
altfel
„Ștergerea directorului de ieri a avut succes. `r` n” # Redenumiți folderul Azi Redenumiți-Item -Cale ($BackupDir + "
# Ștergeți folderul Ieri
{
\Azi"
) -NewName ($BackupDir + "\Yesterday" ) -Force -ErrorVariable err dacă ($err)
# Dacă există o eroare de redenumire, opriți execuția.`r`n"
}
" Eliminarea directorului Ieri a eșuat, exportul $VM a fost anulat. Eroare: "
{
# Căutați o anumită VM $log_string = $log_string + $err + "
" Redenumirea directorului Ieri a eșuat, exportul $VM a fost anulat. Eroare: "
„Redenumirea dosarului a fost finalizată cu succes. `r` n” # Redenumiți folderul Azi# Creați un folder Today
# Ștergeți folderul Ieri
{
Calea articolului nou ($BackupDir + "
) -NewName ($BackupDir + "\Yesterday" ) -Force -ErrorVariable err dacă ($err)
) -ItemType Directory -Force -ErrorVariable err # Dacă există o eroare de creare, opriți execuția.`r`n"
}
" Eliminarea directorului Ieri a eșuat, exportul $VM a fost anulat. Eroare: "
{
# Căutați o anumită VM $MailBody = $Mailbody + (Get-Date -Format „(aaaa-LL-zz) hh:mm:ss” ) +
„Crearea directorului Ieri a eșuat, exportul $VM a fost anulat. Eroare: „

„Crearea folderului Today a avut succes. `r` n”
#========== Sfârșitul lucrului cu folderele
if ((Get-VMSummary $VM ) .enabledstate -eq „În rulare” )
{
# Începeți oprirea
$log_string = $log_string + ((Get-Date -Format "(aaaa-LL-zz) hh:mm:ss" ) + „Mașina virtuală rulează. O opresc. `r` n”)
invoke-vmshutdown -VM $VM -Motiv „Export VM”.
# Ștergeți folderul Ieri
{
) -NewName ($BackupDir + "\Yesterday" ) -Force -ErrorVariable err dacă ($err)
) -ItemType Directory -Force -ErrorVariable err -Force -ErrorVariable err`r`n"
}
" Eliminarea directorului Ieri a eșuat, exportul $VM a fost anulat. Eroare: "
{

„Maiul virtual nu a fost oprit, exportul $VM a fost întrerupt. Eroare: „
„Mașina virtuală s-a oprit. Se exportă.`r`n” $MailBody = $MailBody + (Get-Date -Format „(aaaa-LL-zz) hh:mm:ss” ) +
„Mașina virtuală s-a oprit. Se exportă.`r`n” „Mașina virtuală s-a oprit.`r`n”
# Redenumiți folderul Azi
# Ștergeți folderul Ieri
{
) -NewName ($BackupDir + "\Yesterday" ) -Force -ErrorVariable err dacă ($err)
) -ItemType Directory -Force -ErrorVariable err „Se exportă o mașină virtuală.`r`n”`r`n"
}
" Eliminarea directorului Ieri a eșuat, exportul $VM a fost anulat. Eroare: "
{
„Exportul VM a fost finalizat cu eroare, exportul $VM a fost întrerupt. Eroare: „ $log_string = $log_string + (Get-Date -Format "(aaaa-LL-zz) hh:mm:ss" ) +
„Mașina virtuală s-a oprit. Se exportă.`r`n”
"Mașina virtuală a fost exportată cu succes. O pornesc.`r`n"
}
$export_count = $true
# Porniți VM-ul confirmând pornirea timp de 300 de secunde înainte de a executa următoarea comandă
# Ștergeți folderul Ieri
{
) -NewName ($BackupDir + "\Yesterday" ) -Force -ErrorVariable err dacă ($err)
) -ItemType Directory -Force -ErrorVariable err Start-VM -vm $VM -HeartBeatTimeOut 300 -ErrorVariable err`r`n"
}
" Eliminarea directorului Ieri a eșuat, exportul $VM a fost anulat. Eroare: "
{
„Exportul VM a fost finalizat cu eroare, exportul $VM a fost întrerupt. Eroare: „
„Mașina virtuală s-a oprit. Se exportă.`r`n” „VM nu a pornit. Eroare: „
}
}
}
„Mașina virtuală rulează.`r`n”
{
elseif((Get-VMSummary $VM ) .enabledstate -eq „Oprit” )
„Exportul VM a fost finalizat cu eroare, exportul $VM a fost întrerupt. Eroare: „ # Exportați VM fără confirmare cu toate fișierele (xml, vhd, etc.) și așteptați până când este gata
„Mașina virtuală s-a oprit. Se exportă.`r`n” „Mașina virtuală este în modul oprit. Se exportă.`r`n”
„Mașina virtuală este în modul oprit.`r`n” # Redenumiți folderul Azi export-VM -VM $VM -cale ($backupDir + "
# Ștergeți folderul Ieri
{
) -NewName ($BackupDir + "\Yesterday" ) -Force -ErrorVariable err dacă ($err)
) -ItemType Directory -Force -ErrorVariable err ) -force -copystate -wait -ErrorVariable err`r`n"
}
" Eliminarea directorului Ieri a eșuat, exportul $VM a fost anulat. Eroare: "
{
„Exportul VM a fost finalizat cu eroare, exportul $VM a fost întrerupt. Eroare: „ „Exportul VM a eșuat, exportul $VM a fost întrerupt. Eroare: „
„Mașina virtuală s-a oprit. Se exportă.`r`n” „Exportul VM a eșuat, exportul $VM a fost întrerupt. Eroare: „
"Mașina virtuală a fost exportată cu succes. O pornesc.`r`n"
}
}
" Eliminarea directorului Ieri a eșuat, exportul $VM a fost anulat. Eroare: "
{
„Mașina virtuală a fost exportată cu succes.`r`n”
„Exportul VM a fost finalizat cu eroare, exportul $VM a fost întrerupt. Eroare: „
„Mașina virtuală s-a oprit. Se exportă.`r`n” $vm_state = (Get-VMSummary -VM $VM ) .EnabledState
}
}
}
}
}
}
„Mașina virtuală nu a fost exportată, starea $VM = $vm_state .`r` n” dacă ($ număr)
{
# Dacă VM-ul este găsit dacă (! ($export_count) )
{
# Căutați o anumită VM # Dacă VM-ul nu este exportat
„Exportul mașinii virtuale $VM a fost finalizat cu erori. Procesul a fost întrerupt. `r` n” $MailBody = $MailBody +
}
„Exportul mașinii virtuale $VM a fost finalizat cu erori. Procesul a fost întrerupt.`r` n” altfel
{
# Căutați o anumită VM # Dacă VM-ul este exportat
"Caut *.VHD pentru $VM ... `r` n"
# Căutați *.vhd în directorul specificat if (Get-Item -Path ($InfoDir + "\Azi\" + $VM + " \Discuri virtuale\*
{
") -Include *.*vhd | Select-Object -Property Name)
#$VHDInfo = "
Informații VHD:`r`n" foreach($element în (Get-Item -Path ($InfoDir + " \Azi\" + $VM + "\Harddiskuri virtuale\*"
{
) -Include * .* vhd |
# Căutați o anumită VM Select-Object-Property Name) )# Pentru fiecare element găsit, obținem informații și le scriem în jurnal și o linie pentru scriere dacă ($err)
$SomeVHDInfo = Get-VHDInfo -VHDPaths ($InfoDir + " if (Get-Item -Path ($InfoDir + "\Virtual Hard Disks\" + $element .Nume)
$log_string = $log_string + "Cale: " + $SomeVHDInfo .Path + " dacă ($err)
$log_string = $log_string + "Dimensiunea fișierului: " + ([ System.Math] ::Round(($SomeVHDInfo .FileSize/ 1Gb) ,2 ) ) + "Gb dacă ($err)
$log_string = $log_string + "Legarea VM: " + $SomeVHDInfo .InSavedState + " dacă ($err)
$log_string = $log_string + "Montat: " + $SomeVHDInfo .InUse + " dacă ($err)
# Căutați o anumită VM "Volumul maxim fisier: "+ ([ System.Math] ::Round(($SomeVHDInfo .MaxInternalSize/ 1Gb) ,2 ) ) + "Gb dacă ($err)
$log_string = $log_string + "Tipul de imagine: " + $SomeVHDInfo .TypeName + " dacă ($err)
# Validăm VM-ul VHD
$TestVHD = "VHD: " + $element .Name + ": " + (Test-VHD -VHDPaths ($InfoDir + " if (Get-Item -Path ($InfoDir + "\Virtual Hard Disks\" + $element .Nume) )
$log_string = $log_string + $TestVHD + " dacă ($err)
$MailBody = $Mailbody + $TestVHD + " dacă ($err)
}
}
„Exportul mașinii virtuale $VM a fost finalizat cu erori. Procesul a fost întrerupt.`r` n” # Brusc, VHD-ul nu se află în acest director O_O
{
$log_string = $log_string + "*.VHD pentru $VM nu a fost găsit.`r`n"
$MailBody = $MailBody + "*.VHD pentru $VM nu a fost găsit.`r`n"
}
}
}
„Exportul mașinii virtuale $VM a fost finalizat cu erori. Procesul a fost întrerupt.`r` n” # VM nu a fost găsit pe server
{
$log_string = $log_string +
„Exportul mașinii virtuale $VM a fost finalizat cu erori. Procesul a fost întrerupt. `r` n” "Mașina virtuală $VM nu a fost găsită. Procesul s-a încheiat.`r` n"
}

„Exportul VM a fost finalizat cu eroare, exportul $VM a fost întrerupt. Eroare: „ „Lucrul la $VM s-a terminat.`r`n”
# Căutați o anumită VM „======================== `r` n”

$MailSubject = " Raport de export $VM."
# Trimite o scrisoare:
Trimite e-mail -Subject $MailSubject -Body $MailBody -Priority $MailPriority

#net use R: /delete /y Această funcție nu este necesar să alergi.

Iată, de fapt, întregul scenariu. Pentru a lucra cu un cluster, creăm o sarcină pentru fiecare VM pe fiecare nod al cluster-ului cu o diferență de minut la pornire, deoarece scriptul de la orice nod accesează același fișier jurnal și, în același timp, poate exista o coliziune de acces. Dacă nu există nicio VM pe unul dintre nodurile clusterului, scriptul va afișa un mesaj că VM-ul nu a fost găsit și se va ieși.
Scriptul a fost deja implementat la mai multe întreprinderi cu modificări minore pentru un anumit client. Toată lumea este fericită și îți doresc același lucru.