Wie bekomme ich ungenutzten Speicherplatz von Ubuntu auf WSL2 zurück?

Wie bekomme ich ungenutzten Speicherplatz von Ubuntu auf WSL2 zurück?

Ich verwende Ubuntu 20.04 auf WSL2 unter Windows 10 und habe festgestellt, dass ich nach dem Entfernen von Dateien auf Ubuntu nicht den Speicherplatz zurückbekomme, der von den entfernten Dateien belegt wurde. Beispiel: Bevor ich Dateien auf Ubuntu gelöscht habe, zeigte der Windows Explorer an, dass mein freier Speicherplatz auf dem C:Laufwerk () etwa 46 GB betrug. Nachdem ich dann etwa 10 GB an Dateien gelöscht hatte, was in meinem Fall einige temporäre Gatsby-Sites waren, war noch weniger freier Speicherplatz vorhanden, etwa 45 GB, was ich sehr seltsam fand.

Wie kann ich also diese ungenutzten Bits zurückbekommen? Gibt es einen Terminalbefehl, den ich verwenden kann, oder kann ich etwas über die Windows-Benutzeroberfläche oder so tun?

Antwort1

Update vom September 2023:Eine neue Vorabversion von WSL (2.0.0) soll einen neuen „Sparse“-Modus für Disk-Images bieten, der das Image automatisch verkleinert, wenn Dateien entfernt werden.

Ich habe das zwar noch nicht persönlich getestet, aberDevBlog-Ankündigungkönnen Sie ein vorhandenes Disk-Image mit dem folgenden Befehl von PowerShell in ein Sparse-Image konvertieren:

wsl --manage <distro> --set-sparse true

Sie können auch Folgendes zu Ihrem .wslconfig(in Ihrem WindowsProfilVerzeichnis, nicht innerhalb von WSL), damit jedes neu erstellte Distributions-Image spärlich ist:

[experimental]
sparseVhd=true

Ältere Antwort:

Es gibt ein WSL GithubAusgabezu diesem Thema offen. WSL vergrößert die virtuelle Festplatte (ext4.vhdx) automatisch, aber die Verkleinerung zur Rückgewinnung ungenutzten Speicherplatzes muss derzeit manuell erfolgen.

Als erstes müssen Sie den Speicherort Ihrer ext4.vhdx kennen. Bei einer Standard-Ubuntu-Installation sollte es sich in etwa wie folgt befinden:%USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\

Dann gibt es mehrere Techniken, mit denen Sie den ungenutzten Speicherplatz entfernen können. Ich empfehle Ihnen, mit einem zu beginnen wsl --shutdownund die VHDX als Backup zu kopieren, um zu beginnen. Wenn Sie Docker Desktop ausführen, fahren Sie es auch herunter, da es sonst versehentlich versucht, WSL nach Ihrem neu zu starten --shutdown.

  • Wenn Sie Windows Professional oder höher verwenden, können Sie Hyper-V installieren und das Optimize-VHD-Commandlet verwenden, wie imursprüngliches Problem. .

  • Unter Windows Home (und höher) können Sie diskpartwie beschrieben verwendenin diesem Kommentar.

  • Exportieren der WSL-Distribution und erneutes Importieren in eine neue WSL-Instanz (wie indieser Kommentar) wird den Speicherplatz ebenfalls freigeben. Beachten Sie, dass Sie den Standardbenutzernamen nach einem Import zurücksetzen müssen. SieheHier(UndHierfür alternative Optionen).

Ich habe sowohl die zweite als auch die dritte Technik persönlich getestet und bestätigt.

Antwort2

Wenn der Befehl let optimize-vhdin Ihrem System nicht verfügbar ist, gehen Sie wie folgt vor:

Fahren Sie das WSL herunter, bevor Sie dessen Festplatte verwalten

wsl --shutdown

Speichern Sie das folgende Skript als compact-disk.txt

select vdisk file="C:\Users\%username%\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk

Öffnen Sie die Eingabeaufforderung als Administrator und führen Sie das oben gespeicherte Skript aus

diskpart /s <SAVED_SCRIPT_FOLDER_PATH>\compact-disk.txt

Antwort3

  • Aktivieren Sie das Hyper-V-Modul in den Windows-Funktionen (Systemsteuerung -> Windows-Funktionen ein- oder ausschalten -> Hyper-V aktivieren -> Neustart). Dies ist erforderlich, um den Befehl optimize-vhd zu aktivieren.
  • Öffnen Sie Windows PowerShell als Administrator: Drücken Sie zunächst Windows+R, um Ausführen zu öffnen, und geben Sie dann „PowerShell“ in das Textfeld ein. Drücken Sie anschließend Strg+Umschalt+Eingabe. Windows PowerShell wird im Administratormodus geöffnet. Führen Sie in PowerShell die folgenden Befehle aus.
  • wsl.exe --shutdown
  • cd in den ext4.vhdx Ordner, der normalerweisecd C:\Users\<user>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\
  • optimize-vhd -Path .\ext4.vhdx -Mode full(Stellen Sie sicher, dass die Datei ext4.vhdx nicht mit der Maus angeklickt wird, da dies zu der Fehlermeldung führen würde, dass die Datei von einem anderen Prozess in Powershell verwendet wird.)

Antwort4

Mit diesem Self-Elevate-Skript können Sie mehrere VHDX-Dateien gleichzeitig komprimieren.

# Self-elevate the script if required
if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
    if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
        $CommandLine = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments
        Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList $CommandLine
        Exit
    }
}

#Full Path of vhdx file
$d1 = #Ex: "E:\Docker\wsl\data\ext4.vhdx"
$d2 = ""
$d3 = ""
$d4 = ""
$d5 = ""
$d6 = ""

$paths = $d1, $d2, $d3, $d4, $d5, $d6

foreach ($file in $paths) {
    echo ""
    echo "Befor Shrinking File sizes in MB"
    Get-ChildItem -Path $file | Select-Object FullName, @{Name = "Size"; E = { $_.Length / 1MB } }
    echo ""
    echo "---------"
    echo "Shrinking $file"
    echo "---------"

    wsl --shutdown
    Optimize-VHD -Path $file -Mode Full

    echo ""
    echo "After Shrinking File sizes in MB"
    Get-ChildItem -Path $file | Select-Object FullName, @{Name = "Size"; E = { $_.Length / 1MB } }
    echo ""
    echo ""
    echo ""
    echo ""
}

Read-Host -Prompt "Press Enter to exit"

Übrigens, mit einer kleinen Optimierung können Sie es auch beim Start ausführen („Docker beim Anmelden starten“ sollte deaktiviert sein).

verwandte Informationen