Acabei de instalar o wsl 2 na máquina (usando o Windows 10 pro). Baixei a distribuição ubuntu 20.04. Gostaria de saber se é possível fazer snapshots e clones dele como no VMware. Obrigado !
Responder1
O comentário de @Esther apontando para Superusuário é bom, mas acho que é uma pergunta que vale a pena ter sua própria resposta aqui no Ask Ubuntu. Também está precisando de umAtualizadaresposta já que o WSL possui novidades nesta área.
A pergunta do superusuário também cobre apenasclonagem/backups, mas não "instantâneos" verdadeiros, que considero normalmente significarem backups "incrementais". Então eu voutentarpara abordar "instantâneos" nesta resposta também.
Fazendo backup de uma distribuição WSL1 ou WSL2
O mecanismo suportado para "fazer backup" de uma distribuição WSL1 ou WSL2 é usar o wsl --export
. Tal como acontece com a maioria dos backups, é melhor fechar primeiro os arquivos em uso, por isso também é melhor executar essas ações no PowerShell.
Saia do Ubuntu no WSL
Do PowerShell:
wsl -l -v # Confirm your distribution name for the following commands wsl --terminate <distro_name> # Create directory structure, adjust to preference: mkdir "$env:userprofile\WSL\images" # You can hardcode the backup name below if you wish. # This example creates it with a date/timestamp-prefix on the tarball: wsl --export <distroname> "$env:userprofile\WSL\images\$(date -f yyyyMMdd_HHmmss)_Ubuntu.tar"
Restaurar o backup anterior para uma nova instância (criar uma instância clonada)
A criação do clone pode ser feita com o wsl --import
comando para criar uma nova instância a partir do backup feito na etapa anterior.
Novamente, do PowerShell:
# Adjust paths and names to your preference
mkdir "$env:userprofile\WSL\instances\Ubuntu20.04_TestClone"
wsl --import Ubuntu20.04_TestClone "$env:userprofile\WSL\instances\Ubuntu20.04_TestClone" <path_to_previous_backup.tar> --version 2
O WSL não "lembra" o usuário padrão para --import
instâncias ed, então você precisará defini-lo manualmente. Veresta resposta do superusuáriopara saber como fazer isso usando um /etc/wsl.conf
arquivo.
Nova opção mais curta para WSL2 no WSL Preview
Na versão mais recente do WSL (atualmente em visualização), existem várias opções adicionais para wsl --import
(assim como --export
).
Se você estiver executando o Windows 11 (o que eu sei que não, mas outros podem, e eventualmente você pode), você pode instalá-lo na Microsoft Store. Está listado lá como"Visualização do subsistema Windows para Linux".
Com esta versão, você pode importar diretamente um arquivo VHDX (o disco virtual de uma instância WSL2) de uma instância existente para uma nova instância usando wsl --import --vhd
. Primeiro, você precisará saber onde reside o seu VHDX existente.
Do PowerShell:
Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss\ | ForEach-Object { (Get-ItemProperty $_.PSPATH) | Select-Object DistributionName,BasePath }
Em seguida, basta importar desse local com:
# Adjust paths and names to your preference
mkdir "$env:userprofile\WSL\instances\Ubuntu20.04_TestClone"
wsl --import Ubuntu20.04_TestClone "$env:userprofile\WSL\instances\Ubuntu20.04_TestClone" <path_to_main_distro>\ext4.vhdx> --vhd --version 2
Observe, se você receber o seguinte erro:
The process cannot access the file because it is being used by another process.
... então tente isso em ordem:
wsl --terminate <distro>
a instância existente e tente--import
novamente.- Pare o Docker Desktop se ele estiver em execução e tente
--import
novamente. wsl --shutdown
e tente--import
novamente.
Há uma desvantagem nesse método: ele é puramente uma "cópia" do arquivo vhdx WSL2 existente. Isso significa que se estiver consumindo mais espaço do que o necessário, a nova imagem terá o mesmo “espaço desperdiçado” (vejaesta respostapara mais informações).
Instantâneos incrementais
WSL ainda não possui um recurso que fará snapshots incrementais para economizar espaço. Istopoderiaserá possível hackear isso manualmente, mas ainda não testei essa técnica pessoalmente. A ideia, em alto nível, é:
- Crie um tarball da instância existente usando
tar
Gnudespejo incrementalrecurso. - Especifique
--one-file-system
e--xattrs
capture os arquivos corretos no sistema de arquivos real (e seus atributos estendidos, se usados em sua distribuição). - Reconstrua um tarball "não incremental" a partir do tarball incremental.
- Restaure-o usando
wsl --import
.
É algo que eu queria tentar há algum tempo, mas ainda não tive tempo.