Veröffentlicht am 2. Januar 2026 von Dominic Böttger (vor 3 Monaten) · 3 Min. Lesezeit
Wenn man ein Surface Pro mit dem linux-surface Kernel betreibt, funktioniert Touch einwandfrei – bis man den Suspend-Modus nutzt. Nach dem Aufwachen reagiert der Touchscreen nicht mehr. Das ipts Kernelmodul gerät in einen fehlerhaften Zustand, wenn die Intel MEI Firmware in den Suspend geht, während das Modul noch geladen ist.
Die Lösung besteht darin, das Modul vor dem Suspend zu entladen und nach dem Aufwachen wieder zu laden – mithilfe von systemd Sleep-Hooks.
Über das Linux-Surface-Projekt
Das linux-surface-Projekt ist eine Community-Initiative, die gepatchte Kernel und Treiber bereitstellt, um Linux auf Microsoft Surface-Geräten zu ermöglichen. Dem Standard-Linux-Kernel fehlen viele Surface-spezifische Treiber, weshalb der linux-surface Kernel für eine ordnungsgemäße Hardware-Unterstützung unerlässlich ist – einschließlich Touchscreen, Stifteingabe, Kameras und Energieverwaltung.
Den Linux-Surface-Kernel unter Ubuntu installieren
Stelle vor der Installation sicher, dass du die Surface-Firmware zuerst über Windows aktualisiert hast.
# Import the signing keys
wget -qO - https://raw.githubusercontent.com/linux-surface/linux-surface/master/pkg/keys/surface.asc \
| gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/linux-surface.gpg > /dev/null
# Add the repository
echo "deb [arch=amd64] https://pkg.surfacelinux.com/debian release main" \
| sudo tee /etc/apt/sources.list.d/linux-surface.list
# Install the kernel and dependencies
sudo apt update
sudo apt install linux-image-surface linux-headers-surface iptsd libwacom-surface
Secure Boot Konfiguration
Surface-Geräte haben Secure Boot standardmäßig aktiviert. Um den linux-surface Kernel zu booten, musst du den linux-surface Signaturschlüssel in der MOK-Datenbank (Machine Owner Key) deines Systems registrieren:
# Install the secure boot key package
sudo apt install linux-surface-secureboot-mok
Starte dein Surface nach der Installation neu. Beim Booten erscheint automatisch der MOK Manager. Folge diesen Schritten:
- Wähle „Enroll MOK”
- Wähle „Continue”
- Wähle „Yes”, um den Schlüssel zu registrieren
- Gib das Passwort ein, das du bei der Installation festgelegt hast (Standard ist meist leer, drücke einfach Enter)
- Wähle „Reboot”
Überprüfe nach dem Neustart mit uname -r, dass du den Surface-Kernel verwendest (es sollte etwas wie 6.x.x-surface angezeigt werden).
Für vollständige Installationsanweisungen und gerätespezifische Besonderheiten besuche das linux-surface Wiki.
Das Touch-Problem nach Suspend
Mit dem installierten linux-surface Kernel funktioniert der Touchscreen einwandfrei – bis zum Suspend. Nach dem Aufwachen reagiert der Touchscreen nicht mehr. Dies geschieht, weil das ipts Kernelmodul in einen fehlerhaften Zustand gerät, wenn die Intel MEI Firmware in den Suspend geht, während das Modul noch geladen ist.
Erforderliche Komponenten
- Sleep-Hook – Behandelt das Entladen/Neuladen des Moduls rund um den Suspend
- Neustart-Skript – Manuelle Touch-Wiederherstellung
- Watchdog-Service – Automatische Wiederherstellung für den Headless-Betrieb
Sleep-Hook-Konfiguration
Erstelle den systemd Sleep-Hook unter /usr/lib/systemd/system-sleep/surface-touch:
#!/bin/bash
# /usr/lib/systemd/system-sleep/surface-touch
LOG_TAG="surface-touch-sleep"
log() { logger -t "$LOG_TAG" "$1"; }
case "$1" in
pre)
log "PRE-SUSPEND: Stopping touch services"
systemctl stop iptsd@*.service 2>/dev/null
pkill -9 iptsd 2>/dev/null
sleep 1
log "PRE-SUSPEND: Unloading ipts module"
modprobe -r ipts 2>/dev/null
;;
post)
log "POST-RESUME: Reloading ipts module"
modprobe ipts 2>/dev/null
sleep 8
if systemctl is-active --quiet iptsd@*.service 2>/dev/null; then
log "POST-RESUME: Touch restored automatically"
fi
;;
esac
Mach ihn ausführbar:
sudo chmod +x /usr/lib/systemd/system-sleep/surface-touch
Neustart-Skript
Erstelle /usr/local/bin/surface-touch-restart für die manuelle Wiederherstellung:
#!/bin/bash
LOG_TAG="surface-touch"
log() { logger -t "$LOG_TAG" "$1"; }
log "=== Surface Touch Restart ==="
pkill -9 iptsd 2>/dev/null
systemctl reset-failed iptsd@*.service 2>/dev/null
sleep 1
log "Loading ipts module"
modprobe ipts 2>/dev/null
sleep 8
for i in {1..10}; do
if systemctl is-active --quiet iptsd@*.service 2>/dev/null; then
log "Touch restored successfully"
exit 0
fi
sleep 1
done
Installation
sudo chmod +x /usr/local/bin/surface-touch-restart
sudo systemctl daemon-reload
Getestet auf Surface Pro 6, Ubuntu 24.04, linux-surface Kernel 6.18.2-surface-1, iptsd 3.1.0
Geschrieben von Dominic Böttger
← Zurück zum Blog