ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

WSL2迁移到D盘:彻底解决C盘空间不足的完整指南

WSL2迁移到D盘:彻底解决C盘空间不足的完整指南 1. 为什么要动C盘里的WSL2先搞清它到底占了多少空间先说个真实场景。我日常主力就是Windows 11 WSL2跑UbuntuDocker Desktop也挂在WSL2后端上。某天系统盘突然报警C盘只剩不到10GB。打开磁盘清理工具一查发现WSL相关目录加起来占了接近60GB——这里面的主体是一个叫ext4.vhdx的虚拟磁盘文件Windows下面的Linux根文件系统全装在里面。你安装的每个Python包、拉下来的每个Docker镜像、编译的每份代码最终都会落进这个文件。很多人的直觉是那我直接在Windows资源管理器里把WSL目录剪切到D盘不就行了千万别这么干。WSL2的发行版路径是注册表里登记过的你手动挪走虚拟磁盘文件WSL启动时会按原路径去找找不到就直接报错“找不到指定的文件”。迁移必须走官方给的wsl --export、wsl --unregister、wsl --import这套流程本质上是把虚拟磁盘导出成压缩包再在目标盘上重新注册、释放。在动手之前我建议你先确认三件事当前C盘可用空间是否大于WSL2实际占用量的1.2倍。导出时虽然用的是压缩传输但还是需要一点临时空间别把自己卡死在半路上。目标盘D盘是否NTFS格式、有没有足够的剩余空间。迁移之后WSL2的虚拟磁盘会继续增长建议预留至少30GB以上的空间。是否有正在跑的服务、Docker容器或者未保存的Python进程。迁移前最好全部停掉。一句话总结这个问题的核心不只是“把文件挪个位置”而是要让Windows重新认识这个发行版的位置。懂了这一步后面所有操作都不会走偏。2. 迁移前必须完成的准备工作和环境检查2.1 完整备份你的数据备份不是可选项是必选项。虽然迁移命令本身不会删除数据但wsl --unregister这一步会彻底移除当前注册的发行版和对应虚拟磁盘文件。如果前面导出失败或者导出的是旧版本后面找回来就是灾难。备份有两种方式轻量备份只备份关键配置和代码用rsync或tar把WSL2里家目录的文件打包。全量备份直接导出整个发行版对应命令是wsl --export。这个我在下一节详细说反正迁移本质上就是做一次全量导出。我的建议是至少做一次全量导出。原因很简单WSL2里有很多环境依赖是藏不住的比如你配置的CUDA路径、自定义的shell别名、自动启动的systemd服务这些散落在/etc和/home下面只拷贝代码文件根本覆盖不了。全量导出能保证你在迁移后还原出一个和原来几乎一模一样的系统。2.2 确认WSL版本和发行版名称先打开PowerShell或者Windows Terminal都行运行wsl --list --verbose输出会类似这样NAME STATE VERSION * Ubuntu Stopped 2这里有两件事要重点记录发行版名称这里是Ubuntu和VERSION列是否显示2。如果是1建议先把迁移的事放一放先升级到WSL2因为wsl --export对WSL1的导出支持在某些边界情况下不太稳定而且WSL2的性能和兼容性都更好。如果系统里有多个发行版需要逐个操作记得把名字对应清楚。后面所有命令里只要涉及发行版名称我就用Ubuntu这个示例实际操作时换成你自己的。2.3 关闭所有WSL进程和Docker Desktop如果你装了Docker Desktop或者正在里面跑容器迁移过程中极大概率会遇到虚拟磁盘被占用、导出失败、文件被锁等问题。最稳妥的做法是先停掉Docker Desktop彻底退出别只关窗口要退出系统托盘图标。在PowerShell里执行wsl --shutdown再执行一次wsl --list --verbose确保所有发行版State都是Stopped。这里有个大家容易忽略的细节Windows的终端窗口、文件资源管理器里打开的WSL路径\\wsl$\Ubuntu这种、甚至VS Code连接过的WSL窗口都可能让WSL进程无法彻底退出。所以迁移前最好把这些都关掉不然下一步导出时会卡在“正在导出”很久。2.4 记录当前的默认发行版很多时候我们不只是装了一个发行版。如果系统里只有Ubuntu这一步可以跳过但如果装了多个需要记一下哪个是默认的。命令wsl --set-default --list或者直接看wsl --list里带*标记的那个。unregister之后默认设置会丢失后面需要手动重新设置这一条我先记着等迁移完再处理。3. export卸载register三步迁移法完整实操过程3.1 第一步导出发行版在D盘找一个合适的位置专门用来放WSL2的文件。比如我建了个D:\WSL\目录下面再分一个D:\WSL\ubuntu作为最终落盘的家导出文件我放在D:\WSL\backup\下面。执行导出wsl --export Ubuntu D:\WSL\backup\ubuntu-2025-06-22.tar这里有两个点值得说导出格式可以是.tar也可以是.vhdx。从WSL 1.0.0版本开始--export支持了--vhd参数可以直接导出成原始的.vhdx文件。实测下来.tar格式是压缩的体积小、通用性强适合备份归档.vhdx格式导出快一些但对导入时的目标位置和磁盘要求更严格。迁移场景下我建议用.tar。导出耗时和你虚拟磁盘里实际使用的空间成正比不是你分的磁盘大小。比如虚拟磁盘显示100GB但里面实际用了30GB那导出大概就是30GB的压缩量时间通常在几分钟到十几分钟之间。如果等了很久还在导出中不要强行关窗口让它跑完。导出完成后最好检查一下文件大小和完整性确认不是0字节或异常缩小。这一步就是你的后悔药。3.2 第二步卸载原发行版确认导出文件没问题后执行wsl --unregister Ubuntu这条命令会从注册表中移除这个发行版同时删除原位置通常位于%LOCALAPPDATA%\Packages\...\LocalState\的虚拟磁盘文件。注意这个操作不可逆所以我才反复强调先把导出文件确认好。执行完后再跑一遍wsl --list --verbose确认列表里已经没有Ubuntu了。如果列表里还有其他发行版不用管它们不受影响。3.3 第三步导入到D盘然后就是把导出的tar重新“安装”到D盘wsl --import Ubuntu D:\WSL\ubuntu D:\WSL\backup\ubuntu-2025-06-22.tar参数含义很直观第一个参数是发行版名字要和原来一致。第二个参数是安装目录就是将来存放ext4.vhdx文件的地方。第三个参数是备份的tar包路径。执行完成后再次wsl --list --verbose你会看到Ubuntu已经重新出现在列表里State一般是Stopped。顺便去D:\WSL\ubuntu目录下看一眼里面应该已经生成了ext4.vhdx。到这一步为止迁移核心流程就走完了。剩下的问题是怎么让这台新接管的发行版能正常进入、还能让你之前的用户名不丢失、以及让旧路径的资源不再继续占用C盘。4. 迁移后的验证清单与默认发行版修复4.1 登录和数据验证导入成功后启动WSLwsl -d Ubuntu如果你的发行版之前在root用户下只有一个普通用户账户导入后默认会以root身份进入。这不是bugwsl --import不会保留原来的默认用户设置。你可以看到之前的目录、文件都还在/home/你的用户名、/etc下的配置、你安装的软件包一个都不少。但普通用户没法直接使用因为默认登录用户被重置成了root。修复方法很简单在WSL2内部编辑/etc/wsl.conf[user] default你的用户名保存后退出WSL再在Windows侧执行wsl --shutdown重启再次进入就是原来的用户了。4.2 验证默认发行版如果你原来只有一个发行版wsl直接输入就能进系统。但如果原来有多个发行版unregister之后默认标记会消失。这时候需要重新设置wsl --set-default Ubuntu然后输入wsl确认进入的确实是Ubuntu而不是其他发行版。4.3 系统级功能验证建议按照我下面这个清单过一遍不要跳步基础命令sudo apt update看看软件源是否正常。网络ping 8.8.8.8或curl一个外部地址确认DNS和网络正常。服务如果你之前配置了systemd输入systemctl list-units --typeservice看看服务是否都在尤其注意Docker服务。Docker:在Windows侧把Docker Desktop重新启动确认它能正常用WSL2后端的发行版。这一步很多人会漏结果Docker Desktop启动报错“找不到发行版”其实是因为还没设置默认发行版。开发环境简单跑一下Python、Node或者其他常驻服务确认环境变量、路径没有因为根目录变化而丢失。4.4 旧位置的清理前几步都确认没问题后旧的%LOCALAPPDATA%\Packages\...\LocalState\路径下对应的发行版数据文件夹已经没了unregister会删。如果还有残留多半是其他发行版或Docker Desktop的数据不要手贱去删先看路径名称是否和你迁移的发行版对应再决定操作。我遇到过一次意外因为手动移动过文件unregister之后C盘某些目录还残留了几个GB的缓存碎片。安全起见在确认迁移成功、虚拟磁盘确实生成在D盘后可以用磁盘清理工具扫一遍C盘。那些能删的缓存删掉空间能进一步释放。5. 实测中最容易翻车的几个坑及排查路径5.1 导出后无法导入空间不足和“另一个程序正在使用此文件”这个排在最前面因为几乎每个迁移的人都会遇到其中之一。导入时如果D盘剩余空间小于tar包解压后的虚拟磁盘大小wsl --import会直接报错。这里的空间需求不是tar包的大小而是解压后ext4.vhdx占据的实际大小。比如你导出的tar只有15GB但虚拟磁盘内容实际占20GBD盘剩余空间至少得20GB以上。最保守的做法是预留tar包体积的两倍空间。遇到“另一个程序正在使用此文件”的错误基本都是因为有残留的WSL会话。处理方式是在Windows Terminal关掉所有WSL标签页。执行wsl --shutdown。可能还需要在任务管理器里结束Vmmem进程——这个进程就是WSL2虚拟机的内存进程有时候wsl --shutdown并不能立刻结束它。把这三步走完再去执行导出或导入基本就能绕开。5.2 转移后WSL2一直报“尚未准备就绪”这个问题我在WSL2的排错群里看到过好几次。现象是系统里发行版导入成功、列表能看到但一启动就提示“WSL2尚未准备就绪”或直接闪退。排查顺序是这样的先看是不是虚拟化平台被关了。控制面板—程序—启用或关闭Windows功能确认“适用于Linux的Windows子系统”和“虚拟机平台”两个勾都是打开状态。在PowerShell里执行bcdedit /set hypervisorlaunchtype auto然后重启。这个命令是让Hypervisor层自动启动很多WSL2闪退问题的根因就在这里。如果还是不行检查Windows更新。WSL2对内核版本有隐式依赖有些旧版本Windows文件缺失会导致内核组件无法正常启动。排查完这三步绝大多数人都能恢复。5.3 导入后无法访问网络或DNS解析失败这个场景常在导入备份很久之前的发行版时出现。因为之前导出的/etc/resolv.conf和/etc/wsl.conf里的配置可能和现在的网络环境不匹配。处理方式不复杂编辑/etc/wsl.conf改成下面这种基础配置然后重启WSL[network] generateResolvConf true如果你之前手动写过静态DNS记得清理/etc/resolv.conf里的残留内容让WSL自动生成。实测下来大部分网络问题在这一步之后就解决了。5.4 迁移后CUDA或GPU环境失效这个坑最隐蔽。很多人迁移完发行版进去一切正常但一跑GPU相关的代码就报“CUDA not available”。原因不是数据丢了而是WSL2的GPU直通依赖Windows侧与Linux侧的驱动协同迁移后你C盘里的NVIDIA驱动还在但WSL里面的内核模块路径可能因为某些环境变量或路径配置发生了变化。排查路径从nvidia-smi开始如果在WSL2里执行nvidia-smi能正常输出说明驱动层面没问题。如果在Windows侧直接打开nvidia-smi正常、但在WSL2里报错那就要检查CUDA Toolkit的环境变量是否指向了不存在的路径。常见的是之前安装时把CUDA装到了/usr/local/cuda迁移后路径没变化但LD_LIBRARY_PATH或PATH里有硬编码的旧路径改一下就好了。如果两个环境里nvidia-smi都异常那就去NVIDIA官网重新装一次Windows驱动装完再试。6. 如何让以后的WSL2默认装到D盘新项目落盘配置迁移做完还有一个非常实际的问题以后我如果再装一个新的发行版能不能直接让它默认落在D盘避免反复折腾答案是能但默认情况下不行。你就记住一句话wsl --install默认会自动安装到C盘而且不提供命令行参数让你指定路径。那怎么办有两个思路。第一个思路是装完就迁移用上面那套流程新发行版装好之后立刻导出导入。虽然多花点时间但胜在稳定流程完全一样。第二个思路是直接下载安装包手动装到指定目录。微软官方为每个发行版提供了Appx格式的安装包可以下载后用命令行手动展开到任意目录。我以Ubuntu为例具体操作是这样去WSL官方文档页面找到对应发行版的Appx包下载链接微软会定期更新这个链接。下载后用Add-AppxPackage或者直接用解压工具把包展开到一个目录。Add-AppxPackage -Path .\Ubuntu.appx -Volume D:不过-Volume参数只能指定安装位置不一定对所有发行版都生效。更通用的做法是解压整个包到目标目录然后运行里面自带的ubuntu.exe完成初始化。这样发行版文件就落在你指定的目录里了不会碰C盘。另外一个和虚拟磁盘路径相关的小配置我也放这里以后如果想限制某个发行版的虚拟磁盘大小上限可以在用户目录下创建.wslconfig文件路径是C:\Users\你的用户名\.wslconfig。里面可以写[wsl2] memory8GB swap2GB localhostForwardingtrue这个文件影响的是所有WSL2发行版的全局行为不是指定单台发行版的。单台发行版的大小上限要通过其他方式管理所以我一般建议不要过度依赖这个文件而是定期清理不用的大文件。7. 迁移后C盘空间的再确认与日常习惯建议到这里整个迁移流程已经完整走完。最后我想分享几个迁移之外的日常习惯帮你避免过几个月又面临同样的C盘爆满问题。第一Docker Desktop的数据默认也在C盘。你迁移了WSL2但Docker Desktop用的镜像仓库、容器数据如果还留在C盘那C盘照样会悄悄变满。Docker Desktop的Settings里Resources—Advanced可以设置Disk image location把它也指到D盘。这个操作不会影响已迁移的WSL2发行版但能进一步解放C盘。第二定期用docker system prune和docker builder prune清理无用的镜像和构建缓存。我见过太多人磁盘被Docker镜像撑爆的案例这个命令是日常清理的第一道防线。第三WSL2里的包管理器缓存也很占地方。Ubuntu下/var/cache/apt/archives积累的deb包可以定期清sudo apt clean另外像pip、conda和npm这类包管理器的缓存目录默认都在Linux文件系统里时间久了体积非常可观。可以定期用du -sh ~/.cache/*看看哪个目录最肥然后针对性地清理。这些动作做完C盘的空间就真的能稳住。迁移不是一次性操作更关键的是一套能维持下去的存储习惯。希望这篇搬运过程的记录能帮到你少走几个我当时踩过的弯路。
返回列表