两种架构,两种存储模式
WSL1压根没有Linux内核:它实时把Linux系统调用翻译成Windows调用,文件放在一个普通文件夹里——历史上是%LOCALAPPDATA%\Packages\<Distro>\LocalState\rootfs——对Windows工具完全可见。这让它在磁盘上很轻,脚本读写/mnt/c上的文件时也快,但翻译并不完整:Docker、systemd以及任何需要冷门syscall的东西都跑不起来。WSL2在轻量工具VM里运行真正的Linux内核,兼容性问题解决了——但发行版的整个文件系统从此住进一个ext4.vhdx:一张Windows会挂载却不会解读的虚拟磁盘镜像。
vhdx对商店安装的发行版放在%LOCALAPPDATA%\Packages下,较新的安装则放在%LOCALAPPDATA%\wsl下,而且它有个恶劣的属性:按需增长,从不自行收缩。在发行版里删文件,释放的是虚拟磁盘内部的空间,.vhdx文件却保持着历史最高水位,直到你手动压缩。在发行版里大扫除之后立刻去资源管理器看文件大小,是最经典的失望时刻:数字纹丝不动。
各自把GB藏在哪
两个版本都不自己收拾残局,而空间消失的地方少得惊人:
- WSL2的ext4.vhdx——每个发行版都有一个;重度使用Docker的开发环境轻松把它推过30GB
- Docker Desktop自己的数据盘(docker_data.vhdx),遵循同样的只增不减法则
- WSL1的rootfs文件夹——相比之下不算大,但被遗忘的老发行版仍完整保留着整套安装
- 发行版内部的Linux软件包和构建缓存——apt缓存、node_modules、target/和构建文件夹,让vhdx永久膨胀
- 停放在下载文件夹里被遗忘的wsl --export备份和下载的发行版镜像
不弄坏发行版地收回空间
先清内部:apt autoremove和apt clean、Docker Desktop里的docker system prune、npm和pip的缓存清理——在压缩容器之前先腾空虚拟磁盘的一切手段。然后运行wsl --shutdown,因为运行中的发行版会锁住自己的vhdx;接着压缩镜像:有Hyper-V工具就用带-Mode Full选项的Optimize-VHD,任何Windows上都能用的是diskpart的select vdisk file="<path>", attach vdisk, compact vdisk, detach vdisk。较新的WSL版本提供wsl --manage <Distro> --set-sparse true,让vhdx自动释放空间——长期看是真正更好的设置。
还有两个最后手段,名副其实。wsl --export把发行版打成一个.tar,可以用wsl --import导入到另一块盘——这是把WSL2安装从爆满的C盘搬走的干净办法。而wsl --unregister <Distro>会把发行版连同vhdx整个删掉——这条命令没有撤销,请把它当作它本来的样子:核弹。顺手再用一个限制内存和处理器的.wslconfig文件,给VM的胃口盖上盖;否则闲置的WSL2虚拟机会毫无意义地攥着几个GB的内存。
常见问题与解答
怎么缩小WSL2的ext4.vhdx文件?
先在发行版内部清理,运行wsl --shutdown,再用diskpart(select vdisk file, attach vdisk, compact vdisk, detach vdisk)或Optimize-VHD压缩vhdx。较新的WSL上,wsl --manage <Distro> --set-sparse true可让磁盘自动释放空间。
该用WSL1还是WSL2?
WSL2是默认选择,也是Docker、systemd和一切需要真内核的场景的唯一答案。WSL1在轻量命令行工作——主要是读写Windows盘上的文件——上仍然占优:没有VM、没有vhdx、没有内存开销。
联系我们: [email protected]