As máquinas virtuais do Hyper-V no Windows 11 criam arquivos .vhdx que crescem com o tempo à medida que você instala software, atualiza o sistema operacional ou copia arquivos. Mesmo após excluir dados dentro da VM convidada, o arquivo .vhdx do lado do host não diminui automaticamente para recuperar esse espaço livre. Isso leva ao desperdício de espaço em disco no seu computador host, às vezes dezenas de gigabytes por VM. Este artigo explica como configurar a compactação automática de arquivos .vhdx após cada desligamento da VM, usando um script PowerShell acionado por uma tarefa agendada.
Principais conclusões: Compactação automática de arquivos VHDX do Hyper-V após o uso
- Optimize-VHD -Path C:\VMs\VMName.vhdx -Mode Full: O cmdlet do PowerShell que compacta um arquivo .vhdx de expansão dinâmica, recuperando espaço não utilizado.
- Agendador de Tarefas > Criar Tarefa > Gatilho > Ao desconectar da sessão do usuário: O gatilho que executa o script de compactação cada vez que você desliga ou desconecta de uma VM.
- Mount-VHD e Dismount-VHD: Cmdlets necessários para anexar o .vhdx para otimização e desanexá-lo após a conclusão da operação.
Como funcionam a expansão dinâmica e a compactação do VHDX do Hyper-V
O Hyper-V oferece dois formatos principais de disco: tamanho fixo e expansão dinâmica. Um arquivo .vhdx de expansão dinâmica começa com um tamanho pequeno, normalmente alguns megabytes, e cresce à medida que o sistema operacional convidado grava dados. Quando você exclui arquivos dentro da VM, o arquivo .vhdx não diminui automaticamente. O espaço é marcado como livre dentro do convidado, mas o arquivo do lado do host permanece em seu tamanho máximo.
O processo de compactação usa o cmdlet Optimize-VHD do PowerShell. Este cmdlet lê o arquivo .vhdx e o reescreve, omitindo os setores que o sistema operacional convidado marcou como livres. O resultado é um arquivo do lado do host menor. A compactação exige que o .vhdx esteja montado no host durante a operação. Após a compactação, o .vhdx deve ser desmontado para que a VM possa acessá-lo normalmente.
Para esta automação, você precisa de uma VM que esteja desligada ou salva. Uma VM em execução não pode ter seu disco compactado. O script montará o .vhdx, executará o Optimize-VHD e o desmontará. A tarefa agendada é acionada após a VM parar, o que acontece quando você fecha a conexão da VM ou desliga o convidado.
Passos para configurar a compactação automática de VHDX no Windows 11
Este processo usa um script PowerShell e um gatilho do Agendador de Tarefas. O script é executado após você desconectar de uma sessão de VM, o que geralmente coincide com o desligamento da VM. As etapas abaixo pressupõem que você tenha o Hyper-V habilitado e pelo menos uma VM com um arquivo .vhdx de expansão dinâmica.
- Abra o PowerShell como Administrador
Pressione a tecla Windows, digite PowerShell, clique com o botão direito em Windows PowerShell nos resultados e selecione Executar como administrador. Clique em Sim no prompt de Controle de Conta de Usuário. - Crie o script de compactação
Na janela do PowerShell, execute o seguinte comando para criar um novo arquivo de script em uma pasta de sua escolha. Substitua C:\Scripts pelo caminho de sua preferência.New-Item -ItemType Directory -Path "C:\Scripts" -ForceEm seguida, crie o arquivo de script com este conteúdo. Copie e cole o bloco inteiro no PowerShell:
@"
param([string]\$VmName)# Obtém o objeto da VM
\$VM = Get-VM -Name \$VmName -ErrorAction SilentlyContinue
if (-not \$VM) { exit }# Obtém todos os discos rígidos conectados a esta VM
\$Disks = \$VM.HardDrives | Where-Object { \$_.Path -like "vhdx" }
if (-not \$Disks) { exit }foreach (\$Disk in \$Disks) {
\$VhdPath = \$Disk.Path
try {
Mount-VHD -Path \$VhdPath -ReadOnly
Optimize-VHD -Path \$VhdPath -Mode Full
Dismount-VHD -Path \$VhdPath
} catch {
# Registra o erro se necessário
}
}
"@ | Out-File -FilePath "C:\Scripts\Compact-VHD.ps1" -Encoding utf8Este script aceita um nome de VM como parâmetro, encontra todos os discos .vhdx anexados a essa VM, monta cada um como somente leitura, executa o Optimize-VHD e o desmonta.
- Abra o Agendador de Tarefas
Pressione Windows + R, digite taskschd.msc e pressione Enter. Isso abre o console do Agendador de Tarefas. - Crie uma nova tarefa para o script de compactação
No painel Ações à direita, clique em Criar Tarefa. A caixa de diálogo Criar Tarefa é aberta. - Nomeie a tarefa e configure as opções de segurança
Na guia Geral, insira um nome como Compactar VHDX do Hyper-V ao Desconectar. Em Opções de segurança, selecione Executar estando o usuário conectado ou não. Marque Executar com privilégios mais altos. Isso dá ao script permissão para montar e otimizar arquivos VHD. - Defina o gatilho para disparar na desconexão da sessão do usuário
Vá para a guia Gatilhos e clique em Novo. No menu suspenso Iniciar tarefa, selecione Ao desconectar da sessão do usuário. Em Configurações, mantenha o padrão Qualquer usuário. Clique em OK. Este gatilho é acionado cada vez que você fecha a janela de conexão da VM, o que geralmente acontece após desligar ou salvar a VM. - Configure a ação para executar o script PowerShell
Vá para a guia Ações e clique em Novo. No menu suspenso Ação, certifique-se de que Iniciar um programa esteja selecionado. Na caixa Programa/script, digite powershell.exe. Na caixa Adicionar argumentos, cole o seguinte:-ExecutionPolicy Bypass -File "C:\Scripts\Compact-VHD.ps1" -VmName "NomeDaSuaVM"Substitua NomeDaSuaVM pelo nome exato da sua VM Hyper-V. Se você tiver várias VMs, crie tarefas separadas para cada VM. Clique em OK.
- Defina condições e configurações
Vá para a guia Condições. Desmarque Iniciar a tarefa apenas se o computador estiver na alimentação CA se quiser que ela seja executada na bateria. Na guia Configurações, marque Permitir que a tarefa seja executada sob demanda. Defina Se a tarefa falhar, reiniciar a cada minuto para 1 e Tentar reiniciar até para 3. Isso ajuda se o .vhdx estiver temporariamente bloqueado. Clique em OK para salvar a tarefa. Digite sua senha se solicitado. - Teste a automação
Feche a janela de conexão da VM para a VM que você configurou. Aguarde 30 a 60 segundos. Abra o Explorador de Arquivos e navegue até o local do arquivo .vhdx. Clique com o botão direito no arquivo .vhdx, selecione Propriedades e observe o Tamanho em disco. Compare com o tamanho anterior. Deve ser menor se a VM tivesse espaço livre interno.
Problemas comuns e limitações da compactação automática
O arquivo .vhdx está bloqueado e não pode ser montado
Se a VM ainda estiver em execução ou em estado salvo com o disco anexado, a montagem do .vhdx como somente leitura falhará. O script inclui um bloco try-catch que sairá silenciosamente se o Mount-VHD falhar. Certifique-se de que a VM esteja completamente desligada ou salva antes da tarefa ser executada. O gatilho de desconexão geralmente funciona porque fechar a janela de conexão da VM aciona o evento após a VM ter parado.
Optimize-VHD demora muito e a próxima inicialização da VM é atrasada
A compactação de um arquivo .vhdx grande, como um com mais de 100 GB, pode levar vários minutos. Se você iniciar a VM antes que o script termine, a compactação falhará porque o .vhdx ainda está montado. Para evitar isso, defina a tarefa para ser executada com um atraso. Nas propriedades do gatilho, defina um atraso de 5 a 10 minutos. Isso dá tempo para o script ser concluído antes que você tente iniciar a VM novamente.
O script não é executado após desconectar de uma VM
O gatilho de desconexão é acionado para qualquer desconexão de sessão de usuário, não apenas para janelas de conexão de VM. Se você desconectar de uma sessão de Área de Trabalho Remota ou bloquear sua estação de trabalho, a tarefa também será executada. Isso é inofensivo porque o script verifica um nome de VM e sairá se a VM não existir. Para evitar execuções desnecessárias, crie uma tarefa separada para cada VM e use uma condição que verifique se a VM está desligada antes de executar o script.
A compactação não reduz o arquivo tanto quanto o esperado
O Optimize-VHD só recupera espaço que o sistema operacional convidado marcou como livre. Se o sistema de arquivos convidado estiver fragmentado ou se houver arquivos grandes que foram excluídos, mas o espaço ainda não foi marcado como livre, a compactação não recuperará esse espaço. Execute Optimize-Volume -DriveLetter C -ReTrim -Verbose dentro da VM convidada antes de desligá-la. Este comando instrui o convidado a limpar blocos não utilizados, tornando-os disponíveis para o host recuperar.
Compactação manual vs script automático: principais diferenças
| Item | Compactação Manual | Script Automático |
|---|---|---|
| Gatilho | Você executa o Optimize-VHD manualmente quando necessário | Executa automaticamente após desconectar da VM |
| Estado da VM necessário | VM deve estar desligada ou salva | VM deve estar desligada (acionada pela desconexão) |
| Esforço por VM | Lembrar de executar a compactação periodicamente | Configurar uma vez por VM |
| Risco de perda de dados | Baixo se seguir as etapas corretas | Baixo, o script monta como somente leitura |
| Recuperação de espaço | Imediata após a conclusão do comando | Atrasada até após o desligamento da VM |
| Melhor para | Limpeza única ou uso pouco frequente | Usuários frequentes de VM que precisam de recuperação consistente de espaço |
A compactação manual oferece controle total e é mais simples de realizar ocasionalmente. O script automático é melhor para usuários que executam VMs diariamente e desejam recuperar espaço sem lembrar de executar o comando. Ambos os métodos usam o mesmo cmdlet Optimize-VHD e produzem resultados idênticos.
O script automático monta o .vhdx como somente leitura, portanto não há risco de corrupção de dados. O método manual normalmente exige que você desligue a VM e execute o comando diretamente no host. O script também registra quaisquer erros no console do PowerShell, que você pode redirecionar para um arquivo se precisar de um registro da atividade de compactação.
Após configurar o script automático, você pode monitorar sua execução verificando o histórico do Agendador de Tarefas. Clique com o botão direito na tarefa e selecione Histórico para ver quando ela foi executada pela última vez e se foi bem-sucedida. Se a tarefa falhar, a configuração de reinicialização tentará até três vezes. Para falhas persistentes, verifique o caminho do script e certifique-se de que o nome da VM corresponda exatamente.
Agora você tem uma solução totalmente automatizada que reduz seus arquivos .vhdx do Hyper-V após cada uso da VM. Isso evita que o disco do host fique cheio de espaço não utilizado. Para controle avançado, modifique o script para compactar apenas arquivos VHDX que excedam um determinado tamanho ou adicione registro em log em um arquivo de texto. Combine isso com a limpeza periódica no convidado usando Optimize-Volume -ReTrim para máxima recuperação de espaço.