ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

WSL2与Docker Desktop迁移D盘全攻略

WSL2与Docker Desktop迁移D盘全攻略

1. 为什么需要迁移WSL2和Docker Desktop到D盘?

对于长期使用Windows系统开发的朋友来说,C盘空间不足是个永恒的话题。WSL2和Docker Desktop默认安装在C盘,随着使用时间的增长,你会发现:

  • WSL2的虚拟硬盘文件(ext4.vhdx)会不断膨胀,我见过有开发者的这个文件达到50GB+
  • Docker镜像、容器和卷数据默认都存储在C盘
  • 系统更新和临时文件进一步挤占空间

这种空间占用会导致:

  1. 系统运行变慢(特别是SSD硬盘接近满载时性能下降明显)
  2. 无法创建新的Docker容器
  3. 影响其他开发工具的正常使用

重要提示:迁移前请确保D盘有足够空间(建议至少预留100GB),并备份重要数据。虽然迁移过程一般不会导致数据丢失,但安全第一。

2. 迁移前的准备工作

2.1 检查当前磁盘使用情况

首先我们需要了解当前的资源占用情况:

# 查看WSL2分布情况 wsl -l -v # 查看Docker磁盘使用(需要在Docker Desktop运行状态下) docker system df

2.2 准备迁移工具

我们需要以下工具:

  1. Windows Terminal(推荐)或PowerShell
  2. Docker Desktop(已安装)
  3. WSL2(已启用)

2.3 停止相关服务

迁移前必须停止所有相关进程:

# 关闭所有WSL实例 wsl --shutdown # 退出Docker Desktop(右键系统托盘图标选择退出)

3. WSL2迁移详细步骤

3.1 导出当前WSL2分发版

# 列出已安装的分发版 wsl -l -v # 导出分发版(以Ubuntu-20.04为例) wsl --export Ubuntu-20.04 D:\wsl-backup\ubuntu2004.tar

这个过程可能需要5-20分钟,取决于你的WSL2分发版大小。

3.2 注销原分发版

wsl --unregister Ubuntu-20.04

这个操作不会删除你的文件,只是解除注册。

3.3 在新位置导入分发版

# 创建目标目录 mkdir D:\WSL\Ubuntu-20.04 # 导入分发版 wsl --import Ubuntu-20.04 D:\WSL\Ubuntu-20.04 D:\wsl-backup\ubuntu2004.tar --version 2

3.4 设置默认用户

导入后需要重新设置默认用户:

# 临时启动分发版 wsl -d Ubuntu-20.04 # 在WSL中执行(将username替换为你的用户名) echo -e "[user]\ndefault=username" >> /etc/wsl.conf exit

4. Docker Desktop迁移与优化

4.1 修改Docker数据存储位置

  1. 退出Docker Desktop
  2. 修改配置文件:
    • 打开%AppData%\Docker\settings.json
    • 修改或添加:
      "data-root": "D:\\docker-data"
  3. 移动现有数据:
    robocopy C:\ProgramData\docker D:\docker-data /E /COPYALL /XJ /R:0 /W:0

4.2 配置WSL2集成

在Docker Desktop设置中:

  1. 进入Settings > Resources > WSL Integration
  2. 启用你迁移后的WSL2分发版

4.3 性能优化配置

在%UserProfile%\.wslconfig中添加:

[wsl2] memory=8GB # 根据你的内存调整 processors=4 # CPU核心数 swap=2GB localhostForwarding=true

5. 常见问题与解决方案

5.1 迁移后Docker无法启动

可能原因:

  • 数据复制不完整
  • 权限问题

解决方案:

  1. 检查settings.json路径是否正确
  2. 以管理员身份运行:
    icacls "D:\docker-data" /grant "NT AUTHORITY\SYSTEM:(OI)(CI)F"

5.2 WSL2启动时报错

典型错误:

Error code: Wsl/Service/CreateInstance/CreateVm/0x80070005

解决方法:

  1. 确保虚拟化已启用(BIOS中设置)
  2. 重置WSL:
    wsl --shutdown wsl --update

5.3 磁盘空间未释放

迁移后C盘空间没有变化?需要手动删除:

  • C:\Users\<user>\AppData\Local\Docker
  • C:\Users\<user>\AppData\Local\Packages\<Distro>

6. 进阶优化技巧

6.1 定期清理Docker资源

# 删除无用镜像、容器和网络 docker system prune -a -f --volumes # 查看大文件 docker system df -v

6.2 配置WSL2自动清理

在WSL2中创建定时任务:

sudo crontab -e 添加: 0 3 * * * /usr/bin/docker system prune -f

6.3 使用符号链接节省空间

对于开发项目,可以:

# 将项目目录链接到D盘 mklink /J C:\projects D:\dev\projects

7. 迁移后的验证测试

7.1 基础功能验证

# 检查WSL2 wsl -l -v wsl -d Ubuntu-20.04 -- ls -la # 检查Docker docker run --rm hello-world docker info | grep "Docker Root Dir"

7.2 性能对比测试

迁移前后可以对比:

  1. 容器启动时间
  2. 磁盘I/O速度(使用CrystalDiskMark)
  3. 系统整体响应速度

在我的测试环境中(NVMe SSD),迁移后:

  • 容器启动时间减少15-20%
  • C盘可用空间增加60GB+
  • 系统响应更流畅

8. 个人实战经验分享

经过多次迁移实践,我总结出以下经验:

  1. 空间估算要充足:D盘至少预留WSL2当前占用空间的2倍,我遇到过导入时空间不足导致失败的情况

  2. 分批迁移更安全:先迁移WSL2,验证无误后再迁移Docker,避免同时出问题

  3. 注意权限问题:特别是从企业域控电脑迁移时,可能需要额外配置NTFS权限

  4. 善用符号链接:对于无法修改存储路径的开发工具(如某些IDE的缓存),可以用mklink将其指向D盘

  5. 定期维护:建议每月执行一次docker system prune,每季度检查一次.vhdx文件大小

一个特别有用的技巧:在WSL2中安装ncdu工具,可以直观查看磁盘使用情况:

sudo apt install ncdu ncdu /

最后提醒:迁移完成后,建议观察几天确认系统稳定性,再考虑删除C盘的备份文件。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进