拯救被WSL占满的C盘

本文详细指导如何将Windows Subsystem for Linux(WSL)从C盘迁移到其他磁盘,以及如何回收Docker中的空间,解决Linux子系统占用过多C盘空间的问题。

适用场景

1、使用Windows 10做为开发平台,并且C盘空间不是特别富裕。

2、使用Windows自带的Windows Subsystem for Linux(WSL)默认将Liunx子系统安装在了C盘。

3、因为在Linux中下载安装各种软件、Docker Image,运行多个Docker Container 导致C盘空间严重不足。

将WSL从系统盘移到其他盘

这里我们使用 Move WSL 这个工具。

1、首先下载 Move WSL 工具包,并解压。

2、管理员身份运行Windows PowerShell。

3、在PowerShell中运行如下命令,停止正在运行的Linux子系统。

> wsl --shutdown

4、在PowerShell中进入刚刚解压的目录,运行

> cd d:\move-wsl-master
D:\move-wsl-master> .\move-wsl.ps1

此时会出现如下提示,让我们选择要移动的目标

可以选择要移动的目标,比如移动Ubuntu-18.04,则输入 1 并回车,然后会提示让我们输入移动的目标路径

这里输入目标路径如 D:\WSL 然后回车,便会执行移动。根据移动目标的大小,时间可长可短,请耐心等待。

移动过程中,可以看到脚本会先将移动目标导出到一个tar文件,然后再将tar文件导入到 ext4.vhdx 文件中。

移动完成后,脚本会删掉原来C盘中的相应内容,释放C盘空间。

回收Docker环境中的空间

Docker用久了会残留很多无用的Image。这些Image文件少则几十上百兆,多则几个G,给本就捉襟见肘的磁盘空间造成巨大浪费, 这时可以删掉不需要的Image文件。但你可能愕然发现,即使删掉了好几个Image,磁盘依然没有苗条下来。

这是因为ext4.vhdx磁盘空间会根据加载的数据自动增长,但是无法自动回收。下面是手动回收的步骤。

1、仍然是现在Windows PowerShell中停止正在运行的Linux子系统。

> wsl --shutdown

2、运行diskpart释放空间

