如何管理 WSL 磁盘空间

本指南介绍如何管理使用 WSL 2 安装的 Linux 分发版使用的磁盘空间,包括:

适用于 Linux 的 Windows 子系统(WSL 2)使用虚拟化平台与主机 Windows作系统一起安装 Linux 分发版,创建虚拟硬盘(VHD)来存储所安装的每个 Linux 分发版的文件。 这些 VHD 使用 ext4 文件系统类型 ,在 Windows 硬盘上表示为 ext4.vhdx 文件。

WSL 2 会自动调整这些 VHD 文件的大小以满足存储需求。 默认情况下,WSL 2 使用的每个 VHD 文件最初分配的最大磁盘空间量为 1TB(在 WSL 版本 0.58.0 之前,此默认值设置为 512GB 最大值和 256GB 最大值之前)。

如果 Linux 文件所需的存储空间超过此最大大小,则会看到指出磁盘空间不足的错误。 若要修复此错误,请按照以下有关如何 扩展 WSL 2 虚拟硬盘大小的指南进行作。

如何检查可用磁盘空间

使用 Linux Df 命令检查随 WSL 2 一起安装的 Linux 分发版的 VHD 中可用的磁盘空间量。

若要检查可用的磁盘空间,请打开 PowerShell 命令行并输入此命令(替换为 <distribution-name> 实际的分发名称):

wsl.exe --system -d <distribution-name> df -h /mnt/wslg/distro

如果此命令不起作用,请使用 wsl --update 命令升级到 WSL 的 Store 版本,或尝试 wsl df -h /

输出将包括:

  • 文件系统:VHD 文件系统的标识符
  • 大小:磁盘的总大小(分配给 VHD 的最大空间量)
  • 已用:VHD 中当前使用的空间量
  • 可用性:VHD 中剩余的空间量(已分配大小减去使用的量)
  • 使用%:剩余磁盘空间百分比(已用/已分配大小)
  • 装载在:装载磁盘的目录路径

如果看到即将达到分配给 VHD 的可用磁盘空间量,或者由于没有剩余磁盘空间而收到错误,请参阅下一部分,了解如何扩展分配给与 Linux 分发关联的 VHD 的最大磁盘空间量的步骤。 WSL 分配给 VHD 的磁盘空间量将始终显示默认的最大量(最新版本的 WSL 中为 1TB),即使实际 Windows 设备上的磁盘空间量小于此量。 WSL 会挂载一个 VHD,该 VHD 会随着使用逐渐扩展,因此 Linux 发行版会发现它可以增长到分配的最大大小为 1TB。 

如何扩展 WSL 2 虚拟硬盘的大小

若要将 Linux 分发版的 VHD 大小扩展到默认 1TB 最大分配磁盘空间量之外,可以使用 wsl --manage 该命令,或按照下面的手动步骤作。 (早期 WSL 版本最大默认值可能设置为 512GB 或 256GB)。

使用 wsl --manage 扩展 VHD 大小

wsl --manage 命令仅适用于 WSL 版本 2.5 及更高版本。

若要重设虚拟磁盘上分配的空间大小,请执行以下作:

  1. 使用命令终止所有 WSL 实例 wsl.exe --shutdown

  2. 运行 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.

此 Linux 分发版的虚拟驱动器(ext4.vhdx)现已成功扩展到新的大小。

手动扩展

若要使用手动步骤扩展 Linux 分发版的 VHD 大小,请执行以下作:

  1. 使用以下命令终止所有 WSL 实例: wsl.exe --shutdown

  2. 将目录路径复制到与计算机上安装的 Linux 分发版关联的 ext4.vhdx 文件。 有关帮助,请参阅 如何查找 Linux 分发版的 vhdx 文件和磁盘路径

  3. 使用管理员权限打开 Windows 命令提示符,然后输入以下命令打开 diskpart 命令解释器:

    diskpart
    
  4. 你现在会有一个 DISKPART> 提示。 输入以下命令,将 <pathToVHD> 替换为步骤 2 中复制的与 Linux 分发版关联文件的目录路径 ext4.vhdx

    Select vdisk file="<pathToVHD>"
    
  5. 显示与此虚拟磁盘关联的详细信息,包括 虚拟大小,表示分配 VHD 的当前最大大小:

    detail vdisk
    
  6. 需要将 虚拟大小 转换为兆字节。 例如,如果 虚拟大小为 512 GB,则等于 512000 MB。 输入的新值必须大于此原始值。 若要将虚拟大小加倍为 512 GB 到 1024 GB,需以 MB 为单位输入值: 1024000。 请注意不要输入高于实际想要的值,因为减少虚拟磁盘大小的过程要复杂得多。

  7. 使用 Windows 命令提示符提示 DISKPART> 输入要分配给此 Linux 分发的新最大大小的值:

    expand vdisk maximum=<sizeInMegaBytes>
    
  8. 退出DISKPART>的提示:

    exit
    
  9. 启动此 Linux 分发版。 (确保它在 WSL 2 中运行。可以使用以下命令确认此作: wsl.exe -l -v不支持 WSL 1。

  10. 让 WSL 知道它可以通过从 WSL 分发命令行运行这些命令来扩展此分发的文件系统大小。 你可能会看到此消息,以响应第一个 装载 命令:“/dev:尚未装载在 /dev 上。”可以安全地忽略此消息。

    sudo mount -t devtmpfs none /dev
    mount | grep ext4
    
  11. 复制此项的名称,如下所示: /dev/sdX (X 表示任何其他字符)。 在以下示例中, X 的值为 b

   sudo resize2fs /dev/sdb <sizeInMegabytes>M

使用上面的示例,我们将 vhd 大小更改为 2048000,因此命令将为: sudo resize2fs /dev/sdb 2048000M

注释

可能需要安装 resize2fs。 如果是这样,可以使用此命令来安装它: sudo apt install resize2fs.

输出将类似于以下内容:

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.

此 Linux 分发版的虚拟驱动器(ext4.vhdx)现已成功扩展到新的大小。

重要

建议不要使用 Windows 工具或编辑器修改、移动或访问文件夹中的 AppData WSL 相关文件。 这样做可能会导致 Linux 分发版损坏。 如果要从 Windows 访问 Linux 文件,可以通过路径 \\wsl$\<distribution-name>\访问它。 打开 WSL 分发版并输入 explorer.exe . 以查看该文件夹。 若要了解详细信息,请参阅博客文章: 从 Windows 访问 Linux 文件

如何修复 VHD 装载错误

如果遇到与“装载分发磁盘”相关的错误,这可能是由于突然关闭或停电,并可能导致 Linux 分发 VHD 切换到 只读 ,以避免数据丢失。 您可以按照以下步骤使用 Linux 命令修复和还原e2fsck发行版。

使用 lsblk 命令标识块设备名称

当 WSL 2 安装 Linux 发行版时,它会将该发行版与其自身的文件系统一起挂载为虚拟硬盘(VHD)。 Linux 将这些硬盘驱动器称为“阻止设备”,你可以使用命令查看有关它们 lsblk 的信息。

若要查找 WSL 2 当前正在使用的块设备的名称,请打开分发版并输入命令: 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

有关块设备的信息包括:

  • 名称:分配给设备的名称将为 sd[a-z],其中每个使用中的 SCSI 磁盘都会被分配一个字母标识。 sda 始终是系统发行版。
  • MAJ:MIN:表示 Linux 内核用于在内部识别设备的编号,首先的数字表示设备类型(例如,8 表示小型计算机系统接口/SCSI 磁盘)。
  • RM:让我们知道设备是可移动的(1)还是不可移动(0)。
  • 大小:卷的总大小。
  • RO:让我们知道设备是只读的(1)还是不是(0)。
  • 类型:指设备类型(在本例中为磁盘)。
  • MOUNTPOINTS:指块设备所在的文件系统上的当前目录(SWAP 用于预配置的非活动内存,因此没有装入点)。

只读回退错误

如果在打开 Linux 发行版时 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 中的磁盘装载错误,并再次将其还原回可用/可写状态,可以使用 wsl.exe --mount 该命令通过以下步骤重新装载磁盘:

  1. 通过以管理员身份打开 PowerShell(在提升的命令提示符中)并输入命令来关闭所有 WSL 分发版:

    wsl.exe --shutdown
    
  2. 输入挂载命令,并将 <path-to-ext4.vhdx> 替换为此分发版的 .vhdx 文件路径。 有关查找此文件的帮助,请参阅 如何查找 Linux 分发版的 VHD 文件和磁盘路径

    wsl.exe --mount <path-to-ext4.vhdx> --vhd --bare
    
  3. 使用 PowerShell 的wsl.exe lsblk命令来识别分发的阻止设备名称(sd[a-z]),然后输入以下命令进行磁盘修复(将<device>替换为正确的块设备名称,如“sdc”)。 该 e2fsck 命令检查 ext4 文件系统(随 WSL 一起安装的分发版所使用的类型)是否存在错误,并相应地修复它们。

    wsl.exe sudo e2fsck -f /dev/<device>
    

注释

如果只安装了单个 Linux 分发版,可能会遇到“正在使用的 ext 文件”错误,并且需要 安装 其他分发版才能运行 wsl.exe lsblk。 修复完成后,可以 卸载 分发版。 此外,可能需要关闭 Windows 上的 Docker Desktop 以避免在运行命令wsl.exe sudo e2fsck -f /dev/sdc时出错Wsl/Service/CreateInstance/MountVhd/HCS/ERROR_SHARING_VIOLATION

  1. 修复完成后,通过输入以下命令在 PowerShell 中卸载磁盘:

    wsl.exe --unmount
    

警告

可以使用以下命令: sudo mount -o remount,rw / 将只读分发返回到可用/可写状态,但所有更改都将在内存中,因此在重新启动分发时会丢失。 建议改用上面列出的步骤来装载和修复磁盘。

如何查找 Linux 分发版的 .vhdx 文件和磁盘路径

若要查找 Linux 分发版的 .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 的路径。