Machines virtuelles et modèles Hyper-V

1. Machine virtuelle

Une machine virtuelle est principalement composée de deux types de fichiers :

  • Un fichier de définition formelle de la machine virtuelle qui identifie ses composants (virtuels), une sorte de défintion de carte mère (CPU, RAM, bus divers, périphériques d'entrée et de sortie, ...).
  • Un ou plusieurs fichiers contenant les données hébergées par la VM (OS et applications) représentant des disques durs virtuels (sous Hyper-V des fichiers .VHD ou .VHDX)

1.1. Fichier de configuration

Le fichier de configuration de la machine virtuelle n'est pas directement accessible en Hyper-V 2016. Il s'agit d'instancier une copie de ce fichier et de le lire avec select. L'extension du fichier de configuration est .vmcx

$tempVM = (Compare-VM -Copy -Path 'C:\ProgramData\Microsoft\Windows\Hyper-V\hy1\Virtual Machines\2ACE7D17-5281-4BB3-
B063-28F27F9A3B70.vmcx' -GenerateNewId).VM

$tempVM | select *

2. Création, lancement et destruction d'une machine virtuelle

Inspiration : https://msdn.microsoft.com/en-us/virtualization/hyperv_on_windows/quick_start/walkthrough_create_vm et https://technet.microsoft.com/en-us/windows-server-docs/compute/hyper-v/get-started/create-a-virtual-machine-in-hyper-v

2.1. Création d'une machine virtuelle

Script Powershell ISE

#
#Set VM Name, Switch Name, and Installation Media Path.
$VMName = 'TESTVM'
$Switch = 'NatSwitch'
$ISO = 'C:\Users\Administrator\Downloads\14393.0.160715-1616.RS1_RELEASE_SERVER_EVAL_X64FRE_EN-US.ISO'
$VHD = 'C:\Users\Administrator\Documents\'
$VHDSize = 40GB
$RAM = 4GB

#Create New Virtual Machine
New-VM -Name $VMName -MemoryStartupBytes 4GB -Generation 2 -NewVHDPath $VHD"$VMName\$VMName.vhdx" -NewVHDSizeBytes 40GB -Path $VHD"$VMName" -SwitchName $Switch

#Add DVD Drive to Virtual Machine
Add-VMScsiController -VMName $VMName
Add-VMDvdDrive -VMName $VMName -ControllerNumber 1 -ControllerLocation 0 -Path $ISO

#Mount Installation Media
$DVDDrive = Get-VMDvdDrive -VMName $VMName

# Configure Virtual Machine to Boot from DVD
Set-VMFirmware -VMName $VMName -FirstBootDevice $DVDDrive

2.2. Lancement de la machine virtuelle

Start-VM -Name <Name>
VMConnect.exe

Destruction d'une machine virtuelle

#
$VMname = 'TESTVM'

GET-VM –Name $VMname | GET-VMHardDiskDrive | Foreach { STOP-VM –Name $_.VMname; Remove-item –path $_.Path; REMOVE-VM –Name $_.VMname -Force }

2.3. Installation automatisées des systèmes d'exploitation

Pour préconfigurer et automatiser l'installation d'un système Windows, on devrait s'intéresser aux solutions Assessment and Deployment Kit (ADK), Microsoft Deployment Toolkit (MDT). La création d'un fichier Autounattend.xml / Unattend.xml disponible sur une clé USB répondra aux questions d'installation. On trouvera sur ce site un générateur de fichier de réponses : http://windowsafg.no-ip.org/.

Pour le déploiement des machines Linux, on utilisera volontiers un fichier de configuration de type KickStart.

3. Disques virtuels

Pour connaître les disques VHD attachés à une VM

 Get-VM –VMName <VM> | Select-Object VMId | Get-VHD
  • Ajouter un DVD
  • Physical disk or pass-through disk ?
  • Ajouter un LUN
  • VHD/VHDX
  • Types de disques
  • Convertir des disques
  • Créer un disque et l'ajouter à une VM
  • Redimensionnement de disques VHD
  • Storage Live Migration

4. Modèles de machines virtuelles (Template)

Un modèle n'est jamais qu'une machine virtuelle qui sert de modèle. Bien qu'elle soit elle-même opérationnelle, ce sont ses copies qui sont déployées en production.

On propose ici un début de procédure à partir d'une machine virtuelle servant de modèle et déjà préparée (sysprep).

$VMNAME = "DC01"
$VMPATH = "C:\users\Administrator\Documents\"
$TEMPLATE_PATH = "C:\users\Administrator\Documents\w2016-template\"
$TEMPLATE_VHD = "w2016-template.vhdx"
$SWITCH = "VmNAT"

# Create a new VM without disks (Generation 2 as the original machine)
New-VM -MemoryStartupBytes 4GB -VMName $VMNAME -Generation 2 -NoVHD -Path "$VMPATH$VMNAME" -SwitchName $SWITCH

# Copy de template disk into the VM location
Copy-Item -path $TEMPLATE_PATH$TEMPLATE_VHD -Destination "$VMPATH$VMNAME"

# Rename the copied virtual hard disk
Rename-Item -NewName "$VMNAME.vhdx" -Path "$VMPATH$VMNAME\$TEMPLATE_VHD"

# Add the disk to the VM
Add-VMHardDiskDrive -VMName $VMNAME -ControllerType SCSI -ControllerNumber 0 -Path "$VMPATH$VMNAME\$VMNAME.vdhx"

Disques Differencing

Un disque Differencing correspond à l'usage habituel d'un 'clone lié'. Le disque copié est le différentiel du disque original. On peut parler de disque parent et de disques enfants. Si c'est utile en lab, on déconseillera son usage en production car on imagine une faiblesse de performance lors d'accès concurrent sur un point unique de rupture sur l'image modèle.

New-VHD -Differencing -ParentPath E:\VHDStore\Template-2012R2.vhdx
-Path D:\Storage\VM-01 -SizeBytes 40GB

5. Instantannés (Snapshots / Checkpoints)