Copy-VMFile ile Sanal Makinelere Dosya Kopyalamak

Hyper-V sanal makineleriyle (VM) çalışırken belirli anlarda sanal işletim sistemi (Guest OS) disk alanlarına çeşitli veriler kopyalamanız gerekebilir. Örneğin sanal işletim sistemi üzerine kurulumunu gerçekleştirmek üzere olduğunuz uygulamaya ait ilave setup dosyaları, bir grup doküman, bir ayar dosyası veya birkaç dijital sertifika pfx’i gibi şeyler…

Bu durumda birkaç şansınız var.

  • Kopyalamak istediğiniz içeriği bir ISO dosyası olarak paketleyip sanal donanımlardan Virtual DVD Drive ile VM’e insert edebilirsiniz. Tabi o an Virtual DVD Drive kullanılmıyor olmalı veya VM üzerinde ikinci ve müsait Virtual DVD Drive hazır bulunmalı.
  • Kopyalamak istediğiniz içeriği bir VHD/VHDX olarak paketleyip doğrudan VM’e attach edebilirsiniz.
  • Eğer VM ağa bağlı ve TCP/IP iletişimi mümkün ise, doğrudan SMB veya benzer protokoller vasıtasıyla kopyalama işini ağ üzerinden gerçekleştirebilirsiniz.
  • Eğer VM ağa bağlı, TCP/IP iletişimi ve uzak masaüstü bağlantısı (RDP) mümkün ise, oturum açarak Clipboard veya Drive Mapping kullanabilirsiniz. Benzer işler yapan üçüncü parti çözümler de olabilir.
  • Eğer 2. nesil sanal makineler ile çalışıyorsanız Enhanced Session Mode’u aktif edip, VM ağa bağlı olmasa dahi Host ile Clipboard paylaşımı veya Drive Mapping gibi şeyler kullanabilirsiniz. Bir nevi RDS over VMBUS. Ancak bu yöntemi kullanabilmek için VM mutlaka 2. nesil olmalı, ayrıca Windows 8 veya Windows Server 2012 (veya üstü) sanal işletim sistemi çalıştırmalı.

Eğer VM ağa bağlı değilse veya VM’in bulunduğu hedef ağ ile kopyalanacak içeriğin bulunduğu kaynak ağ arasında DMZ, vLAN, routing gibi sebeplerden ötürü iletişim sınırlıysa veya kimlik doğrulama gibi farklı engeller söz konusu ise, yukarıdaki kopyalama seçeneklerinden ikisi doğrudan elenir.

Eğer VM 2. nesil değilse RDS over VMBUS seçeneğini de kullanamazsınız.

İçeriği ISO veya VHD/VHDX olarak paketlemek her zaman kullanılabilecek bir yöntemdir. Ancak ISO oluşturmak için üçüncü parti uygulama gerekir ve bazı limitlere takılabilirsiniz. VHD/VHDX ile taşımak için ise yine ekstra bazı adımlar var. Ayrıca hypervisor ve Guest OS sürümüne göre sanal diski attach ederken VM’i kapatmanız gerekebilir. Bu da downtime demek.

Copy-VMFile

Çeşitli nedenlerden ötürü yukarıdaki yöntemleri kullanamadığımız duruma ne yapabiliriz? Cevap Windows Server 2012 R2 Hyper-V PowerShell module ile gelen Copy-VMFile cmdlet.

Copy-VMFile cmdlet’i kullanarak Windows Server 2012 R2 Hyper-V sunucu üzerinde çalışan bir VM’in izole depolama alanına, Host üzerindeki bir veriyi doğrudan kopyalayabilirsiniz. Üstelik bu sırada VM’in ağa bağlı olması, x nesil veya x Guest OS ile çalışıyor olması gibi şartlar aranmaz.

Copy-VMFile ile bir VM’e veri kopyalarken,

  • VM’in ağa bağlı olması gerekmez.
  • VM’in 1. veya 2. nesil olması belirleyici değildir. Her iki durumda da kullanılabilir.
  • VM Guest OS sürümü belirleyici değildir. Doğru Integration Services sürümünün yüklü olması yeterli.
  • Host ve VM Guest OS arasında kimlik doğrulama gerekmez. Yani Guest OS üzerinde yetkili bir credential bilmenize gerek yok.

Copy-VMFile sadece Windows VM’ler için kullanılabilir.

Copy-VMFile Nasıl Kullanılır?

Copy-VMFile cmdlet’i Windows Server 2012 R2 Hyper-V PowerShell module ile gelir ve bu sürüm üzerinde çalışan VM’lerde kullanılmak üzere hazırdır. Daha önceki Hyper-V sürümlerinde ise yer almaz.

Windows 8.1 Client Hyper-V üzerindeki VM’ler için de kullanılabilir.

Kopyalama işi Guest services üzerinden gerçekleştiği için Copy-VMFile cmdlet’ini kullanmadan önce ilgili VM ayarlarında, Integration Services altında, Guest services servisini bir kez aktif etmeniz gerekir. Varsayılan olarak pasiftir ve VM başına aktif edilir. Aktif ettikten sonra ise VM’i yeniden başlatmanız gerekmez, doğrudan ilerleyebilirsiniz.

hyper-v-guest-services

Mesela Host1 isimli Hyper-V sunucusunun yerel depolama alanındaki d:\deneme.txt dosyasını, aynı sunucu üzerinde çalışan Exch10 isimli VM’in c:\tools dizini altına kopyalamak için aşağıdaki gibi bir satır kullanılabilir.

Copy-VMFile -VMName Exch10 -SourcePath D:\deneme.txt -DestinationPath C:\tools -FileSource Host

Kopyalama başarılı olarak tamamlandığında herhangi bir bilgi dönmez. Ancak bir hata oluşursa açıklamalarıyla birlikte gösterilir.

copy-vmfile-cmdlet

Kopyalama sonrasında host üzerindeki veri (örnekte deneme.txt) doğrudan VM üzerinde belirttiğiniz sürücü ve dizini altına (örnekte c:\tools\) kopyalanır.

copy-vmfile-result

Copy-VMFile kullanırken şunlar aklınızda bulunsun.

  • Sadece Windows VM’ler için kullanabilirsiniz.
  • Kopyalanacak veri kaynağı, VM’in çalıştığı Host üzerinde olmalı.
  • Kopyalanacak veri için kaynak ve hedef noktalar aynı Host üzerinde olmak koşulu ile, -ComputerName parametresini kullanarak kopyalama işlemini Hyper-V PowerShell modül yüklü uzak bir sunucudan başlatabilirsiniz.
  • Guest services’i VM başına bir kez aktif etmeniz gerekir. Kopyalama işlemi bittiğinde belki tekrar pasif duruma çekmek isteyebilirsiniz. Bu noktaya güvenlik açısından dikkat edilmeli çünkü mesela bu durumu suistimal edebilen zararlı bir kod (henüz görmedim ama neden olmasın), bu yöntemi kullanarak çok kolay bir şekilde Host üzerindeki tüm VM’lere zararlı çalıştırılabilir dosyalar kopyalayabilir, hatta bunları doğrudan başlangıca bile koyabilir :)

Copy-VMFile’ın alabildiği parametrelere de bir göz atın derim. Mesela var olan bir dosyanın üzerine yazarken -Force parametresi, hedefte olmayan bir dizin hiyerarşisini otomatik olarak oluşturmak için -CreateFullPath parametresi işinizi kolaylaştırabilir.

Ayrıca Copy-VMFile cmdlet’ini basit PowerShell Script döngülerine sokarak belirli bir veya bir grup dosyayı ortamdaki tüm VM’lere kolayca kopyalayabilirsiniz. Örneğin Host1, Host2 ve Host3 isimli Hyper-V sunucularda çalışan tüm VM’lerin C:\ sürücüleri altına, o Host’ların D:\ dizini altındaki deneme.txt dosyasını topluca kopyalamak için bir PS Script yazmak isteseydik sanırım şöyle olurdu.

$HostGroup = "Host1", "Host2", "Host3"
foreach($HostName in $HostGroup)
{
$VMs = Get-VM -ComputerName $HostName
foreach($VM in $VMs)
{
Copy-VMFile -ComputerName $HostName -Name $VM.Name -SourcePath D:\deneme.txt -DestinationPath C:\ -FileSource Host -ErrorAction Continue
}
}
# End

Bu arada çalıştırmadım :) ama sanırım çalışacaktır.

Yazı Etiketleri: , , ,

Sayfa Başı ▲

Yorumlar (1)

  1. Emre GEZER

    merhaba, bir VMware sunucu içinde 2 sanal makina arasında dosya kopyalarken makine kilitleniyor. Hard reset atmadan kendine gelmiyor. önerebileceğiniz bir yöntem var mı ?

Yorum Ekle