Einbinden von Laufwerken


Unter WSL werden die Windows-Laufwerke standardmäßig eingebunden und unter den Pfaden /mnt/c/ usw. bereitgestellt. Allerdings gibt es dabei ein Riesen-Problem: Der Treiber, der für die Umsetzung vom Windows-Dateisystem ins Linux-Dateisystem, ist sehr langsam.

Wenn Du also tatsächlich mit WSL arbeitest, d.h. z.B. dort einen Docker-Container für die Entwicklung mit Apache2 / PHP für die Entwicklung einer Webseite verwendest, wirst Du das schnell bemerken. Es gibt dafür nur eine Lösung: Deine Dat(ei)en müssen vom Windows- ins WSL-Dateisystem.

Dafür gibt es zwei Optionen:

  1. Du verwendest die VHDX-Datei der WSL-Distro

    Wenn Du in den Windows Datei-Explorer schaust, siehst Du, wenn alles richtig installiert ist, ganz unten einen kleinen Pinguin und daneben das Dateisystem Deiner Linux-Distro(s) eingebunden. Du kannst Deine Daten, also (bleiben wir bei dem Beispiel) die Dateien der Webseite, mit dem Windows-Explorer in Dein home-Verzeichnis verschieben oder kopieren.

    Die Änderungen im Linux-Dateisystem werden nicht sofort angezeigt. Drücke F5 um die Anzeige zu aktualisieren und das Kopieren zu kontrollieren!!!

    Falls es dabei zu Problemen mit Berechtigungen kommt, verwende zum Kopieren die Kommandozeile.

    Nachteil dieser Methode: Solltest Du ein Dual-Boot-System mit Windows und Linux nutzen, kannst Du die Dateien, die Du in einer VHDX „vergraben“ hast, nicht unter Linux nutzen, sondern nur unter WSL!

  2. Du verwendest eine eigene Platte mit dem ext4-Dateisystem und bindest sie in WSL ein

    Das hat den Vorteil, dass Du die Daten z.B. in einem Dual-Boot-System auch unter Linux nutzen kannst.

    Als Erstes musst Du dafür die Bezeichnung des Laufwerks herausfinden. Dazu kannst Du diesen Powershell-Befehl zur Hilfe nehmen:

    GET-CimInstance -query "SELECT * from Win32_DiskDrive"

    Wenn Du den Namen hast, musst Du das Laufwerk zuerst einmal in WSL einbinden:

    wsl --mount \\.\PHYSICALDRIVE2 --bare

    In WSL schaust Du nun nach der UUID des Laufwerks, dafür verwendest Du die Befehle

    lsblk

    und

    sudo blkid

    Nun erzeuge das Mount-Skript:

    sudo bash -c "cat > /mount.sh" <<'EOF'
    #!/usr/bin/env bash
    
    /mnt/c/Users/karlheinz/AppData/Local/Microsoft/WindowsApps/wsl.exe -d Ubuntu-24.04 --mount \\\\.\\PHYSICALDRIVE2 --bare
    echo "Physical drive ECHO mounted in WSL"
    
    timeout=30
    elapsed=0
    interval=2
    
    while [ ! -e /dev/disk/by-uuid/<UUID> ]; do
       if [ $elapsed -ge $timeout ]; then
           echo "Timed out waiting for /dev/disk/by-uuid/<UUID> to become ready."
           exit 1
       fi
    
       echo "Waiting for /dev/disk/by-uuid/<UUID> to be ready..."
       sleep $interval
       elapsed=$((elapsed + interval))
    done
    echo "Device is ready"
    
    mount -t ext4 -o defaults /dev/disk/by-uuid/<UUID> /home/karlheinz/linux
    echo "Device mounted to /home/karlheinz/linux"
    EOF

    Als letztes muss noch die interne WSL-Konfiguration geändert werden:

    sudo bash -c "cat > /etc/wsl.conf" <<'EOF'
    [boot]
    systemd=true
    
    [boot]
    command="bash /mount.sh"
    command="service docker start"
    EOF

    Ja, Du rufst hier beim Start von WSL aus WSL heraus WSL auf, um darüber die physikalischen Platten einzubinden. Das ist so richtig „von hinten durch die Brust ins Auge“, wie wir hier zu sagen pflegen.

    Das ist irgendwie krank und genial zugleich!

Quelle