Blog do Euclides script script para habilitar VT‑x/AMD‑V no VirtualBox

script para habilitar VT‑x/AMD‑V no VirtualBox

Este codigo em Powershell habilita automaticamente em todas suas VMs a opção.

<#
.SYNOPSIS
  Habilita Nested VT-x/AMD-V em todas as VMs do VirtualBox (sem validação).

.DESCRIPTION
  - Localiza VBoxManage
  - Lista todas as VMs
  - Para cada VM:
      * Se estiver rodando, envia poweroff (best-effort)
      * Executa: VBoxManage modifyvm "<VM>" --nested-hw-virt on
      * (Opcional) Ajusta paravirtualização para kvm (útil para Linux/Ubuntu)

.NOTES
  Execute como Administrador. Feito para Windows host.
#>

# ---------- Utilidades de saída ----------
function Info($msg) { Write-Host "[INFO] $msg" -ForegroundColor Cyan }
function Ok($msg)   { Write-Host "[OK]   $msg" -ForegroundColor Green }
function Warn($msg) { Write-Host "[AVISO] $msg" -ForegroundColor Yellow }
function Err($msg)  { Write-Host "[ERRO] $msg" -ForegroundColor Red }

# ---------- Encontrar VBoxManage ----------
$VBoxManage = "${env:PROGRAMFILES}\Oracle\VirtualBox\VBoxManage.exe"
if (-not (Test-Path $VBoxManage)) { $VBoxManage = "VBoxManage.exe" }
if (-not (Get-Command $VBoxManage -ErrorAction SilentlyContinue)) {
    Err "VBoxManage não encontrado. Instale o VirtualBox ou adicione-o ao PATH."
    exit 1
}

# ---------- Obter VMs ----------
$allVmsRaw = & $VBoxManage list vms 2>$null
if (-not $allVmsRaw) {
    Warn "Nenhuma VM encontrada."
    exit 0
}

# Converte linhas do tipo:  "VM Name" {UUID}  ->  objeto com Name e Uuid
$allVms = $allVmsRaw | ForEach-Object {
    if ($_ -match '^\s*\"(.+?)\"\s+\{([0-9a-fA-F-]+)\}\s*$') {
        [PSCustomObject]@{ Name = $Matches[1]; Uuid = $Matches[2] }
    }
} | Where-Object { $_ -ne $null }

Info "Total de VMs: $($allVms.Count)"

# Lista de VMs rodando
$runningRaw = & $VBoxManage list runningvms 2>$null
$runningNames = @()
if ($runningRaw) {
    $runningNames = ($runningRaw | ForEach-Object {
        if ($_ -match '^\s*\"(.+?)\"\s+\{') { $Matches[1] }
    })
}

# ---------- Processar cada VM ----------
foreach ($vm in $allVms) {
    Write-Host "`n=== VM: $($vm.Name) ===" -ForegroundColor White

    # Se estiver em execução, tenta poweroff (best-effort)
    if ($runningNames -contains $vm.Name) {
        Info "VM em execução. Enviando poweroff…"
        try {
            & $VBoxManage controlvm "$($vm.Name)" poweroff | Out-Null
            Start-Sleep -Seconds 3
        } catch {
            Warn "Não foi possível desligar automaticamente. Tentarei aplicar mesmo assim."
        }
    }

    # Habilitar nested virtualization (sem checagem)
    try {
        Info "Habilitando nested VT-x/AMD-V…"
        & $VBoxManage modifyvm "$($vm.Name)" --nested-hw-virt on | Out-Null
        Ok "Nested habilitado."
    } catch {
        Err "Falha ao aplicar nested em '$($vm.Name)'. Detalhe: $($_.Exception.Message)"
        continue
    }

    # (Opcional) Ajuste de paravirtualização – útil p/ guests Linux/Ubuntu
    try {
        & $VBoxManage modifyvm "$($vm.Name)" --paravirtprovider kvm | Out-Null
        Ok "Paravirtualização ajustada para 'kvm'."
    } catch {
        Warn "Não foi possível ajustar paravirtualização (ignorado)."
    }
}

Write-Host "`nConcluído." -ForegroundColor Green
Write-Host "Inicie suas VMs e, no Linux convidado, você pode conferir com:"
Write-Host "  egrep -c '(vmx|svm)' /proc/cpuinfo   # >0 = OK"
Write-Host "  lscpu | findstr /i virtualization"

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Related Post