本指南涵蓋如何管理使用 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 版和更新版本。
若要調整虛擬磁碟上已設定的空間大小:
請以命令 "
wsl.exe --shutdown
" 終止所有 WSL 實例執行
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大小:
使用命令
wsl.exe --shutdown
終止所有 WSL 實例。將目錄路徑複製到 ext4.vhdx 與計算機上安裝之 Linux 發行版相關聯的檔案。 如需說明,請參閱 如何找出 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 散發命令行執行這些命令,以擴充此散發套件的檔案系統大小。 您可能會看到此訊息,以回應第一個 掛接 命令:“/dev:/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
區塊裝置的相關信息包括:
-
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
輸入 mount 命令,並以發行版的 .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>
注意
如果您只安裝單一 Linux 發行版,可能會遇到「使用中的 ext 檔案」錯誤,而且需要 安裝 額外的發行版,才能執行 wsl.exe lsblk
。 您可以在修復完成後,卸載 發行版。 此外,您可能需要關閉 Windows 上的 Docker Desktop,以避免在執行命令 Wsl/Service/CreateInstance/MountVhd/HCS/ERROR_SHARING_VIOLATION
時發生錯誤 wsl.exe sudo e2fsck -f /dev/sdc
。
修復完成後,請輸入下列命令,在 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
檔案路徑。