WSL mit RAM disk und Podman für DevContainer in VS Code

Wenn du eine schnelle, temporäre Umgebung zum Testen und Entwickeln von Containern suchst, ist WSL unter Windows 11 eine ideale Lösung – besonders in Kombination mit Podman als Docker-Alternative.

Wir gehen von einem aktuellem und frischem Ubuntu in der WSL aus.

Hier sind die Schritte, um Podman in der Ubuntu-Umgebung mit Ramdisk zu verwenden:

Podman auf Ubuntu installieren

Standardmäßig ist das Podman-Paket im Ubuntu-Standard-Repository enthalten.
Es kann installiert werden, indem einfach der folgende Befehl geführt wird:

sudo apt install -y podman fuse-overlayfs slirp4netns

Podman ist eine Docker-kompatible Container-Engine, die auch ohne Root-Rechte funktioniert. Damit das klappt, braucht es zwei Helfer:

  • fuse-overlayfs: Simuliert ein Overlay-Dateisystem in Userspace – wichtig für rootless Container.
  • slirp4netns: Ermöglicht Netzwerkzugriff für Container ohne Root – z. B. für apt install im Container.

Sobald Podman installiert ist, kann dessen Funktion mit dem folgenden Befehl überprüft werden:

podman info

Beim Ausführen von podman info erscheint möglicherweise folgende Warnung:

WARN[0000] "/" is not a shared mount, this could cause issues or missing mounts with rootless containers

Diese Meldung ist unter WSL2 völlig normal und kann ignoriert werden.
WSL verwendet ein eigenes virtuelles Dateisystem, das nicht als „shared mount“ konfiguriert ist – Podman funktioniert trotzdem zuverlässig. Die Warnung hat keine Auswirkungen auf typische Entwicklungs-Workflows mit rootlosen Containern.

RAM-Disk einrichten für Podman-Storage

Eine Ramdisk ist ein temporärer Speicherbereich im Arbeitsspeicher.
Es wird ein Verzeichnis erstellt in dem die Ramdisk gemountet werden soll:

sudo mkdir /mnt/ramdisk

In die Datei /etc/fstab wird der folgende Inhalt, zum Beispiel mit sudo nano /etc/fstab ergänzt:

tmpfs /mnt/ramdisk tmpfs rw,nosuid,noatime,nodev,size=50%,mode=1777 0 0

Erklärung zum Befehl

tmpfs
Dies ist der Typ des Dateisystems. tmpfs ist ein virtuelles Dateisystem im Arbeitsspeicher (RAM-Disk), das temporäre Dateien speichert.
/mnt/ramdisk
Dies ist das Zielverzeichnis, in dem die RAM-Disk gemountet wird. In diesem Fall wird die RAM-Disk im Verzeichnis /mnt/ramdisk platziert.
tmpfs
Dies ist der Typ des Dateisystems, der wiederholt wird. Es zeigt an, dass es sich um eine RAM-Disk handelt.
rw
Dies steht für "read-write" und gibt an, dass das Dateisystem sowohl zum Lesen als auch zum Schreiben verfügbar ist.
nosuid
Dies ist eine Sicherheitsoption, die verhindert, dass ausführbare Dateien mit SUID-Berechtigungen (Set-User-ID) auf der RAM-Disk ausgeführt werden können.
noatime
Diese Option verhindert, dass der Zugriffszeitstempel (atime) für Dateien auf der RAM-Disk aktualisiert wird. Dies kann die Leistung verbessern.
nodev
Diese Option verhindert, dass Gerätedateien auf der RAM-Disk erstellt werden können.
size=XXX
XXX legt die Größe der RAM-Disk fest, z.B: 100gb.
Alternativ zur festen Größe wie size=100gb kann man auch size=50% verwenden, damit nutzt die RAM-Disk dynamisch bis zur Hälfte des verfügbaren Arbeitsspeichers.
mode=1777
dies erlaubt allen Benutzern das Schreiben ins Verzeichnis, schützt aber ihre eigenen Dateien vor dem Zugriff anderer – ideal für gemeinsam genutzte, temporäre Speicherorte.
0 0
Dies sind die Optionen für das Dumping und das automatische Dateisystem-Checken. In diesem Fall sind sie auf 0 gesetzt, was bedeutet, dass diese Funktionen deaktiviert sind.

Podman konfigurieren für RAM-Disk-Nutzung

Podman muss so konfiguriert werden, dass es die Ramdisk für temporäre Dateien verwendet.
Bearbeite dazu die Datei ~/.config/containers/storage.conf:

mkdir -p ~/.config/containers
sudo nano ~/.config/containers/storage.conf

Füge die folgenden Zeilen hinzu:

[storage]
  driver = "overlay"
  runroot = "/mnt/ramdisk/podman/run"
  graphroot = "/mnt/ramdisk/podman/graph"
[storage.options]
  mount_program = "/usr/bin/fuse-overlayfs"

Da runroot nur temporäre Daten enthält, ist es ideal, ihn ebenfalls in der RAM-Disk zu speichern – für maximale Performance.

Podman starten und testen

Zur Sicherheit sollte der Podman-Dienst noch einmal neugestartet werden:

sudo systemctl restart podman

Überprüfe, ob Podman die Ramdisk verwendet:

podman info | grep -E 'graphRoot|runRoot'

Dabei sollte der Pfad zur Ramdisk unter RunRoot und GraphRoot sehen.

Kommt ein Fehler mit Zugriffsrechten soltle man die WSL noch neustarten um sicher zu gehen das die RamDisk ordnungsgemäß eingerichtet ist. Hierfür reicht ein sudo reboot und dann neu mit der WSL verbinden.

Einen Hello-World Container mit kann man mit podman run hello-world starten und sich dann die Liste der verfügbaren Images mit podman image ls -a anschauen.

Startet man die WSL neu (mit sudo reboot in der WSL oder wsl --shutdown in der PowerShell hat mam wieder eine frische und leere Podman Umgebung.

Bonus: Dev-Container mit VS Code nutzen

Wer mit Visual Studio Code arbeitet, kann die Dev-Container-Erweiterung nutzen und Podman als Backend konfigurieren – ideal für isolierte Entwicklungsumgebungen direkt in der RAM-Disk.

Folgende Einstellungen sollten in den Visual Studio Code Settings noch gesetzt werden:

Dev Containers: Execute In WSL wird aktiviert.

Sollte man mehrere WSL Distros im Einsatz haben oder sicher gehen wollen, dass immer die richtige verwendet wird trägt man unter Dev Containers: Execute In WSLDistro noch den Namen der gewünschten Distro.

Man kann diese Werte auch wie folgt in die Konfiguration als json eintragen:

"dev.containers.executeInWSL": true
"dev.containers.executeInWSLDistro": "Debian"

Quellen: