看来 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 --import
VHD 作为新的发行版。
详细信息:
如果您使用的是 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
。