如何管理 WSL 磁碟空間

本指南涵蓋如何管理使用 WSL 2 所安裝 Linux 發行版本使用的磁碟空間,包括:

Windows 子系統 Linux 版 (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 命令,檢查 VHD 中針對隨 WSL 2 所安裝 Linux Df 發行版本的可用磁碟空間量。

若要檢查可用的磁碟空間,請開啟 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 會隨您使用而擴充大小,因此您的 Linux 發行版本會發現其可以成長到 1TB 的配置大小上限。 

如何擴充 WSL 2 虛擬硬碟的大小

若要擴充 Linux 發行版本的 VHD 大小,以超過預設的 1TB 上限的配置磁碟空間,請遵循下列步驟。 (對於尚未更新的舊版 WSL,此預設值上限可能會設定為 512GB 或 256GB)。

  1. 使用此命令終止所有 WSL 執行個體:wsl.exe --shutdown

  2. 將目錄路徑複製到與電腦上所安裝 Linux 發行版本相關聯的 ext4.vhdx 檔案。 如需說明,請參閱如何找出 Linux 發行版本的 vhdx 檔案和磁碟路徑

  3. 以系統管理員權限開啟 Windows 命令提示字元,然後輸入下列命令來開啟 diskpart 命令解譯:

    diskpart
    
  4. 您現在會有 DISKPART> 提示。 輸入下列命令,將 <pathToVHD> 取代為與 Linux 發行版本相關聯的 ext4.vhdx 檔案目錄路徑 (在步驟 2 中複製)。

    Select vdisk file="<pathToVHD>"
    
  5. 顯示與此虛擬磁碟相關聯的詳細資料,包括虛擬大小,代表已配置 VHD 的目前大小上限:

    detail vdisk
    
  6. 您必須將虛擬大小轉換為 MB。 例如,如果 虛擬大小: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 發行版本命令列執行這些命令,以擴充此發行版本的檔案系統大小。 您可能會看到下列訊息,以回應第一個 mount 命令:"/dev: none already mounted on /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 切換為唯讀以避免資料遺失。 您可以遵循下列步驟,使用 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

區塊裝置的相關資訊包括:

  • NAME:指派給裝置的名稱會是 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 命令以下列步驟重新掛接磁碟:

  1. 開啟 PowerShell 並輸入 命令,以關閉所有 WSL 發行版本:

    wsl.exe --shutdown
    
  2. 以系統管理員身分開啟 PowerShell (在提升權限的命令提示字元中),然後輸入掛接命令,並以發行版本 .vhdx 檔案的路徑取代 <path-to-ext4.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。 修復完成後,您可以解除安裝發行版本。

  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 檔案路徑。