众所周知,WSL2子系统的文件系统是通过windows挂载磁盘中的vhdx实现的。。。默认情况下,它们都是保存在C盘。比如Ubuntu22.04放在:
C:\Users\admin\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx
但是,尽管我小心翼翼地把Linux的大文件都放到其他盘,用了一年之后,这个vhdx文件还是快速增长到了23.3GB。
PS C:\Users\admin> wsl -l -v
NAME STATE VERSION
* docker-desktop-data Stopped 2
kali-linux Stopped 2
Ubuntu-22.04 Stopped 2
docker-desktop Stopped 2
加上其他的子系统,妥妥的100GB没有了。。。子系统的文件系统迁移至其他盘,也成为了刚需。
1、停止所有的子系统
为了避免迁移带来的影响,建议先把所有的子系统都停掉。命令如下:
PS C:\Users\admin> wsl --shutdown
PS C:\Users\admin> wsl -l -v
NAME STATE VERSION
* docker-desktop-data Stopped 2
kali-linux Stopped 2
Ubuntu-22.04 Stopped 2
docker-desktop Stopped 2
2、导出子系统镜像
将已经注册的wsl子系统镜像导出至磁盘。镜像的镜像为tar压缩文件,里面包含了包括整个vhdx磁盘数据和一些必要的配置。比如我在具体的执行过程中,是导出到相对空余的D盘中了。
wsl --export kali-linux D:\wsl\Kali-Linux\images\kali-linux.tar
3、注销已导出的子系统
注销后,原路径下的vhdx文件会被移除。这个时候,C盘原本的占用空间将会被释放
wsl --unregister Ubuntu-20.04
4、重新导入子系统镜像
将导出的子系统镜像导入到指定盘符的路径下。
wsl --import Ubuntu-20.04 D:\wsl\Kali-Linux\ D:\wsl\Kali-Linux\images\kali-linux.tar --version 2
导入成功后,会在该目录中生成一个新的vhdx虚拟磁盘文件。
5、启动子系统验证功能
启动该子系统,验证功能。能正常启动,且执行命令正常,则表示成功将子系统的文件系统迁移至其他盘了。
6、更换硬盘后,如何直接导入原有wsl子系统?
笔者今年更换硬盘并克隆分区后,打开Ubuntu22.04时,系统提示:
无法将磁盘“\\?\E:\wsl-ubuntu\ext4.vhdx”附加到 WSL2: 拒绝访问。
错误代码: Wsl/Service/CreateInstance/MountVhd/HCS/E_ACCESSDENIED
解决方案如下:
a、如果原本有导出备份习惯的朋友,可以直接参考本文1-4步骤,将备份文件直接导入。
b、如果未备份,但可以找到原本硬盘中的vhdx文件的朋友,参考执行如下命令:
# --import <Distro> <InstallLocation> <FileName> [选项]
# 将指定的 tar 文件作为新分发版导入。
# 文件名可以是 - for stdin。
# 选项:
# --version <Version>
# 指定要用于新分发的版本。
# --vhd
# 指定所提供的文件是 .vhdx 文件,而不是 tar 文件。
# 此操作在指定的安装位置创建 .vhdx 文件的副本。
wsl --import Ubuntu-20.04 D:\wsl2-disk D:\wsl2-run-new\ubuntu-20.04\ext4.vhdx --version 2 --vhd
ubuntu2004.exe config --default-user xiaof
压缩磁盘
wsl服务停止后,在PowerShell中输入命令:
diskpart
此时,系统会自动打开Diskpart窗口,依次执行如下命令
select vdisk file="C:\Users\xxx\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
浙公网安备 33010602011771号