# open window Diskpart
> diskpart
# 选择虚拟机文件执行瘦身
> select vdisk file="D:\WSL\docker-desktop-data\ext4.vhdx"
> attach vdisk readonly
> compact vdisk
> detach vdisk
> exit
### 修改 Docker 镜像存储路径 Docker 默认会将镜像和容器存储在系统(通常是 C ),这可能导致磁空间被大量占用。可以通过修改 Docker 的配置文件,将镜像存储路径更改为其他分区或磁。 在 Windows 上,Docker Desktop 的配置文件通常位于 `C:\ProgramData\Docker\config\daemon.json`。如果该文件不存在,则可以创建它。在文件中添加或修改 `data-root` 参数以指定新的存储路径。例如,将其指向 D 的某个目录: ```json { "data-root": "D:\\docker\\data" } ``` 保存文件后,重启 Docker 服务以应用更改。这样,Docker 将会把新的镜像和容器存储在指定的路径下,从而减少对 C 占用[^1]。 ### 清理无用的镜像和容器 Docker 使用过程中会产生大量的临时文件、未使用的镜像和停止的容器,这些都会占用空间。可以使用以下命令来清理这些无用的数据: - **删除所有未使用的镜像、容器、网络和卷**: ```bash docker system prune -a ``` 该命令将删除所有未使用的镜像、容器、网络和卷,释放大量磁空间。需要注意的是,这个操作是不可逆的,因此在执行前应确保没有需要保留的数据[^1]。 - **单独清理镜像**: 如果只想删除未使用的镜像,可以使用以下命令: ```bash docker image prune -a ``` 这个命令将删除所有未被任何容器引用的镜像。 - **清理容器日志**: Docker 容器的日志文件可能会变得非常大,尤其是在长时间运行的情况下。可以手动清理这些日志文件,或者通过配置日志驱动程序来限制日志文件的大小。例如,在启动容器时指定日志选项: ```bash docker run --log-opt max-size=10m --log-opt max-file=3 ... ``` 这将限制每个容器的日志文件大小为 10MB,并保留最多 3 个日志文件[^1]。 ### 使用 WSL2 迁移 Docker 数据 对于使用 Windows Subsystem for Linux 2 (WSL2) 的用户,Docker 数据通常存储在 WSL2 的虚拟磁中。如果发现 Docker 占用了大量 C 空间,可以考虑将 WSL2 的虚拟磁迁移到其他分区。 1. **导出 WSL2 虚拟磁**: 首先,关闭所有正在运行的 WSL2 实例,并使用以下命令导出当前的 WSL2 虚拟磁: ```bash wsl --export docker-desktop D:\docker\docker-desktop.tar wsl --export docker-desktop-data D:\docker\docker-desktop-data.tar ``` 这将把 `docker-desktop` 和 `docker-desktop-data` 两个 WSL2 实例导出为 `.tar` 文件。 2. **导入 WSL2 虚拟磁**: 接下来,使用以下命令将导出的虚拟磁导入到新的位置: ```bash wsl --import docker-desktop D:\docker\desktop D:\docker\docker-desktop.tar --version 2 wsl --import docker-desktop-data D:\docker\data D:\docker\docker-desktop-data.tar --version 2 ``` 这样,Docker 的数据将被存储在 D 的新路径中,从而释放 C 的空间[^3]。 3. **检查内存占用**: 如果在不使用 Docker 时发现内存占用较大,可能是由于 WSL2 的某些组件(如 `wmmem`)在后台运行。可以使用以下命令停止这些组件: ```bash wsl --shutdown ``` 这将关闭所有 WSL2 实例并释放内存资源。 ### 使用符号链接(Symbolic Links) 另一种方法是使用符号链接将 Docker 的默认存储路径指向其他分区。例如,可以将 `C:\ProgramData\Docker` 目录移动到 D ,并创建一个指向新位置的符号链接。 1. **停止 Docker 服务**: 在进行任何更改之前,确保 Docker 服务已停止。可以通过以下命令停止 Docker 服务: ```bash net stop Docker ``` 2. **移动 Docker 数据**: 将 `C:\ProgramData\Docker` 目录移动到 D 的目标位置,例如 `D:\docker\data`。 3. **创建符号链接**: 使用以下命令创建一个指向新位置的符号链接: ```bash mklink /J C:\ProgramData\Docker D:\docker\data ``` 这样,Docker 仍然会认为数据存储在原来的路径下,但实际上数据已经被移动到了 D ,从而释放了 C 的空间[^2]。 ### 优化镜像构建 镜像构建过程中也可能产生大量的中间层和临时文件,导致磁空间被占用。为了优化镜像构建过程,可以采取以下措施: - **多阶段构建**: 使用多阶段构建可以显著减少最终镜像的大小。通过在构建过程中使用多个 `FROM` 指令,可以在不同的阶段构建和打包应用程序的不同部分。例如: ```dockerfile # 构建阶段 FROM golang:1.19 AS builder WORKDIR /app COPY . . RUN CGO_ENABLED=0 go build -o myapp . # 打包阶段 FROM gcr.io/distroless/static-debian11 COPY --from=builder /app/myapp /myapp CMD ["/myapp"] ``` 这样,最终的镜像只包含必要的运行时依赖,而不包含构建工具和中间文件,从而减少了镜像的大小[^1]。 - **使用 `.dockerignore` 文件**: 在构建镜像时,确保只包含必要的文件。可以使用 `.dockerignore` 文件来排除不需要的文件和目录。例如: ``` .git *.log tmp/ ``` 这将确保 Git 仓库、日志文件和临时目录不会被包含在镜像中,从而减少镜像的大小[^1]。 - **压缩镜像**: 可以使用 `docker save` 和 `gzip` 命令来压缩镜像。例如: ```bash docker save myimage | gzip > myimage.tar.gz ``` 这将把镜像保存为一个压缩的 `.tar.gz` 文件,占用更少的磁空间。 ### 总结 通过修改 Docker 的镜像存储路径、清理无用的镜像和容器、使用 WSL2 迁移 Docker 数据、创建符号链接以及优化镜像构建,可以有效解决 Docker 占用 C 空间过多的问题。这些方法不仅可以释放磁空间,还可以提高 Docker 的性能和开发效率。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值