在 WSL 中制作快照

在 WSL 中制作快照

我刚刚在机器上安装了 wsl 2(使用 Windows 10 pro)。我下载了 ubuntu 发行版 20.04。我想知道是否可以像在 Vmware 中一样对其进行快照和克隆。谢谢!

答案1

@Esther 提到超级用户的评论很好,但我认为这个问题值得在 Ask Ubuntu 上找到自己的答案。它也需要一个更新答案是因为 WSL 在这方面有新功能。

超级用户问题也仅涵盖克隆/备份,但不是真正的“快照”,我认为“快照”通常意味着“增量”备份。所以我试图在这个答案中也触及了“快照”。

备份 WSL1 或 WSL2 发行版

“备份” WSL1 或 WSL2 发行版的支持机制是使用wsl --export。与大多数备份一样,最好先关闭正在使用的文件,因此最好从 PowerShell 执行这些操作。

  1. 在 WSL 上退出 Ubuntu

  2. 从 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"
    

将先前的备份恢复到新实例(创建克隆实例)

可以使用wsl --import命令从上一步中的备份创建新实例来创建克隆。

再次,从 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

WSL 不会“记住” --imported 实例的默认用户,因此您需要手动设置。请参阅这个超级用户的回答了解如何使用/etc/wsl.conf文件执行此操作。

WSL 预览版中 WSL2 的全新、更简短选项

在最新版本的 WSL(目前为预览版)中,有多个附加选项wsl --import(以及--export)。

如果你运行的是 Windows 11(我知道你不是,但其他人可能不是,最终你可能也是),那么你可以从 Microsoft Store 安装它。它在那里被列为“Windows 子系统 Linux 预览版”

使用此版本,您可以直接使用将 VHDX 文件(WSL2 实例的虚拟磁盘)从现有实例导入到新实例中wsl --import --vhd。首先,您需要知道现有 VHDX 位于何处。

从 PowerShell:

Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss\ | ForEach-Object { (Get-ItemProperty $_.PSPATH) | Select-Object DistributionName,BasePath }

然后只需从该位置导入:

# 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

请注意,如果您收到以下错误:

The process cannot access the file because it is being used by another process.

...然后按顺序尝试这个:

  • wsl --terminate <distro>现有实例,然后重试--import
  • 如果 Docker Desktop 正在运行,请停止它,然后重试--import
  • wsl --shutdown,然后重试--import

这种方法有一个缺点,即这仅仅是现有 WSL2 vhdx 文件的“副本”。这意味着如果它占用的空间超过所需空间,新映像将具有相同的“浪费空间”(请参阅这个答案了解更多信息)。

增量快照

WSL 尚未提供执行增量快照以节省空间的功能。它可能可以手动将其组合在一起,但我还没有亲自测试过这种技术。从高层次来看,这个想法是:

  • 使用 Gnutar增量转储特征。
  • 指定--one-file-system--xattrs捕获实际文件系统中的正确文件(以及它们的扩展属性,如果在您的发行版中使用的话)。
  • 从增量 tarball 重建“非增量” tarball。
  • 使用 恢复它wsl --import

我一直想尝试一下,但一直没有时间。

相关内容