Tags: #wsl #wsl2 #windows
今天突然發現 C
盤快滿了,想起來之前把 Docker
容器的資料持久化到了 WSL2
的某個目錄下,於是就想著把不需要的檔案清理了。但清理完畢之後我發現 C
盤的剩餘空間並沒有變大,非常的奇怪。後來我在網上搜尋了很久,終於找到了原因和解決方法。
1 分析原因
不同於 WSL1
,WSL2
本質上是虛擬機器,所以 Windows
會自動建立 vhdx
字尾的虛擬磁碟檔案作為儲存。這個 vhdx
字尾的虛擬磁碟檔案特點是可以自動擴容,但是一般不會自動縮容。一旦有很多檔案把它“撐大”,即使把這些檔案刪除它也不會自動“縮小”。所以刪除檔案後還需要我們手動進行壓縮才能釋放磁碟空間。
2 如何操作
2.1 找到並確定要壓縮的虛擬磁碟檔案
首先,我們搜尋並找到 ext4.vhdx
檔案。
我的 WSL2
有如下的 Linux distributions:
➜ wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Running 2
docker-desktop Running 2
docker-desktop-data Running 2
我搜尋到的 ext4.vhdx
檔案路徑如下:
C:\Users\richa\AppData\Local\Docker\wsl\data\ext4.vhdx
C:\Users\richa\AppData\Local\Docker\wsl\distro\ext4.vhdx
C:\Users\richa\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx
由於我這裡 C
盤空間不足主要是 Ubuntu-20.04
刪除檔案後 ext4.vhd
沒有縮容引起的,所以只壓縮了它的 ext4.vhdx
。
如果出現刪除 Docker
映象、刪除 Docker
容器後磁碟佔用沒有縮小,應該也可以類比操作。
2.2 備份虛擬磁碟檔案所屬的 Linux distribution(可選)
在 PowerShell
中執行:
# 關閉 WSL2 中的 linux distributions
wsl --shutdown
# 備份指定的 Linux distribution 到指定的位置
wsl --export Ubuntu-20.04 D:\Ubuntu-20.04.tar
如果後續步驟出現錯誤,可以從備份的檔案中恢復。本人後續步驟並沒有出現錯誤,所以並沒有實踐恢復的操作。
有需要的讀者可以參考:wsl2-backup-and-restore-images-using-import-and-export
2.3 壓縮虛擬磁碟檔案
在 PowerShell
中執行:
# 關閉 WSL2 中的 linux distributions
wsl --shutdown
# 執行管理計算機的驅動器的 DiskPart 命令
diskpart
在新開啟的 DiskPart
命令視窗中執行:
# 選擇虛擬磁碟檔案
select vdisk file="C:\Users\richa\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx"
# 壓縮檔案
compact vdisk
# 壓縮完畢後解除安裝磁碟
detach vdisk
上述操作執行完畢,WSL2
刪除檔案後空出來的磁碟空間就被釋放了。
參考:
[解決刪除檔案後 WSL2 磁碟空間不釋放的問題 - 知乎](https://zhuanlan.zhihu.com/p/521747491)