Hintergrund & Funktionsweise
Für die Nutzung von Audio (und Video) unter WSL21 ist es erforderlich den Kernel neu zu kompilieren und zusätzlichen Modulen zu aktivieren. Audio- und Video-Support ist beispielsweise hilfreich, wenn per “Xrdp”2 auf die WSL2-Instanz zugegriffen wird, um Linux als vollwertige Desktop-Umgebung unter Windows zu nutzen. Dieser Artikel beschreibt wie das möglich ist und welche Schritte dafür ausgeführt werden müssen.
Voraussetzungen
- Mindestens Windows 113 ist installiert
- WSL2 muss unter Windows 11 aktiviert sein
- → Eine WSL2-Linux-Distribution ist installiert
Schritte
-
Starten des installierten Subsystems
- innerhalb der Windows Eingabeaufforderung -
- Die Tastenkombination Windows-Taste + R-Taste betätigen
- Im kleinen Fenster cmd eingeben und mit der Return-Taste bestätigen oder OK klicken
- System starten
wsl -d mylinux
- Hinweise:
- Die Windows Eingabeaufforderung wechselt in das Terminal der Linux-Distribution
- Der Distributionsname “mylinux” wurde innerhalb eines vorherigen Artikels festgelegt, siehe → 3. Voraussetzung
-
Installation der benötigten Pakete und Download des Kernel-Releases
- innerhalb der Terminals der Linux-Distribution -
- Benötigte Build-Tools installieren
sudo apt install -y build-essential flex bison dwarves libssl-dev libelf-dev bc linux-tools-virtual libncurses-dev usbutils unzip
- Download des Kernel-Releases
cd
wget https://github.com/microsoft/WSL2-Linux-Kernel/archive/refs/heads/linux-msft-wsl-5.15.y.zip
- Entpacken des Kernel-Releases
unzip -o linux-msft-wsl-5.15.y.zip
- Benötigte Build-Tools installieren
-
Modifizieren der Standardkonfigration des Kernels, Kompilieren und Installieren
- innerhalb des Terminals der Linux-Distribution -
- Kopieren der Standardkonfiguration des WSL2-Kernels in die oberste Ebene des geklonten Repository
cd WSL2-Linux-Kernel-linux-msft-wsl-5.15.y
cp Microsoft/config-wsl .
- Hinzufügen der folgenden Konfigrations-Flags zur Standardkonfiguration
sudo tee -a config-wsl > /dev/null <<EOT CONFIG_MEDIA_SUPPORT=m CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_SDR_SUPPORT=y CONFIG_MEDIA_PLATFORM_SUPPORT=y CONFIG_MEDIA_TEST_SUPPORT=y CONFIG_VIDEO_DEV=m CONFIG_MEDIA_CONTROLLER=y CONFIG_VIDEO_V4L2=m CONFIG_MEDIA_USB_SUPPORT=y CONFIG_USB_VIDEO_CLASS=m CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y CONFIG_USB_GSPCA=m CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_V4L2=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_VMALLOC=m CONFIG_MEDIA_ATTACH=y CONFIG_HIDRAW=y CONFIG_SOUND=m CONFIG_SND_USB_AUDIO=m CONFIG_SND=m CONFIG_SND_PCM_TIMER=y CONFIG_SND_SUPPORT_OLD_API=y CONFIG_SND_PROC_FS=y CONFIG_SND_VERBOSE_PROCFS=y CONFIG_SND_DMA_SGBUF=y CONFIG_SND_DRIVERS=y CONFIG_SND_PCI=y CONFIG_SND_HDA_PREALLOC_SIZE=2048 CONFIG_SND_USB=y CONFIG_SND_X86=y EOT
- Automatisches Zusammenführen der neuen und überschriebenen Konfiguration
sudo make menuconfig KCONFIG_CONFIG=config-wsl
- Hinweise:
- Die Kernel-Konfigurationsmaske wird geöffnet.
- Diese Maske direkt wieder per “Exit”, dann mit “Yes” verlassen.
- Kompilieren des Kernels
sudo make -j $(nproc) KCONFIG_CONFIG=config-wsl
- Installieren der Kernel-Module
sudo make modules_install -j$(nproc) KCONFIG_CONFIG=config-wsl
- Kopieren der Standardkonfiguration des WSL2-Kernels in die oberste Ebene des geklonten Repository
-
Kopieren des Kernel-Images
- innerhalb des Terminals der Linux-Distribution -
- Erstellen und Kopieren des Images in ein Verzeichnis des Host-Systems
mkdir /mnt/c/WSL2-Linux-Kernel
sudo cp vmlinux /mnt/c/WSL2-Linux-Kernel
exit
- Erstellen und Kopieren des Images in ein Verzeichnis des Host-Systems
-
Konfigurieren von WSL2 zur Verwendung des neuen Kernels
- innerhalb der Windows Eingabeaufforderung -
- Hinzufügen des individuellen Kernes zur WSL-Konfiguration
echo kernel=c:\\WSL2-Linux-Kernel\\vmlinux>> "%userprofile%\.wslconfig"
- Herunterfahren von WSL2
wsl --shutdown
- Neustart der Linux-Distribution
wsl -d mylinux
- Hinweise:
- Die Windows Eingabeaufforderung wechselt erneut in das Terminal der Linux-Distribution
- Der Distributionsname “mylinux” wurde innerhalb eines vorherigen Artikels festgelegt, siehe → 3. Voraussetzungen
- Hinzufügen des individuellen Kernes zur WSL-Konfiguration
-
Vorbereiten des Benutzers und usbip Tools
- innerhalb des Terminals der Linux-Distribution -
- Benutzer den zusätzlichen Gruppen hinzufügen
sudo usermod -a -G users,dialout,cdrom,floppy,sudo,audio,dip,video,plugdev,netdev,rtkit,ssl-cert tux
- Hinweis:
- Der Benutzername “tux” wurde innerhalb eines vorherigen Artikels festgelegt, siehe → 3. Voraussetzungen
- Vorbereiten von usbip
sudo update-alternatives --install /usr/local/bin/usbip usbip $(command -v ls /usr/lib/linux-tools/*/usbip | tail -n1) 20
exit
- Benutzer den zusätzlichen Gruppen hinzufügen
-
Windows Eingabeaufforderung schließen und mit erhöhten Rechten starten
- innerhalb der Windows Eingabeaufforderung -
- Eingabeaufforderung schließen
exit
- Die Tastenkombination Windows-Taste + R-Taste betätigen
- Im kleinen Fenster cmd eingeben, danach die ‘Strg’ + die ‘Umschalt-/Shift-Taste’ drücken und mit der Return-Taste bestätigen oder OK klicken
- Im folgenden Fenster mit Ja bestätigen
- Eingabeaufforderung schließen
-
Installieren von usbipd und USB-Gerät(e) exportierbar machen
- innerhalb der Windows Eingabeaufforderung (mit erhöhten Rechten) -
- Installation
winget install usbipd
- USB-Geräte auflisten
usbipd list
- Die Ausgabe sollten in etwa wie folgt aussehen:
BUSID VID:PID DEVICE STATE 2-1 17ef:a387 Lenovo USB Ethernet Not shared 2-2 174c:5106 USB-Massenspeichergerät Not shared 4-5 1050:0407 USB-Eingabegerät, Microsoft Usbccid-Smartcard-Leser (WUDF) Not shared 4-6 046d:0a45 Logitech USB Headset, USB-Eingabegerät Not shared
- USB-Gerät exportierbar machen am Beipiel eines USB Headsets
usbipd bind -b 4-6 -f
exit
- Hinweise:
- Anstelle der BUS_ID 4-6 die ID wählen welches dem zu exportierenden Gerät entspricht
- Installation
-
Windows Eingabeaufforderung mit Standardrechten starten
- innerhalb der Windows Eingabeaufforderung -
- Die Tastenkombination Windows-Taste + R-Taste betätigen
- Im kleinen Fenster cmd eingeben und mit der Return-Taste bestätigen oder OK klicken
- Wechsel in die Linux-Distribution
wsl -d mylinux
- Hinweise:
- Die Windows Eingabeaufforderung wechselt erneut in das Terminal der Linux-Distribution
- Der Distributionsname “mylinux” wurde innerhalb eines vorherigen Artikels festgelegt, siehe → 3. Voraussetzungen
-
USB-Gerät in der Linux-Distribution anzeigen
- innerhalb des Terminals der Linux-Distribution -
- IP-Adresse des WSL Hosts als Umgebungsvariable setzen
WSL_HOST_IP=$(ip route show default | awk '{print $3}')
- USB-Geräte anzeigen
usbip list -r $WSL_HOST_IP
- Die Ausgabe sollten in etwa wie folgt aussehen:
Exportable USB devices ====================== - 172.28.48.1 4-6: Logitech, Inc. : 960 Headset (046d:0a45) : USB\VID_046D&PID_0A45\000000000000 : (Defined at Interface level) (00/00/00) : 0 - Audio / Control Device / unknown protocol (01/01/00) : 1 - Audio / Streaming / unknown protocol (01/02/00) : 2 - Audio / Streaming / unknown protocol (01/02/00) : 3 - Human Interface Device / No Subclass / None (03/00/00)
- IP-Adresse des WSL Hosts als Umgebungsvariable setzen
-
USB-Gerät verbinden und Audio über die Desktop-Umgebung prüfen
- Linux Desktop-Umgebung starten, siehe Tutorial unter → 3. Voraussetzungen
- Ein Terminal in der Linux Desktop-Umgebung starten
- USB-Gerät per usbip verbinden
sudo usbip attach -b 4-6 -r $WSL_HOST_IP
- Überprüfen
lsusb
- Die Ausgabe sollten in etwa wie folgt aussehen:
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 046d:0a45 Logitech, Inc. 960 Headset Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
- Hinweise:
- Sobald gewünschte Gerät in der Liste erscheint (in diesem Fall Logitech, Inc. 960 Headset) ist die Verbindung korrekt aufgebaut
- Das Gerät sollte jetzt im Audio-Mixer der Linux Desktop-Umgebung auffindbar sein