本指南介绍如何管理通过 WSL 2 安装的 Linux 发行版所使用的磁盘空间:检查虚拟硬盘(VHD)的可用空间、扩展 VHD、修复挂载或只读错误,以及找到发行版对应的 .vhdx 文件。
WSL 2 使用虚拟化平台,在 Windows 主机上运行 Linux 发行版,并为每个发行版创建一个虚拟硬盘来存储文件。这些虚拟硬盘使用 ext4 文件系统,在 Windows 磁盘上表现为 ext4.vhdx 文件。
WSL 2 会根据存储需求自动增长 VHD 文件。文档所述默认最大容量为 1 TB;在 WSL 0.58.0 之前曾为 512 GB,更早的版本为 256 GB。如果 Linux 文件需要的空间超出这个上限,就会出现磁盘空间不足的错误。此时可以按照后文扩展 VHD 的最大容量。
容量上限与宿主机剩余空间是两回事。Linux 看到的虚拟磁盘最大容量不代表 Windows 磁盘实际拥有那么多可用空间。开始扩容或修复前,应确认发行版、磁盘路径及设备名称,备份重要数据,并为 Windows 主机保留足够空间。
检查可用磁盘空间
使用 Linux 的 df 命令检查 WSL 2 发行版的 VHD 空间。在 PowerShell 中运行下列命令,将 <distribution-name> 替换为实际发行版名称:
wsl.exe --system -d <distribution-name> df -h /mnt/wslg/distro
如果此命令无法使用,可以用 wsl --update 更新到 Microsoft Store 版本的 WSL,或尝试 wsl df -h /。后一种写法针对默认发行版,使用前应确认它就是要检查的发行版。
输出包含以下字段:
- Filesystem:VHD 文件系统的标识。
- Size:磁盘总容量,即 VHD 可使用的最大空间。
- Used:VHD 当前已使用的空间。
- Avail:剩余可用空间。
- Use%:已用空间占总容量的百分比。原文将其称作“剩余百分比”,但给出的计算式是 Used / Size,此处按字段实际含义校正。
- Mounted on:磁盘的挂载路径。
当使用量接近 VHD 上限,或已经出现虚拟磁盘空间不足错误时,可以考虑扩展发行版 VHD。即使 Windows 设备的物理磁盘小于 1 TB,Linux 仍可能显示文档所述的 1 TB 上限,因为 VHD 是随使用逐渐增长的。
扩展 WSL 2 虚拟硬盘
要扩展 Linux 发行版 VHD 的容量,可以使用 wsl --manage,也可以按下文手动操作。请依据当前 WSL 版本、现有容量和需要的目标容量选择步骤;早期版本的默认上限可能是 512 GB 或 256 GB。
使用 wsl –manage
该方法要求 WSL 2.5 或更高版本。
- 使用
wsl.exe --shutdown终止所有 WSL 实例。 - 运行
wsl --manage <distribution name> --resize <memory string>。容量参数采用<Memory Value>B/M/MB/G/GB/T/TB格式。文档说明不支持小数,例如2.5TB。带空格的实际发行版名称应加引号;占位符本身不能直接照抄执行。
官方文档提供的示例输出如下。它是文档示例,并非本文在某台设备上的执行结果:
e2fsck 1.46.5 (30-Dec-2021)
Pass 1: Checking inodes, blocks, and sizes
resize2fs 1.46.5 (30-Dec-2021)
The operation completed successfully.
命令成功完成后,该发行版的 ext4.vhdx 虚拟磁盘就会扩展到指定容量。
手动扩展
手动扩展包括两个步骤:先扩大虚拟硬盘容量,再扩大其中的 ext4 文件系统。只扩大 VHD 文件容量,不等于 Linux 文件系统已经使用新增空间。
- 用
wsl.exe --shutdown终止所有 WSL 实例。 - 找到该发行版的
ext4.vhdx完整路径。参见本文末尾的查找方法。 - 以管理员身份打开 Windows 命令提示符,并进入 DiskPart:
diskpart - 在
DISKPART>提示符下选择目标虚拟磁盘,将<pathToVHD>替换为上一步确认的文件路径:Select vdisk file="<pathToVHD>" - 查看磁盘详情,其中 Virtual size 表示当前分配的最大容量:
detail vdisk - 将目标容量换算为 DiskPart 接受的 MB 数值。原文举例:512 GB 对应 512000 MB,目标 1024 GB 对应 1024000 MB。新值必须大于当前值;缩小虚拟磁盘更复杂,因此应先确认需要的容量。expand vdisk 文档也规定
maximum以 MB 指定。 - 仍在
DISKPART>中执行:expand vdisk maximum=<sizeInMegaBytes>将占位符替换为已确认的目标值。DiskPart 要求虚拟磁盘已被选择且处于分离状态。
- 退出 DiskPart:
exit - 启动对应 Linux 发行版。用
wsl.exe -l -v确认它运行在 WSL 2;此过程不适用于 WSL 1。 - 在该 Linux 发行版的命令行中运行:
sudo mount -t devtmpfs none /dev mount | grep ext4第一个命令可能提示
/dev: none already mounted on /dev.;原文说明此提示可以忽略。 - 从挂载结果中确认对应设备,名称形如
/dev/sdX。原文以/dev/sdb为例:sudo resize2fs /dev/sdb <sizeInMegabytes>M这里的
/dev/sdb只是示例,不代表你的发行版设备。必须先核对实际设备。原文随后给出sudo resize2fs /dev/sdb 2048000M,但这个 2048000 与前面 1024000 的目标不一致,不能当作同一个扩容示例直接照抄。另外,resize2fs 手册规定其M后缀使用二进制单位;不能未经核对就把 DiskPart 的 MB 数值原样用于文件系统容量。手册允许省略
size,此时默认扩展到所在设备的容量。若选用该方式,仍须先确认 VHD 已扩展、目标设备正确且环境支持在线扩容。
如果缺少 resize2fs,应安装发行版提供它的软件包。原文写作 sudo apt install resize2fs;Debian 的手册将该程序归入 e2fsprogs 软件包,所以 Debian 系发行版应核对 e2fsprogs,不要把程序名称直接视为包名。
原文提供的示例输出如下,实际版本与容量可能不同:
resize2fs 1.44.1 (24-Mar-2021)
Filesystem at /dev/sdb is mounted on /; on-line resizing required
old_desc_blocks = 32, new_desc_blocks = 38
The filesystem on /dev/sdb is now 78643200 (4k) blocks long.
文件系统扩容成功后,发行版才可使用新增空间。完成后再次检查容量与挂载状态。
文件访问提醒:Microsoft 不建议用 Windows 工具或编辑器修改、移动或访问 AppData 中的 WSL 内部文件,这可能损坏发行版。要从 Windows 访问 Linux 文件,应使用 \\wsl$\<distribution-name>\;也可以在发行版中输入 explorer.exe . 打开当前文件夹。详见 从 Windows 访问 Linux 文件。
修复 VHD 挂载错误
如果遇到与“挂载发行版磁盘”有关的错误,原因可能是突然关机或断电。为避免进一步的数据丢失,WSL 可能以只读方式挂载发行版。可以使用 Linux 的 e2fsck 检查并修复 ext4 文件系统。
用 lsblk 确认块设备名称
WSL 2 将发行版的文件系统作为虚拟硬盘挂载。Linux 将这些磁盘称为“块设备”,可使用 lsblk 查看。打开发行版并运行 lsblk,或者在 PowerShell 中运行 wsl.exe lsblk。示例输出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 363.1M 1 disk
sdb 8:16 0 8G 0 disk [SWAP]
sdc 8:32 0 1.5T 0 disk
sdd 8:48 0 1T 0 disk /mnt/wslg/distro
- NAME:设备名称形如
sd[a-z],字母用来区分使用中的 SCSI 磁盘。原文说明sda是系统发行版;具体设备仍应根据当前输出核对。 - MAJ:MIN:内核用于识别设备的主、次设备号。主设备号 8 对应这里的 SCSI 磁盘类型。
- RM:1 表示可移动,0 表示不可移动。
- SIZE:卷的总容量。
- RO:1 表示只读,0 表示可写。
- TYPE:设备类型,这里为
disk。 - MOUNTPOINTS:文件系统挂载位置。
[SWAP]表示交换空间,而不是目录挂载点。
只读回退错误
WSL 在启动发行版时遇到挂载错误,可能显示:
An error occurred mounting the distribution disk, it was mounted read-only as a fallback.
此时写入文件系统会失败,例如:
$ touch file
touch: cannot touch 'file': Read-only file system
修复流程使用 wsl.exe --mount 将 VHD 裸挂载,再检查目标文件系统:
- 以管理员身份打开 PowerShell,关闭全部 WSL 发行版:
wsl.exe --shutdown - 将
<path-to-ext4.vhdx>替换为已确认的发行版磁盘路径并挂载:wsl.exe --mount <path-to-ext4.vhdx> --vhd --bare路径含空格时应使用引号。
- 在 PowerShell 中用
wsl.exe lsblk识别对应块设备,再把下列<device>换成正确设备名,例如sdc:wsl.exe sudo e2fsck -f /dev/<device>e2fsck会检查 ext4 文件系统并按其交互及参数修复。修复对象应是裸挂载后未挂载为文件系统的目标设备,不能对正在使用的根文件系统盲目执行。如果只安装了一个 Linux 发行版,可能遇到 ext 文件系统正在使用的错误。原文建议安装另一个发行版,以便运行检查;完成后可卸载额外的发行版。卸载会删除该发行版的数据,应确认所操作的对象。
必要时关闭 Windows 上的 Docker Desktop,以避免运行
wsl.exe sudo e2fsck -f /dev/sdc时出现Wsl/Service/CreateInstance/MountVhd/HCS/ERROR_SHARING_VIOLATION。这条命令中的设备名仍只是示例。 - 修复完成后,在 PowerShell 中卸载磁盘:
wsl.exe --unmount
只读重挂载的边界:原文提到 sudo mount -o remount,rw / 可临时恢复写入,但同时警告这类更改可能只在内存中、重启后丢失。应按上述流程检查和修复磁盘,不能把临时可写状态当作磁盘问题已经解决。
查找发行版的 .vhdx 文件与路径
在 PowerShell 中运行以下脚本,将 <distribution-name> 替换为实际发行版名称:
(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue("DistributionName") -eq '<distribution-name>' }).GetValue("BasePath") + "\ext4.vhdx"
结果一般形如 %LOCALAPPDATA%\Packages\<PackageFamilyName>\LocalState\<disk>.vhdx,例如官方文档中的通用示例:
C:\Users\User\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\ext4.vhdx
这就是查询到的 Linux 发行版对应的 ext4.vhdx 路径。路径布局可能因发行版的安装方式不同而变化,应以实际登记结果为准。
来源:Microsoft 文档团队,How to manage WSL disk space,官方中文页面;英文文档源采用 CC BY 4.0,代码示例适用仓库 MIT 许可。本文进行了中文整理,校正使用率、块设备等表述,补充了原文扩容数值、单位及软件包名称的核验说明;示例输出未在本机执行。原材料按许可原样提供,不附加保证,也不代表 Microsoft 对本页面的认可。
代码示例的 MIT 许可
The MIT License (MIT)
Copyright (c) Microsoft Corporation
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.











暂无评论内容