如何管理 WSL 磁盘空间
本指南介绍如何管理使用 WSL 2 安装的 Linux 发行版使用的磁盘空间,包括:
适用于 Linux 的 Windows 子系统 (WSL 2) 使用虚拟化平台将 Linux 分发版与主机 Windows 操作系统一起安装,创建虚拟硬盘 (VHD) 来存储安装的每个 Linux 发行版的文件。 这些 VHD 使用 ext4 文件系统类型 ,并在 Windows 硬盘驱动器上表示为 ext4.vhdx 文件。
WSL 2 会自动调整这些 VHD 文件的大小以满足存储需求。 默认情况下,WSL 2 使用的每个 VHD 文件最初在 WSL 版本 0.58.0 之前分配了 1TB 的最大磁盘空间量 (,此默认值在) 之前设置为最大 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 wsl --update
的应用商店版本,或尝试 wsl df -h /
。
输出将包括:
- 文件系统:VHD 文件系统的标识符
- 大小:磁盘的总大小 (分配给 VHD) 的最大空间量
- 已用:VHD 中当前使用的空间量
- 可用:VHD (分配大小中剩余的空间量减去)
- Use%:已用/已分配大小) (剩余磁盘空间的百分比
- 装载位置:装载磁盘的目录路径
如果发现即将达到分配给 VHD 的可用磁盘空间量,或者由于没有剩余磁盘空间而收到错误,请参阅下一部分,了解如何扩展分配给与 Linux 分发版关联的 VHD 的最大磁盘空间量的步骤。 WSL 分配给 VHD 的磁盘空间量在最新版本的 WSL) 中始终显示默认最大 (1TB,即使实际 Windows 设备上的磁盘空间量小于此大小。 WSL 将装载一个 VHD,该 VHD 将在使用时扩展其大小,因此 Linux 分发版会发现它可以增长到分配的最大大小 1TB。
如何扩展 WSL 2 虚拟硬盘的大小
若要将 Linux 分发版的 VHD 大小扩展到 超过默认的最大 分配磁盘空间量 1TB,请执行以下步骤。 (对于尚未更新的早期 WSL 版本,此最大默认值可能设置为 512GB 或 256GB) 。
使用
wsl.exe --shutdown
命令终止所有 WSL 实例将目录路径复制到与计算机上安装的 Linux 分发版关联的 ext4.vhdx 文件。 有关帮助,请参阅 如何查找 Linux 分发版的 vhdx 文件和磁盘路径。
使用管理员权限打开 Windows 命令提示符,然后通过输入以下命令打开 diskpart 命令解释器:
diskpart
现在会出现一个
DISKPART>
提示。 输入以下命令,将<pathToVHD>
替换为步骤 2) 中复制的与 Linux 分发 (关联的文件的目录路径ext4.vhdx
。Select vdisk file="<pathToVHD>"
显示与此虚拟磁盘关联的详细信息,包括 虚拟大小,表示当前分配的 VHD 最大大小:
detail vdisk
需要将 虚拟大小 转换为兆字节。 例如,如果 虚拟大小:512 GB,则将其转换为 512000。 你输入的新值必须大于此原始值。 例如,若要将 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 文件。
如何修复 VHD 装载错误
如果遇到与“装载分发磁盘”相关的错误,可能是由于突然关闭或断电,并可能导致 Linux 分发 VHD 切换到 只读 ,以避免数据丢失。 可以按照以下步骤使用 e2fsck
Linux 命令修复和还原分发版。
使用 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) 。
- SIZE:卷的总大小。
- RO:让我们知道设备是否为只读 (1) (0) 。
- 类型:在本例中,指) (磁盘的设备类型。
- 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 文件和磁盘路径
若要查找 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
。