Convertire una macchina virtuale VMWare a Virtual PC/Virtual Server
Oggi, da un cliente, ho dovuto convertire un paio di macchine virtuali VMWare a Virtual Server: i server di sviluppo sono stati convertiti a Virtual Server.
Non esistendo un tool nativo di importazione della macchina virtuale abbiamo deciso di usare l'utility VMDK to VHD Converter disponibile nella sezione Download di http://vmtoolkit.com/files/default.aspx.
Lo strumento converte semplicemente il disco VMDK in VHD consentendo poi la creazione della macchina Virtual PC o Virtual Server agganciando un disco esistente.
La conversione dell'hard disk deve però essere effettuata dopo qualche modifica manuale.
Riporto tutti i passi seguiti oggi evitando di linkare post esterni visto che negli ultimi tempi sembra che la moda porti i webmaster a spostare le cose senza mettere redirezioni :-)
0) Copiare la Virtual Machine o eseguire un Clone per lasciare intatta la macchina originale
1) Disinstallare i VMWare Tools. Al termine Reboot
2) Se durante il reboot viene fuori il wizard di Add/Remove Hardware annullare l'operazione
3) Verificare la versione del Service Pack. Se non ci sono SP installati prendere il CD originale o tenere a portata di mano la directory i386. Se ci sono SP installati occorrono i file di setup del Service Pack accessibil: se avete il SP installato con i file copiati in x:\windows\servicepackfiles è sufficiente copiare i file indicati senza bisogno del CD originale
4) Aprire il Command Prompt
5) Se avete il SP nella directory servicepackfiles copiare hal.dll sotto x:\windows\system32\
6) Se non avete il SP nella directory servicepack file occorre la directory i386 a portata di mano e lanciare expand d:\\i386\\hal.dl_ %windir%\\system32\\hal.dll
7) Eseguire la stessa operazione (5 o 6) per ntoskrnl.exe (copia del file oppure expand d:\\i386\\ntoskrnl.ex_ %windir%\\system32\\ntoskrnl.exe)
In ultimo, prima di lanciare l'utility di esportazione del VMDK copiare nella macchina virtuale il seguente script e lanciarlo. Al termine dello script la macchina esegue uno shut down ed è pronta per l'esportazione dal tool citato all'inizio del post.
Create un file .vbs (per Windows Scripting Host) e lanciarlo. Se al termine dello script (dopo la MessageBox) il sistema non si riavvia, riavviarlo a mano: probabilmente l'impersonation non riesce e quindi non ci sono i diritti per fare shutdown.
'prepvm.vbs
'Removes VMware-specific drivers from a system
On Error Resume Next
' Instantiate Shell Object
Set objShell = CreateObject("WScript.Shell")
' Disable VMware Tools Service
objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\VMTools\\Start", _
4, "REG_DWORD"
' Disable VMware vmx_svga video driver
objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\vmx_svga\\Start", _
4, "REG_DWORD"
' Disable VMware vmmouse driver
objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\vmmouse\\Start", _
4, "REG_DWORD"
' Disable VMware vmscsi driver
objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\vmscsi\\Start", _
4, "REG_DWORD"
' Disable VMware PCnet driver
objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\PCnet\\Start", _
4, "REG_DWORD"
' Disable VMware Buslogic driver
objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\buslogic\\Start", _
4, "REG_DWORD"
' Disable SCSI Miniport drivers
objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\symc810\\Start", _
4, "REG_DWORD"
objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\symc8xx\\Start", _
4, "REG_DWORD"
objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\cpqarray\\Start", _
4, "REG_DWORD"
objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\pcntn4m\\Start", _
4, "REG_DWORD"
objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\cpqnf3\\Start", _
4, "REG_DWORD"
objShell.RegWrite "HKLM\\SYSTEM\\CurrentControlSet\\Services\\MRaidNT\\Start", _
4, "REG_DWORD"
' Restart Computer
strComputer = "."
'Prompt user of impending reboot
WScript.Echo("The system is prepared for imaging and will now shutdown.")
WScript.Sleep(3)
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate,(Shutdown)}!\\\\" & _
strComputer & "\\root\\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
objOperatingSystem.Shutdown()
Next