共用方式為


如何管理 WSL 磁碟空間

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

適用於Linux的 Windows 子系統 (WSL 2) 會使用虛擬化平臺來安裝Linux散發套件與主機 Windows作系統,建立虛擬硬碟 (VHD) 來儲存您安裝之每個 Linux 發行版的檔案。 這些 VHD 會使用 ext4 檔案系統類型,並以 ext4.vhdx 檔案表示在 Windows 硬碟上。

WSL 2 會自動調整這些 VHD 檔案的大小,以符合記憶體需求。 根據預設,WSL 2 所使用的每個 VHD 檔案一開始都會配置 1TB 的最大磁碟空間量(在 WSL 0.58.0 版之前 之前, 此預設值設定為 512GB 最大值和 256GB 上限之前)。

如果 Linux 檔案所需的儲存空間超過此大小上限,您會看到錯誤,指出您已用盡磁碟空間。 若要修正此錯誤,請遵循下列 如何擴充 WSL 2 虛擬硬碟大小的指引。

如何檢查可用的磁碟空間

使用 Linux Df 命令,檢查 VHD 中隨 WSL 2 安裝的 Linux 發行版可用的磁碟空間量。

若要檢查可用的磁碟空間,請開啟 PowerShell 命令行並輸入此命令(以實際的散發名稱取代 <distribution-name>):

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

如果此指令不適用於您,請使用 wsl --update 命令升級至 WSL 的市集版本,或嘗試 wsl df -h /

輸出會包含:

  • 檔案系統:VHD 檔案系統的標識碼
  • 大小:磁碟的總大小(分配給 VHD 的最大空間)
  • 已使用:目前在 VHD 中使用的空間量
  • 可用性:VHD 中剩餘的空間量(已設定的大小減去使用的量)
  • 使用%:剩餘磁碟空間百分比(已使用/配置的大小)
  • 掛載在:磁碟掛載的目錄路徑

如果您發現接近用完配置給 VHD 的可用磁碟空間量,或因為磁碟空間不足而收到錯誤訊息,請參閱下一節,以瞭解如何擴充配置給您的 Linux 發行版相關聯的 VHD 的最大磁碟空間。 WSL 配置給 VHD 的磁碟空間數量一律會顯示預設上限 (1TB,在最新版本的 WSL 中),即使實際 Windows 裝置上的磁碟空間量小於。 WSL 會掛載會隨著使用而擴大的 VHD,因此您的 Linux 發行版本會發現它可以增長到配置的 1TB 最大容量。 

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

若要將 Linux 發行版的 VHD 大小擴充至超過預設的 1TB 磁碟空間上限,您可以使用 wsl --manage 命令,或遵循下列步驟。 (先前的 WSL 版本最大預設值可能為 512GB 或 256GB)。

使用 wsl --manage 擴充 VHD 大小

wsl --manage 命令僅適用於 WSL 2.5 版和更新版本。

若要調整虛擬磁碟上已設定的空間大小:

  1. 請以命令 "wsl.exe --shutdown" 終止所有 WSL 實例

  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.exe --shutdown 終止所有 WSL 實例。

  2. 將目錄路徑複製到 ext4.vhdx 與計算機上安裝之 Linux 發行版相關聯的檔案。 如需說明,請參閱 如何找出 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 散發命令行執行這些命令,以擴充此散發套件的檔案系統大小。 您可能會看到此訊息,以回應第一個 掛接 命令:“/dev:/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 切換至 只讀 以避免資料遺失。 您可以遵循下列步驟,使用 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)。
  • 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 命令,使用下列步驟重新掛接磁碟:

  1. 以系統管理員身分開啟 PowerShell(在提升許可權的命令提示字元中),並輸入命令以關閉所有 WSL 發行版:

    wsl.exe --shutdown
    
  2. 輸入 mount 命令,並以發行版的 .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。 您可以在修復完成後,卸載 發行版。 此外,您可能需要關閉 Windows 上的 Docker Desktop,以避免在執行命令 Wsl/Service/CreateInstance/MountVhd/HCS/ERROR_SHARING_VIOLATION時發生錯誤 wsl.exe sudo e2fsck -f /dev/sdc

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