Pour mes labs Windows, j’ai besoin de pouvoir déployer rapidement plusieurs machines virtuelles avec Hyper-V, et plus c’est rapide, mieux c’est.

Les points d’optimisations

  • Quantité solide de RAM (64GB)
  • Stockage des VMs sur SSD
  • Script pour automatiser le déploiement
  • Disques de différenciations
  • Fichiers de réponses
Lire la suite

Je travaille actuellement avec Windows Server 2022 Standard, et Windows 10 21H2, tous les deux intégrés au système optimisé.
Voici un aperçu du niveau d’optimisation, il me faut pour déployer une nouvelle VM jusqu’à l’écran de connexion (on parle bien d’une nouvelle machine déployée):

  • Windows 10 21H2: 2 minutes et 28 secondes
  • Windows Server 2022 STD: 1 minute et 09 secondes

La RAM

Concernant la RAM, forcement c’est en fonction des besoins de chacun, les miens sont assez colossaux quand je prépare certaines certifications.

Le stockage

Au niveau du SSD, vu que c’est du lab, je peux largement privilégié la performance vis à vis de la sécurité (ma machine à deux HDDs 5400 rpm en raid 1).

Les disques de différenciation

Avant d’attaquer la suite, il faut comprendre ce que sont les disques de différenciations. Je remercie au passage Didier B. qui m’a initié à cette redoutable technologie.
Je vais commencer par une mise en garde, c’est super pour du lab mais pas forcément en prod (https://docs.microsoft.com/fr-fr/windows-server/virtualization/hyper-v/best-practices-analyzer/avoid-using-vhd-format-differencing-virtual-hard-disks-on-virtual-machines)

Alors c’est quoi un disque de différenciation ? Bah c’est ultra simple si on a des bases en IT.

En gros, vous allez avoir un disque virtuel parent, et des disques virtuels enfants liés à ce parent.
Le parent est un disque virtuel qui contient une installation de l’OS sur laquelle est faite un sysprep, donc une image système, mais sur un VHD. Il est verrouillé avec un accès uniquement en lecture. Ensuite on créé un ou plusieurs disques de différenciations, donc les disques enfants qu’on a va attaché à des VMs, la VM charge l’OS du disque parent mais écrit toutes les modifications sur le disque enfant.

Les avantages sont multiples:

  • Gain de place (1x l’OS pour n VM)
  • Gain de temps au déploiement

Il y a une contrepartie:

  • Il est nécessaire de recréer des parents/enfants pour les nouvelles VMs si on veut intégrer les mise à jour.
  • La possible corruption des disques (Jamais eut dans mon lab mais ma machine est sur onduleur donc je n’ai pas de coupure de courant sur la machine).

Les étapes pour mettre en place l’optimisation

Le fichier de réponses

On créé un fichier de réponse, ça c’est un vaste sujet donc je vous laisse aller voir ici: https://neptunet.fr/fichier-reponses-wds/#4
Mon fichier de réponse est minime, j’automatise le setup (skip EULA, …), je règle le fuseau horaire, les claviers, le mot de passe administrateur et la création de mon compte, c’est tout

Aperçu de la configuration du fichier de réponse



Le disque parent

On prépare le parent, il y a plusieurs techniques, perso j’injecte l’install.wim avec le fichier de réponses dans un VHDX mais ne brulons pas les étapes:

Install.wim

Pour l’install.wim, c’est le même qu’il vous a fallu pour le fichier de réponse. Ici on peut agir pour limiter le besoin de booter sur le disque parent et devoir refaire un sysprep juste pour installer les updates, ça évite aussi de se retaper toutes les updates quand on recréé un parent. Je vous laisse regarder ici: https://docs.microsoft.com/fr-fr/windows-hardware/manufacture/desktop/mount-and-modify-a-windows-image-using-dism?view=windows-11

Convert-WIM2VHD

Voici comment créer un VHDX à partir de l’install.wim et du fichier de réponse:

Convert-WIM2VHD -Path E:\VM\Templates\20220714_PARENT_tpl_WS2022_unattend.vhdx -SourcePath F:\ISO\WindowsServer2022_release_svc_refresh_SERVER_EVAL_x64FRE_en-us\sources\install.wim -Size 60GB -DiskLayout UEFI -Dynamic -unattend E:\VM\Automation\Unattend\W2022STD\unattend.xml -Force -Index 2
  • Path: Le disque VHDX que la commande va créer.
  • SourcePath: Le chemin de l’install.wim
  • Size: La taille du disque parent, je vous rappelle qu’il est verrouillé donc ne grossira plus une fois prêt.
  • DiskLayout: Laissez UEFI
  • Dynamic: Indique que le disque est dynamique, c’est à dire qu’il ne réserver pas la taille préciser dans size, ce qui permet un gain de place si le disque n’est pas rempli.
  • Unattend: Le chemin du fichier de réponse
  • Force: Ecrase l’image si elle existe déjà
  • Index: Si il y a plusieurs systèmes dans le WIM, ça permet de choisir le bon (Ex: Ici pour WS2022, l’index 1 correspond à la version core standard, l’index 2, lui correspond à la version standard avec interface graphique)

Optionnel – Booter sur le parent

Si vous avez été rebuté par les mise à jours Windows via DISM (point 2.1), tout n’est pas perdu, à partir d’ici, vous pouvez booter sur le VHDX a l’attachant à une VM mais ne le faite pas si ce n’est pas nécessaire car il faudra refaire un sysprep.

Le(s) disque(s) enfant(s)

On prépare le ou les disques enfants. Soit vous le faites un GUI via l’interface d’Hyper-V soit via Powershell, comme ceci:

New-VHD -Path E:\VM\LAB\Template\20220714_CHILD_tpl_WS2022_unattend.vhdx -ParentPath E:\VM\Templates\20220714_PARENT_tpl_WS2022_unattend.vhdx -Differencing
  • Path: Le chemin du VHDX enfant que vous allez créer
  • ParentPath: Le chemin du disque parent
  • Differencing: Pour indiquer qu’il s’agit d’un disque de différenciation.

A partir d’ici il faut comprendre quelque chose, votre disque enfant est vide, donc soit vous vous faites ch**r à en créer un par VM, soit vous garder celui que vous venez de créer comme template et vous le dupliquer pour chaque VM, simplement en faisant des copies du VHDX enfant, comme vous allez le voir dans le script de création de VMs.

Création de la VM

Un fois qu’on a le disque parent et le disque enfant on passe à la création de VM, vous pouvez bien sur le faire en GUI, ou via New-Vm, ici je vous donne mon script:

#Requires -RunAsAdministrator
param(
    # VM Name
    [Parameter(Mandatory=$true, Position=0)]
    [ValidateNotNullOrEmpty()]
    [string]
    $VMName,

    # OS
    [Parameter(Mandatory=$true, Position=1)]
    [ValidateSet("W10","W2022")]
    [string]
    $OS,

    # Automatic checkpoints
    [Parameter(Mandatory=$false, Position=2)]
    [Switch]
    $AutomaticCheckpoints,

    # Start VM
    [Parameter(Mandatory=$false)]
    [Switch]
    $StartVM
)

# Define settings for each managed OS
switch($OS) {
    "W10" {
        $VHDTPL = "E:\VM\LAB\Template\TPLW10\Virtual Hard Disks\20220128_CHILD_tpl_W10_21H2-unattend.vhdx" # Child disk W10
        $VMMemory = "6GB"
        $VMNet = "External"
        $DynMemMin = "4GB"
        $DynMemMax = "8GB"
    }
    "W2022" {
        $VHDTPL =  "E:\VM\LAB\Template\TPLW2022\Virtual Hard Disks\20220714_CHILD_tpl_WS2022_unattend.vhdx" # Child disk WS2022
        $VMMemory = "8GB"
        $VMNet = "CrashLAB"
        $DynMemMin = "6GB"
        $DynMemMax = "12GB"
    }
}

$VMsRoot = "E:\VM\LAB" # Path where VMs are stored.
$VMInit = $VMsRoot + "\" + $VMName
$VMPath = $VMInit
$VMIndex = 0

# Check if VM folder already exist, if yes increment from 001 each loop
While (Test-Path $VMPath) {
    Write-Warning ($VMPath + " already exist... Indexing.")
    $VMIndex++
    $VMPath = $VMInit + $VMIndex.toString("000")
}

$VMName = ($VMPath -split "\\")[-1] # Get VM Name (if VM folder already existed and new one was choose)
$VHDPath = $VMPath + "\Virtual Hard Disks" # Virtual hard disks folder inside VM folder

# Folders creation
New-Item $VMPath -ItemType Directory | Out-Null
New-Item $VHDPath -ItemType Directory | Out-Null

# Test if template specified in switch exist
If(-not (Test-Path $VHDTPL)) {
    Throw ($VHDTPL + " not found")
}

Copy-Item $VHDTPL $VHDPath # Copy child disk template in VM Virtual Hard disks folder

$VHDFile = $VHDPath + "\" + ($VHDTPL -split "\\")[-1] # Get path of new child disk

# Create VM (Generation 2 in mandatory, generation 1 will not boot with convert-wim2vhd command)
New-VM -Name $VMName -MemoryStartupBytes $VMMemory -VHDPath $VHDFile -Path $VMsRoot -SwitchName $VMNet -Generation 2 | Out-Null
# Set VM settings
Set-VM -Name $VMName -MemoryMinimumBytes $DynMemMin -MemoryMaximumBytes $DynMemMax -AutomaticCheckpointsEnabled $AutomaticCheckpoints.IsPresent

# Start if required
if($StartVM -eq $true) {Start-VM -Name $VMName}

# Display current VM information
Get-VM -Name $VMName

Examples:

New-HyperVVM.ps1 -VMName WS2022 -OS W2022

Créé un VM Windows Server 2022 nommée WS2022

New-HyperVVM.ps1 -VMName W10 -OS W10 -AutomaticCheckpoints -StartVM

Créé un VM Windows 10 nommé W10, avec les checkpoints automatiques activés, et démarre la VM après la création

Ce script doit être lancé avec des droits d’admin, il n’accepte pas les inputs depuis le pipeline mais peut être automatisé avec une boucle comme par exemple un bon vieux foreach.


0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée.