如何管理 WSL 磁盘空间
本指南介绍如何管理通过 WSL 2 安装的 Linux 发行版使用的磁盘空间,包括:
适用于 Linux 的 Windows 子系统 (WSL 2) 使用虚拟化平台将 Linux 发行版与主机 Windows 操作系统一起安装,创建虚拟硬盘 (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 的 Microsoft Store 版本,或尝试 wsl df -h /
。
该输出将包括:
- 文件系统:VHD 文件系统的标识符
- 大小:磁盘的总大小(分配给 VHD 的最大空间量)
- 已用:VHD 中当前使用的空间量
- 可用:VHD 中剩余的空间量(已分配的大小减去使用的量)
- 使用百分比:剩余磁盘空间的百分比(已用/已分配的大小)
- 装载位置:装载磁盘的目录路径
如果发现即将达到分配给 VHD 的可用磁盘空间量,或者由于没有剩余磁盘空间而收到错误,请参阅下一节,了解如何扩展分配给与 Linux 发行版关联的 VHD 的最大磁盘空间量。 WSL 分配给 VHD 的磁盘空间量将始终显示默认的最大数量(在最新版本的 WSL 中为 1TB),即使实际 Windows 设备上的磁盘空间量小于此值。 WSL 会装载一个 VHD,该 VHD 将在你使用它的过程中扩展大小,因此 Linux 发行版会发现它可以增长到分配的大小上限 1TB。
若要将 Linux 发行版的 VHD 大小扩展到超过默认的 1TB 上限(所分配的磁盘空间量),请执行以下步骤。 (对于尚未更新的早期 WSL 版本,此最大默认值可能设置为 512GB 或 256GB)。
使用
wsl.exe --shutdown
命令终止所有 WSL 实例将目录路径复制到与计算机上安装的 Linux 发行版关联的 ext4.vhdx 文件。 如需帮助,请参阅如何查找 Linux 发行版的 vhdx 文件和磁盘路径。
使用管理员权限打开 Windows 命令提示符,然后输入以下命令来打开 diskpart 命令解释器:
diskpart
现在会出现一个
DISKPART>
提示。 输入以下命令,将<pathToVHD>
替换为与 Linux 发行版关联的ext4.vhdx
文件的目录路径(步骤 2 中复制的)。Select vdisk file="<pathToVHD>"
显示与此虚拟磁盘关联的详细信息,包括虚拟大小,表示当前分配给 VHD 的大小上限:
detail vdisk
需要将虚拟大小转换为 MB。 例如,如果虚拟大小为 512 GB,则等于 512000 MB。 你输入的新值必须大于此原始值。 要将 512 GB 的虚拟大小加倍到 1024 GB,需以 MB 为单位输入值:1024000。 请注意,不要输入高于实际需要的值,因为减小虚拟磁盘大小的过程要复杂得多。
使用 Windows 命令提示符
DISKPART>
提示输入要分配给此 Linux 发行版的新的大小上限值:expand vdisk maximum=<sizeInMegaBytes>
退出
DISKPART>
提示:exit
启动此 Linux 发行版。 (确保它在 WSL 2 中运行。可以使用以下命令确认这一点:
wsl.exe -l -v
。不支持 WSL 1)。通过从 WSL 发行版命令行运行这些命令,让 WSL 知道它可以扩展此发行版的文件系统大小。 可能会看到以下消息,它响应第一个 mount 命令:“/dev: /dev 上未装载任何内容。”可以放心地忽略此消息。
sudo mount -t devtmpfs none /dev mount | grep ext4
复制此项的名称,该名称类似于:
/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 文件。
如果你遇到了与“装载发行版磁盘”相关的错误,这可能是由于突然关闭或断电,它可能导致 Linux 发行版 VHD 切换到只读,以避免数据丢失。 可以按照以下步骤使用 e2fsck
Linux 命令来修复和还原发行版。
当 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
有关块设备的信息包括:
- NAME:分配给设备的名称将为 sd[a-z],指的是 SCSI 磁盘,每个使用的磁盘都有指定的字母。
sda
始终是系统发行版。 - MAJ:MIN:表示 Linux 内核用于在内部标识设备的数字,其中第一个数字表示设备类型(8 用于表示小型计算机系统接口/SCSI 磁盘)。
- RM:让我们知道设备可以移动 (1) 与否 (0)。
- SIZE:卷的总大小。
- RO:让我们知道设备是只读 (1) 与否 (0)。
- TYPE:指设备类型(在本例中为磁盘)。
- MOUNTPOINTS:指块设备所在的文件系统上的当前目录(SWAP 用于预配置的非活动内存,因此没有装入点)。
如果 WSL 在打开 Linux 发行版时遇到了“装载错误”,则发行版可能会设置为只读,作为备用。 如果发生这种情况,则发行版可能会在启动期间显示以下错误:
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
命令通过以下步骤重新装载磁盘:
打开 PowerShell 并输入此命令来关闭所有 WSL 发行版:
wsl.exe --shutdown
(在提升的命令提示符中)以管理员身份打开 PowerShell,然后输入装载命令,将
<path-to-ext4.vhdx>
替换为发行版的 .vhdx 文件的路径。 有关查找此文件的帮助,请参阅如何查找 Linux 发行版的 VHD 文件和磁盘路径。wsl.exe --mount <path-to-ext4.vhdx> --vhd --bare
通过 PowerShell 使用
wsl.exe lsblk
命令来标识发行版的块设备名称 (sd[a-z]),然后输入以下命令修复磁盘(将<device>
替换为正确的块设备名称,如“sdc”)。e2fsck
命令会检查 ext4 文件系统(随 WSL 安装的发行版所使用的类型)的错误并相应地修复它们。wsl.exe sudo e2fsck -f /dev/<device>
修复完成后,输入以下命令在 PowerShell 中卸载磁盘:
wsl.exe --unmount
警告
可以使用 sudo mount -o remount,rw /
命令将只读发行版返回到可用/可写状态,但所有更改都将在内存中,因此会在重启发行版时丢失。 建议改用上面列出的步骤来装载和修复磁盘。
若要查找 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
文件的路径。