Hyper-V 2016 et les VM Linux les bonnes pratiques à la création

Ludovic QUENEC'HDU
Ludovic QUENEC'HDU 1 commentaire 9e lecture en min
Si vous installez une machine virtuelle Linux dans un Hyper-V, vous aurez différents points à contrôler avant de procéder à l’installation, afin d’avoir un fonctionnement optimum. Dans un premier temps avant d’installer votre machine virtuelle quelques soit votre distribution, il vous faudra choisir quel type de machines virtuelle vous voulez installer :
  • génération 1 qui sera un ensemble des matériels dit ancienne génération, par exemple contrôleur disque IDE, port COM, Port PCI, Clavier et souris PS/2, carte vidéo S3 tout ce qu’on peut retrouver dans Hyper-V 2008/R2
  • génération 2 vas fournir un ensemble de matériel type, contrôleur SCSI (prise en charge des .VHDX), des périphériques émulés par logiciel (clavier, carte vidéo), carte réseau logiciel (qui permet le boot PXE). Nous retrouverons aussi d’autres avantages comme démarrage sécurisé et prise en charge du microprogramme UEFI.
Et c’est sur ce dernier point que nous allons nous attarder. En effet, si vous voulez installer une machine virtuelle Linux de génération 2, la configuration par défaut du démarrage sécurisé vous empêchera de démarrer. En bien c’est logique Hyper-V UEFI détectera un système non signé Microsoft et n’autorisera pas le boot du système. Mais UEFI (Unified Extensible Firmware Interface) c’est quoi : c’est un micrologiciel qui vient se substituer au bios, afin d’apporter plus de fonctionnalités. Par exemple les interfaces « user friendly » pour remplacer le bios, l’optimisation du démarrage de la machine, la prise en charge de la configuration réseau.
Alors attention le UEFI n’est pas du tout une norme définie par des RFC mais plutôt un consensus entre différentes entreprises. Si vous voulez la liste des entreprises elle est disponible sur le site officiel http://www.uefi.org/members c’est aussi pour ça que nous n’avons pas qu’une interface et des fonctionnalités communes mais plutôt un custom à la sauce constructeur. Un exemple concret Dell va vous permettre de mettre à jour votre système par son interface de configuration en utilisant internet, sans passer par un CD de démarrage. Un des paramètres UEFI qui nous intéresse, c’est le Secure BOOT. Cette option est une sécurité contre les bootkit. En fait tous les systèmes non reconnus par le Secure BOOT UEFI, ne seront pas autorisés à démarrer. Pour en revenir à nos moutons, sous hyper-V quand on crée une nouvelle machine virtuelle de génération 2, le paramètre UEFI par défaut est Microsoft, c’est-à-dire que seules les machines Microsoft de Vista et 2008 aux versions présente (10 et 2012R2) sont autorisés à démarrer. Nous aurons le résultat suivant : HyperV-Linux01sur05 Depuis Windows Server 2016, nous avons la possibilité de changer le Template du Secure BOOT UEFI pour changer ce paramètre il faut aller dans les paramètres de votre Machine virtuelle puis dans sécurity, dans Template sélectionner « Microsoft UEFI Certificate Authority » HyperV-Linux02sur05 Ou en PowerShell toujours sur Windows server 2016
Set-VMFirmware  [VM_Name ] -SecureBootTemplate MicrosoftUEFICertificateAuthority
Ha ba oui mais sous Windows Server 2012 on fait comment ? Eh bien on ne fait pas et Paf !! Il faudra tout simplement décocher la case Enable Secure BOOT, si vous voulez utiliser des machines de Génération 2 En PowerShell avec Windows server 2012 :
Set-VMFirmware SRVTEST -EnableSecureBoot off
Ensuite, il faut savoir qu’une machine linux au niveau disque, ça peut avoir un peu la bougeotte et quand ça a la bougeotte ce n’est pas bon pour les disques dynamiques. Pour limiter cet impact, il recommandait de changer la taille des blocs sur le fichier .VHDX par défaut de 32 Mo, de la passer à 1 Mo. Cela se passe avec la commande powershell :
New-VHD –Path [nom de la VM] –SizeBytes 127GB –Dynamic –BlockSizeBytes 1MB
Attention : 1Mb pour 1 Mega Bytes, et Bytes en Anglais c’est Octets. Beaucoup de monde tombe dans le piège notamment pour les mesures performances Dans le choix de type de système de fichiers, il sera préférable d’utiliser un système de fichiers ext4 car il est plus performant sur les disques dynamiques. La partie réseau Si vos futures machines virtuelles vous faire un cluster basé sur les adresses MAC, la carte réseau de votre machine virtuelle doit avoir obligatoirement une adresse MAC statique. En fait en cas de basculement, la carte réseau de la machine virtuelle risque de perdre sa configuration d’adresse, c’est pour cela qu’on doit la fixer en statique. Pour mettre l’adresse MAC en statique, vous devez aller dans les propriétés de la VM, puis dans Carte Réseau et Fonctionnalités avancées. Là, dans le panneau de droite vous pourrez le fixer l’adresse MAC en statique: HyperV-Linux03sur05 Et en powershell:
Set-VMNetworkAdapter [nom de la VM] -StaticMacAddress [adresse Mac]
C’est tout pour les recommandations avant la création de la VM.   Maintenant il ne reste plus qu’a scripté tout ça 🙂 :
<#
.Synopsis
   Create Virtual Machine Linux
.DESCRIPTION
   Create Virtual Machine Linux by Hyper-V version
