Назад | Перейти на главную страницу

Копирование снимка виртуальной машины в новую среду виртуальной машины

У нас есть 2 отдельные среды VMWare, одна из которых является основной средой, в которой есть сотни виртуальных машин на множестве сайтов. Другой - гораздо меньший по размеру, установленный на одном сервере, только для архивирования старых систем.

Я хотел бы сделать снимок текущего состояния одной из наших виртуальных машин и использовать его для копирования в другую среду VMWare и создать там новую машину, используя ее в качестве архива этой системы.

Будет ли это возможно / легко?

Блин, если бы вы использовали vSphere 6, вы могли бы сделать клоны между vCenter и покончить с этим.

В любом случае эта задача не является сверхсложной и с 5.5, если вы используете PowerCLI.

Шаги как таковые:

  1. Сделайте снимок виртуальной машины (используйте PowerCLI или любой из графических интерфейсов пользователя, не имеет значения)
  2. Клонировать снимок в новую виртуальную машину с помощью этой удобной небольшой части PowerCLI:
    New-VM -Name $CloneName -VM $SourceVM -Location $CloneFolder -Datastore $Datastore -ResourcePool $ResourcePool -VMHost $VMHost -LinkedClone -ReferenceSnapshot $Snapshot
    Вы можете посмотреть Вот что означают все варианты и как их заполнить.
    Ключевым моментом является опция «-ReferenceSnapshot».

  3. Экспортируйте свою блестящую новую виртуальную машину в OVF / OVA или скопируйте папку из DS куда-нибудь в сети.

  4. Импортируйте его в другой vCenter

Моя группа ИТ-безопасности запросила «судебную» копию работающей виртуальной машины, включая моментальный снимок памяти, чтобы они могли провести некоторые расследования в случаях, когда был вирус или какое-то нарушение. Чтобы облегчить себе жизнь, я написал функцию PS, которая выполняет всю тяжелую работу. Ему просто нужна исходная ВМ (по имени или объекту) и папка на диске. Все остальное сделает он сам.

Function ExportVM {
    Param(
    [parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [PSObject]$SourceVM,

    [parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [String]$DestinationPath
    )

    #Check if the destination path exists, bail out if it doesn't
    if ( -not (Test-path $DestinationPath -IsValid) ) {
        Write-Warning "Please provide a valid path for the exported VM"
        return
    }

    #Get the SourceVM, bail out if it fails
    if ($SourceVM.GetType().Name -eq "string"){
        try {
            $SourceVM = Get-VM $SourceVM -ErrorAction Stop
        }
        catch [Exception]{
            Write-Warning "VM $SourceVM does not exist"
            return
        }
    }
    elseif ($SourceVM -isnot [VMware.VimAutomation.ViCore.Impl.V1.Inventory.VirtualMachineImpl]){
        Write-Warning "You did not pass a string or a VM object for 'SourceVM'"
        Return
    }

    try {
        $DestinationPath = $DestinationPath + "\" + $SourceVM.Name

        #Setup the required compoments to compute an MD5 hash
        $algo = [System.Security.Cryptography.HashAlgorithm]::Create("MD5")
        $md5StringBuilder = New-Object System.Text.StringBuilder 50
        $ue = New-Object System.Text.UTF8Encoding

        #Define the snapshot name
        $SnapshotName = "IT-Security Export - " + (Get-Date -UFormat "%b-%d-%Y, %R")
        #Create the snapshot
        $Snapshot = New-Snapshot -VM $SourceVM -Name $SnapshotName -Description "Snapshot for IT-Security Forensic export" -Memory -Quiesce -Confirm:$false

        $Snapshot

        #Define variables needed to create the clone
        $CloneFolder = $SourceVM.Folder
        $Datastore = Get-Datastore -RelatedObject $SourceVM
        $ResourcePool = Get-ResourcePool -VM $SourceVM
        $VMHost = Get-VMHost -VM $SourceVM

        #Build a unique name for the cloned machine based on the snapshot name
        $algo.ComputeHash($ue.GetBytes($SnapshotName)) | % { [void] $md5StringBuilder.Append($_.ToString("x2")) }
        $CloneName = $SourceVM.Name +"_ITSecExport_" + $md5StringBuilder.ToString().SubString(0,15)

        #Clone the VM
        $CloneVM = New-VM -Name $CloneName -VM $SourceVM -Location $CloneFolder -Datastore $Datastore -ResourcePool $ResourcePool -VMHost $VMHost -LinkedClone -ReferenceSnapshot $Snapshot

        #Define the name of the PSDrive, based on the Datastore name
        $DSName = "ITSecExport_" + ($Datastore.name -replace "[^a-zA-Z0-9]","")
        #Check to see if it already exists, remove if it does
        if (Get-PSDrive | Where {$_.Name -like $DSName}) {
            Remove-PSDrive $DSName
        }
        #Add the new drive
        $PSDrive = New-PSDrive -Location $Datastore -Name $DSName -Scope Script -PSProvider VimDatastore -Root "\"

        #Define variables needed to copy the SourceVM's VMX and the snapshot's VMSN
        $SnapshotID = (Get-VM $SourceVM |Get-Snapshot | where {$_.Name -like $SnapshotName}).ExtensionData.ID
        $SourceVM_VMXPath = (Get-View $SourceVM).Config.Files.VmPathName.Split(" ")[1].replace("/","\")
        $SourceVM_VMSNPath = $SourceVM_VMXPath.Replace(".vmx", "-Snapshot" + $SnapshotID + ".vmsn")
        #$CloneVM_VMPath = (Get-View $CloneVM).Config.Files.VmPathName.Split(" ")[1].Split("/")[0]

        #Copy the VMSN and VMX
        Copy-DatastoreItem -Item ${DSName}:\$SourceVM_VMXPath -Destination $DestinationPath -Force
        Copy-DatastoreItem -Item ${DSName}:\$SourceVM_VMSNPath -Destination $DestinationPath -Force

        #Copy-DatastoreItem -Item ${DSName}:\$CloneVM_Path\* $DestinationPath"$CloneName" -Force -Recurse

        #Export the VM
        $CloneVM | Export-VApp -Destination $DestinationPath -Force

        #Clean up
        Remove-VM -DeletePermanently $CloneVM -Confirm:$false
        Remove-Snapshot -Snapshot $Snapshot -Confirm:$false
        Remove-PSDrive -Name $DSName
    }
    catch [Exception]{
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName
        Write-Warning "Looks like we ran in to an error"
        Write-Warning "  $ErrorMessage"
        return
    }
}

Насколько мне известно, вы можете просто копировать виртуальные машины между хостами. Сначала безопасно выключите, а затем остановите виртуальную машину; затем скопируйте всю папку в другую среду VMWare. После копирования папки в веб-интерфейсе перейдите к Виртуальная машина меню -> Добавить виртуальную машину в инвентарь и добавьте скопированную машину к хосту. При включении устройства вы получите сообщение с вопросом, скопировали ли вы устройство или переместили его, выберите "Скопировал это". После того, как виртуальная машина успешно работает во второй среде VMWare, вы можете безопасно удалить и удалить ее в первой среде VMWare. В зависимости от конфигурации вашей сети вам может потребоваться изменить некоторые настройки, но все должно работать нормально.