如何管理 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)。
使用此命令終止所有 WSL 執行個體:
wsl.exe --shutdown
將目錄路徑複製到與電腦上所安裝 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: none already mounted on /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
區塊裝置的相關資訊包括:
- 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
命令以下列步驟重新掛接磁碟:
開啟 PowerShell 並輸入 命令,以關閉所有 WSL 發行版本:
wsl.exe --shutdown
以系統管理員身分開啟 PowerShell (在提升權限的命令提示字元中),然後輸入掛接命令,並以發行版本 .vhdx 檔案的路徑取代
<path-to-ext4.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
檔案路徑。