.EXAMPLE
   New-VMLinux  -ServerName "localhost" -VMname "SRVLINUX"  -VmPath 'c:\vmtest' -VhdxSize 20 -VmRam 2 -VmCpu 2
#>
function New-VMLinux
{
    [CmdletBinding()]
    [Alias()]
    [OutputType([int])]
    Param
    (
        #server Hpyve-V name
        $ServerName,
        # VM name
        $VMname,
        # Path of VM
        $VmPath,
        # Max Size VHDX
        $VhdxSize,
        # Max size Ram
        $VmRam,
        # Nomber of Cpu
        $VmCpu
    )	

    Begin
    {
    }
    Process
    {
    #Test of connectivity
    try
    {
        $connetion = Test-Connection -computername $ServerName -Count 1 -ErrorAction stop
        
    }
        catch [System.Net.NetworkInformation.PingException]
    {
        return "$ServerName offline or not existing" 
        exit       
    } 
    try 
        {
            $HPtest = Get-WmiObject -ComputerName $ServerName -Class Win32_PerfFormattedData_HvStats_HyperVHypervisor -ErrorAction Stop
        } 
    #test if remote access is ok
    catch [System.UnauthorizedAccessException]
        {
        Return write-host "Not access"
        }
    #test if Hyper-V is present 
    catch [System.Management.Automation.RuntimeException]
        {
        Return write-host "Hyper-V not present"
        }
    #Check hyper-V version
    $HpVer1 = (Get-WmiObject -ComputerName $ServerName -Class Win32_operatingSystem).Version
    $hpVer2 = $HpVer1.split(".")

    switch ($hpVer2[0])
    {
        '10' {
                $HPVer = "W2K16"
             }
        '6' {
            switch ($hpVer2[1])
                {
                '0' {
                        $HPVer = "W2K8"
                    }
                '1' {
                        $HPVer = "W2K8R2"  
                    }
                '2' {
                        $HPVer = "W2K12"            
                    }                
                '3' {
                        $HPVer = "W2K12R2"            
                    }  
                }
        }   

    }

    # test File path
    $filetest = Test-Path $VmPath 
    if($filetest -eq $false)
        {
        Return Write-Host "file not present $VmPath"
        }    
    # test VM name is not use
    $VMexists = (get-vm -ComputerName $ServerName).Name
    foreach ($VMexist in $VMexists)
        {
        if($VMname -eq $VMexist)
            {
            Return write-host "error the VM name $VMname is present"
            }   
        }
    #test free space path
    $RootPath = (Get-ItemProperty $VmPath).Root.Name
    If ($RootPath.Contains("$"))
        {
        $RootPath = $RootPath.replace('$',':')
        }       
    if ($RootPath.Contains("\"))
        {
        $RootPath = $RootPath.replace('\','')
        }        
    $PathfreeSize = [math]::round(((Get-WmiObject -ComputerName $ServerName -Class Win32_logicaldisk | Where-Object {$_.DeviceID -eq $RootPath}).FreeSpace /1Gb),1)
    If ($PathfreeSize -lt $VhdxSize)
        {
        Write-Warning "overprovisioning!! $PathfreeSize Gb free size"
        }
    #test free memory
    $freeRam = [math]::round(((Get-WmiObject -ComputerName $ServerName -Class Win32_OperatingSystem).FreePhysicalMemory /(1024 * 1024)),1)
    If ($PathfreeSize -lt $VhdxSize)
        {
        Write-Warning "overprovisioning of memory!! $PathfreeSize Gb free RAM"
        }
    #Create VM 
    if (($VmPath).EndsWith("\") -eq $false )
        {
        $VmPath = $VmPath + "\"
        }
     
    $VmPathfinal = $VmPath + $VMname + ".vhdx"
    $VhdxSizefinal = $VhdxSize * 1Gb
    $VmRamfinal =  $VmRam * 1Gb
            
    New-VHD -Path $VmPathfinal -SizeBytes $VhdxSizefinal -Dynamic –BlockSizeBytes 1MB
    switch ($HPVer)
        {
            {$_ -in 'W2K8','W2K8R2'} {New-VM -Name $VMname -VHDPath $VmPathfinal}
            Default {New-VM -Name $VMname -generation 2  -VHDPath $VmPathfinal }
        }
    Set-VM $VMname -ProcessorCount $VmCpu -DynamicMemory  -MemoryMaximumBytes $VmRamfinal
    if($HPVer -eq "W2K16")
        {
        Set-VMFirmware  $VMname -SecureBootTemplate MicrosoftUEFICertificateAuthority
        }
    }
    End
    {
    }
}
Une aide est intégrée: HyperV-Linux04sur05 Voici un exemple de création HyperV-Linux05sur05
Partager cet article
Par Ludovic QUENEC'HDU Expert en Virtualisation et Sécurité Informatique au Service de Grands Comptes et du Logiciel Libre
Ludovic QUENECHDU est un véritable virtuose de la virtualisation et de la sécurité informatique. Depuis son indépendance professionnelle en 2000, il a apporté son expertise à de prestigieux clients tels que Cameroun Telecom, Merryl Lynch, Ernst & Young, AXA, et bien d'autres. En parallèle, Ludovic s'engage régulièrement dans le démarrage de petites entreprises, notamment dans le domaine du logiciel libre, une passion qu'il chérit pour ses valeurs de partage et d'échange. Son parcours professionnel et sa passion pour la technologie en font un acteur incontournable de l'industrie informatique.
1 commentaire