Fazendo um instantâneo no WSL

Fazendo um instantâneo no WSL

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.

  1. Saia do Ubuntu no WSL

  2. 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 --importcomando 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 --importinstâncias ed, então você precisará defini-lo manualmente. Veresta resposta do superusuáriopara saber como fazer isso usando um /etc/wsl.confarquivo.

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 --importnovamente.
  • Pare o Docker Desktop se ele estiver em execução e tente --importnovamente.
  • wsl --shutdowne tente --importnovamente.

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 tarGnudespejo incrementalrecurso.
  • Especifique --one-file-systeme --xattrscapture 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.

informação relacionada