如何更改我的 WSL2 发行版的磁盘映像的最大大小?

如何更改我的 WSL2 发行版的磁盘映像的最大大小?

看来 WSL 将文件系统数据存储在 vhdx 文件中。Ubuntu 将其视为 250GB 磁盘,这对我来说有点大。我想将其大小调整为 30GB 左右,以节省主机上的磁盘空间。

我见过几个链接,它们可以压缩 vhdx 文件并以此方式回收磁盘空间。这不是我想要的。我需要一个理想情况下不需要手动步骤的解决方案,但至少不需要我关闭 WSL

我看到了几个关于在 Hyper-V 环境中调整 vhdx 文件大小的链接。Hyper-V 工具似乎不太喜欢我的 WSL 映像。可能是因为它似乎没有分区表?

背景:我将把这个东西部署到构建服务器上,这意味着它必须尽可能地不被干预,并且尽可能多地保持正常运行时间。而且我可以提前预算磁盘使用量。事实上,我需要这样做,否则就没有空间容纳也将在那里运行的 Windows 构建

答案1

我知道这已经是几年前的事情了,所以你可能不再有这个特殊的需求了。然而,在最新的 WSL 版本中,动态 VHDX 的默认最大大小已增加到 1TB,因此问题可能会更加严重。

我需要一个理想情况下不需要手动步骤的解决方案,但至少不需要我关闭 WSL

虽然此解决方案需要大量手动步骤和关机,但它一度配置工作来设置一切。在那里,您只需使用一个wsl --import-in-place命令即可使用构建服务器上较小的驱动器大小启动新的 WSL 实例。

另外,不要太害怕下面的步骤/帖子的长度 - 我只是非常(也许过于)详细。

此特定解决方案需要运行 UBR 2311 或更高版本的 Windows 11 或 Windows 10(请参阅这个答案了解有关当前如何更新的详细信息)。

总结一下我的建议:

  • 创建具有所需最大大小的新 VHD
  • 将其挂载到 WSL 中并创建文件系统。
  • 将所有文件从现有 WSL 发行版复制到新的 VHD。
  • wsl --importVHD 作为新的发行版。

详细信息:

如果您使用的是 Windows 10 xxxxx.2311 或 Windows 11 22H2 版本:

  • 运行wsl --update,这将更新你的 WSL 以使用新的申请材料(商店)版本的 WSL。如果您无法从构建服务器访问商店,请参阅后半部分这个答案了解手动安装步骤。

  • 您需要安装两个发行版。一个是您要复制的发行版,另一个是用于执行复制的发行版(如果需要,可以使用“临时”发行版)。例如,如果您使用的是 Ubuntu,那么您可以从商店创建一个新的 Ubuntu-22.04 实例。

  • 在管理 PowerShell 中,使用以下命令创建一个新的动态 VHD:

    new-vhd -Dynamic -SizeBytes 30gb -BlockSizeBytes 1mb -path ./ext4.vhdx
    

    -BlockSizeBytes与 WSL2 文件的现有设置匹配ext4.vhdx

  • 退出管理 PowerShell 并在新的常规用户 PowerShell 中运行:

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

    记下您要复制的原始发行版的路径。我们将其称为<srcdrive>

  • wsl --shutdown确保原始发行版中没有文件正在使用。确保没有可能自动重启该发行版的进程(例如 Docker Desktop)。

  • 启动将用于复制的“临时”发行版wsl ~ -d <distroname>

  • lsblk并记下列出的现有设备。确保识别任何与您要格式化的设备大小相同的设备。您不想覆盖已在使用的设备!

  • 退出 WSL 并返回 PowerShell。

    wsl --mount --vhd --bare \path\to\the\new\ext4.vhdx
    wsl --mount --vhd --name srcdrive path\to\<srcdrive.vhdx>
    

    使用您上面确定的路径<srcdrive>

  • 再次启动临时 WSL 实例。

    lsblk
    
  • 确认要格式化的设备名称。希望它应该是那里唯一的 30G 设备。无论如何,它应该是列表中唯一一个在我们之前检查时不存在的 30G 设备。--mount我们将其称为newdev

    sudo mkfs.ext4 /dev/<newdev>
    sudo mount -t ext4 /dev/<newdev> /mnt/wsl/newdrive -o X-mount.mkdir
    
  • 你应该有两个坐骑:

    /mnt/wsl/srcdrive
    /mnt/wsl/newdrive
    

    srcdrive应该看起来像您想要复制的现有发行版的文件系统。 newdrive除了默认值之外,当前应该是空的lost+found

  • 复制文件系统:

    sudo cp -axT /mnt/wsl/srcdrive/ /mnt/wsl/newdrive/
    
  • 退出 WSL 临时分发

  • 返回 PowerShell:

    wsl --shutdown
    wsl --import-in-place <new_distro_name> \path\to\the\new\ext4.vhdx
    
  • 最后,使用 启动新发行版wsl ~ -d <new_distro_name>。它将以 root 用户身份启动。要设置默认用户,请/etc/wsl.conf按照中所述创建一个文件这个答案

现在,您可以使用新的 VHD 为您的构建系统提供多个(如果需要)较小的 WSL 发行版,并且只需附加一个即可wsl --import-in-place

相关内容