前言

写这篇文章是因为近期在利用binwalk分析二进制固件时出了 bug,(也可能是遇上了zipbomb)。然后 WSL 连接的硬盘被扩了100个G。

WSL 连接的虚拟硬盘大小一般是只增不减的,光删除里面的文件没用。因此要自行手动压缩并指定配额上限。

DiskPart

DiskPart 是 Windows 下的一个实用程序,可以在终端中输入diskpart或者Win+R运行diskpart以打开其命令解释器。

以下为命令列表:

命令 描述
active 将具有焦点的磁盘分区标记为活动。
add 将选中的简单卷镜像到指定磁盘。
assign 给选中的卷分配一个驱动器号或装入点。
attach vdisk 附加(有时称为装载或显露)虚拟硬盘 (VHD),使其在主机计算机上显示为本地硬盘驱动器。
attributes 显示、设置或清除磁盘或卷的属性。
automount 启用或禁用自动装载功能。
break 将选中的镜像卷分为两个简单卷。
clean 从选中的磁盘中删除所有分区或卷格式。
compact vdisk 减小动态扩展虚拟硬盘 (VHD) 文件的物理大小。
convert 将文件分配表(FAT)和 FAT32 卷转换为 NTFS 文件系统,现有文件和目录保持不变。
create 在磁盘上创建分区,在一个或多个磁盘上创建卷,或者创建虚拟硬盘 (VHD)。
delete 删除分区或卷。
detach vdisk 阻止所选虚拟硬盘 (VHD) 在主计算机上显示为本地硬盘驱动器。
detail 显示有关所选磁盘、分区、卷或虚拟硬盘 (VHD) 的信息。
exit 退出 DiskPart 命令解释程序。
expand vdisk 将虚拟硬盘 (VHD) 扩展到指定的大小。
extend 将带焦点的卷或分区及其文件系统扩展到磁盘上的空闲(未分配)空间。
filesystems 显示有关具有焦点的卷的当前文件系统的信息,并列出支持格式化卷的文件系统。
format 格式化磁盘以接受文件。
gpt 将 GPT 属性分配给焦点位于基本 GUID 分区表 (gpt) 磁盘上的分区。
help 显示可用命令的列表或有关指定命令的详细帮助信息。
import 将外部磁盘组导入本地计算机的磁盘组。
inactive 在基本主启动记录 (MBR) 磁盘上,将选中的系统分区或启动分区标记为非活动的。
list 显示磁盘、磁盘中分区、磁盘中卷的列表或虚拟硬盘 (VHD) 的列表。
merge vdisk 将差异虚拟硬盘 (VHD) 与其对应的父 VHD 合并。
offline 使联机磁盘或卷进入脱机状态。
online 使脱机磁盘或卷进入联机状态。
recover 刷新磁盘组中所有磁盘的状态,尝试恢复无效磁盘组中的磁盘,并重新同步具有陈旧数据的镜像卷和 RAID-5 卷。
rem 提供一种向脚本添加注释的方法。
remove 从卷中删除驱动器号或装入点。
repair 通过用指定的动态磁盘替换失效的磁盘区域来修复选中的 RAID-5 卷。
rescan 查找可能已添加到计算机的新磁盘。
retain 准备现有的动态简单卷以将其用作启动卷或系统卷。
san 显示或设置操作系统的存储区域网络 (san) 策略。
select 将焦点切换到磁盘、分区、卷或虚拟硬盘 (VHD)。
set id 更改具有焦点的分区的“分区类型”字段。
shrink 按指定的量减小所选卷的大小。
uniqueid 显示或设置带焦点的磁盘的 GUID 分区表 (GPT) 标识符或主启动记录 (MBR) 签名。

我们要做的就是在删除完无用文件后,把虚拟硬盘压缩到原来的大小。

因此第一步就是找到WSL使用的虚拟硬盘,在终端中依次执行以下命令:

关闭WSL实例

1
wsl.exe --shutdown

查找WSL所使用的虚拟硬盘路径,记得将<distribution-name>替换为实际的发行版名称

1
(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue("DistributionName") -eq '<distribution-name>' }).GetValue("BasePath") + "\ext4.vhdx"

复制刚刚得到的路径,将<pathToVHD>替换为你的路径

1
Select vdisk file="<pathToVHD>"

压缩虚拟硬盘

1
compact vidisk

等待命令执行完毕后,分离虚拟硬盘

1
detach vdisk

接下来你的虚拟硬盘就应该被压缩成功了。

WSL2创建的VHD默认使用ext4文件类型,并且默认的容量上限为1TB(老版本为512G/256G)。使用diskpart同样也可以为虚拟硬盘扩容,具体可以参考Microsoft Learn

GUI图形化界面

未更