解決刪除檔案後 WSL2 磁碟空間不釋放的問題

ministep88發表於2024-05-30
Tags: #wsl #wsl2 #windows

今天突然發現 C 盤快滿了,想起來之前把 Docker 容器的資料持久化到了 WSL2 的某個目錄下,於是就想著把不需要的檔案清理了。但清理完畢之後我發現 C 盤的剩餘空間並沒有變大,非常的奇怪。後來我在網上搜尋了很久,終於找到了原因和解決方法。

1 分析原因

不同於 WSL1WSL2 本質上是虛擬機器,所以 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)

相關文章