Suis-je VT-Compliant ?
Pour s’assurer que les technologies Intel VT ou AMD-V soient bien activées au niveau du processeur, le premier réflexe serait d’aller dans le BIOS du serveur pour vérifier ces paramètres.
Oui, mais non, redémarrer un serveur pour accéder aux paramétrages du BIOS n’est pas tout le temps faisable, surtout en production, d’autant plus que vous pouvez récupérer cette informations directement en ligne de commande.
Depuis un shell ESX ou ESXi, il suffit de lancer la commande suivante pour vérifier cela :
esxcfg-info | grep "HV Support"
Le résultat de la commande donnera un niveau de HV Support, dont les valeurs correspondent à :
0 indicates that support is not available for this hardware.
1 indicates that VT or AMD-V might be available but it is not supported for this hardware.
2 indicates that VT or AMD-V is available but is currently not enabled in the BIOS.
3 indicates that VT or AMD-V is enabled in the BIOS and can be used.
Voici la KB VMware qui détaille ce processus : http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1011712
Donc on peut très bien imaginer un petit script PowerCLI qui va vérifier ce paramètre pour tous les serveurs ESX/ESX(i) de votre vCenter :
Function Check-VTCompliant {
<#
.SYNOPSIS
Check if ESX/ESXi hosts are VT compliant
.DESCRIPTION
Will check if VT technology (Intel VT, AMD-V)
is available on the host hardware.
0 indicates that support is not available for this hardware.
1 indicates that VT or AMD-V might be available but it is not supported for this hardware.
2 indicates that VT or AMD-V is available but is currently not enabled in the BIOS.
3 indicates that VT or AMD-V is enabled in the BIOS and can be used.
VMware KB Article: 1011712
.NOTES
Authors: www.vmdude.fr
.PARAMETER userESX
Name of the SSH account that will be used for plink.
Cannot be null.
.PARAMETER pwdESX
Password of the SSH account that will be used for plink.
Cannot be null.
.EXAMPLE
PS> Check-VTCompliant -userESX root -pwdESX password
#>
PARAM(
[Parameter(Mandatory=$true,HelpMessage="Compte d'accès SSH pour les serveurs ESX/ESXi ?")] [string] $userESX,
[Parameter(Mandatory=$true,HelpMessage="Mot de passe pour le compte d'accès SSH ?")] [string] $pwdESX
)
BEGIN{
# Pour eviter les retours en warning/error
$ErrorActionPreference = "SilentlyContinue"
$WarningPreference = "SilentlyContinue"
If ((Get-PSSnapin -Name "VMware.VimAutomation.Core" -ErrorAction SilentlyContinue | Measure-Object).count -eq 0) {
Add-PSSnapin -Name "VMware.VimAutomation.Core"
}
}
PROCESS{
# Chemin d'accès à l'exécutable plink.exe pour pousser des commandes ssh en CLI
$plinkPath = ".\plink.exe"
# Récupération des host
$vmhosts = Get-VMHost
# Parcours des serveurs hôtes
Foreach ($vmhost in $vmhosts) {
# Execution de la commande esxcfg-info via plink
$command = $plinkPath + " -batch -pw $pwdESX $userESX@$vmhost 'esxcfg-info' 2>err.log"
$esxcfgInfo = Invoke-Expression -Command $command
# Construction du tableau final
$ligne = "" | Select vmhost, hvSupport
$ligne.vmhost = $vmhost
# Variable ne contient rien = erreur
if ($esxcfgInfo -ne $null) {
# Masque en expression régulière pour récupérer la valeur souhaitée
$regexMask = [regex]"HV Support\.*(\w+)"
$result = $regexMask.Matches($esxcfgInfo)
$ligne.hvSupport = $result[0].Groups[1].Value
} else {
# On recupère l'erreur pour afficher une aide de résolution
$errContent = Get-Content .\err.log -totalCount 1
Remove-Item .\err.log -Force
if ($errContent -match "The server's host key is not cached in the registry") {
# Clé RSA non connue, validation par l'utilisateur obligatoire
# incompatible avec le lancement de plink.exe en -batch
# Résolution : lancer une connexion SSH via putty, accepter la clé RSA et relancer le script
$ligne.hvSupport = "[ERREUR] Clé RSA inconnue"
} elseif ($errContent -match "FATAL ERROR: Network error: Connection refused") {
# Impossible de se connecter en SSH
# Résolution : vérifier les ouvertures de ports (22) et l'activation du SSH sur l'ESX/ESXi
$ligne.hvSupport = "[ERREUR] Accès SSH impossible"
} elseif ($errContent -match "FATAL ERROR: Network error: Connection timed out") {
# Timeout lors de la connexion SSH
$ligne.hvSupport = "[ERREUR] Timeout SSH"
} else {
# Erreur inconnue
$ligne.hvSupport = "[ERREUR]"
}
}
$ligne
}
}
}