Files
it-know-how/Linux/Displaylink Installation.md
T

418 lines
12 KiB
Markdown

Hier ist ein umfassendes Shell-Skript für die Installation von DisplayLink-Treibern unter Linux:
```bash
#!/bin/bash
# DisplayLink Driver Installation Script for Linux
# Author: Assistant
# Version: 1.0
# Date: $(date +%Y-%m-%d)
set -e
# Farben für Output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Logging
LOG_FILE="/var/log/displaylink-install.log"
exec > >(tee -a "$LOG_FILE")
exec 2>&1
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} DisplayLink Driver Installation Script${NC}"
echo -e "${BLUE}========================================${NC}"
# Funktionen
log() {
echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1${NC}"
}
warn() {
echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}"
}
error() {
echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}"
}
check_root() {
if [[ $EUID -ne 0 ]]; then
error "Dieses Skript muss als root ausgeführt werden!"
exit 1
fi
}
detect_distro() {
if [ -f /etc/os-release ]; then
. /etc/os-release
DISTRO=$ID
VERSION=$VERSION_ID
log "Distribution erkannt: $PRETTY_NAME"
else
error "Distribution konnte nicht erkannt werden"
exit 1
fi
}
install_dependencies() {
log "Installiere benötigte Abhängigkeiten..."
case $DISTRO in
ubuntu|debian)
apt update
apt install -y wget curl unzip dkms build-essential \
linux-headers-$(uname -r) git libdrm-dev \
x11-xserver-utils mesa-utils
;;
fedora|centos|rhel)
if command -v dnf &> /dev/null; then
dnf install -y wget curl unzip dkms gcc make \
kernel-devel-$(uname -r) git libdrm-devel \
xrandr mesa-utils
else
yum install -y wget curl unzip dkms gcc make \
kernel-devel-$(uname -r) git libdrm-devel \
xrandr mesa-utils
fi
;;
opensuse*)
zypper install -y wget curl unzip dkms gcc make \
kernel-default-devel git libdrm-devel \
xrandr Mesa-utils
;;
arch|manjaro)
pacman -Sy --noconfirm wget curl unzip dkms base-devel \
linux-headers git libdrm xorg-xrandr mesa-utils
;;
*)
warn "Unbekannte Distribution. Versuche generische Installation..."
;;
esac
}
download_displaylink_driver() {
log "Lade neueste DisplayLink-Treiber herunter..."
# Erstelle temporäres Verzeichnis
TEMP_DIR=$(mktemp -d)
cd "$TEMP_DIR"
# DisplayLink Download URL (Ubuntu 22.04 kompatibel)
DRIVER_VERSION="5.8.0-63.33"
DRIVER_URL="https://www.synaptics.com/sites/default/files/Ubuntu/pool/stable/main/all/synaptics-repository-keyring.deb"
# Alternative: Verwende evdi Repository
log "Installiere EVDI (Extensible Virtual Display Interface)..."
git clone https://github.com/DisplayLink/evdi.git
cd evdi
make && make install
cd ..
# Offizieller DisplayLink Treiber Download
OFFICIAL_URL="https://www.synaptics.com/sites/default/files/Ubuntu/pool/stable/main/all/"
# Neueste verfügbare Version ermitteln
log "Ermittle neueste verfügbare Treiberversion..."
# Fallback: Direkte Installation über Repository
case $DISTRO in
ubuntu|debian)
# Füge DisplayLink Repository hinzu
wget -O - https://www.synaptics.com/sites/default/files/Ubuntu/displaylink-debian-ubuntu-signing-key.pub | apt-key add -
echo "deb https://www.synaptics.com/sites/default/files/Ubuntu/ $(lsb_release -cs) stable" > /etc/apt/sources.list.d/displaylink.list
apt update
apt install -y displaylink-driver
;;
*)
# Manuelle Installation für andere Distributionen
DRIVER_FILE="displaylink-driver-5.8.0-63.33.zip"
log "Lade $DRIVER_FILE herunter..."
# Beispiel-Download (URL muss aktualisiert werden)
if ! wget -q --spider "https://www.displaylink.com/downloads/file?id=1768"; then
warn "Automatischer Download fehlgeschlagen. Manuelle Installation erforderlich."
log "Bitte laden Sie den neuesten Treiber von https://www.displaylink.com/downloads/ubuntu herunter"
return 1
fi
;;
esac
}
install_displaylink_driver() {
log "Installiere DisplayLink-Treiber..."
# Stoppe potentiell laufende Services
systemctl stop dlm.service 2>/dev/null || true
systemctl stop displaylink-driver.service 2>/dev/null || true
case $DISTRO in
ubuntu|debian)
# Bereits über Repository installiert
log "Treiber über Repository installiert"
;;
*)
# Manuelle Installation
if [ -f "displaylink-driver-*.run" ] || [ -f "DisplayLink*.run" ]; then
chmod +x DisplayLink*.run 2>/dev/null || chmod +x displaylink-driver-*.run
./DisplayLink*.run --noexec --target displaylink-driver 2>/dev/null || ./displaylink-driver-*.run --noexec --target displaylink-driver
cd displaylink-driver
./displaylink-installer.sh install
fi
;;
esac
# EVDI Modul laden
modprobe evdi || warn "EVDI Modul konnte nicht geladen werden"
}
configure_services() {
log "Konfiguriere SystemD Services..."
# DisplayLink Service aktivieren
systemctl enable dlm.service 2>/dev/null || systemctl enable displaylink-driver.service 2>/dev/null || true
# Erstelle Custom Service falls nötig
if [ ! -f "/etc/systemd/system/displaylink.service" ]; then
cat > /etc/systemd/system/displaylink.service << EOF
[Unit]
Description=DisplayLink Manager Service
After=display-manager.service
[Service]
Type=forking
ExecStartPre=/sbin/modprobe evdi
ExecStart=/opt/displaylink/DisplayLinkManager
ExecStop=/opt/displaylink/DisplayLinkManager --stop
Restart=always
RestartSec=5
[Install]
WantedBy=graphical.target
EOF
systemctl daemon-reload
systemctl enable displaylink.service
fi
}
fix_common_issues() {
log "Behebe bekannte Probleme..."
# Problem 1: EVDI Modul beim Boot laden
if ! grep -q "evdi" /etc/modules; then
echo "evdi" >> /etc/modules
log "EVDI zu /etc/modules hinzugefügt"
fi
# Problem 2: Xorg Konfiguration
mkdir -p /etc/X11/xorg.conf.d/
cat > /etc/X11/xorg.conf.d/20-displaylink.conf << EOF
Section "OutputClass"
Identifier "DisplayLink"
MatchDriver "evdi"
Driver "modesetting"
Option "AccelMethod" "none"
EndSection
EOF
# Problem 3: Udev Regeln
cat > /etc/udev/rules.d/99-displaylink.rules << EOF
# DisplayLink USB devices
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="17e9", TAG+="systemd", ENV{SYSTEMD_WANTS}="displaylink.service"
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="17e9", ATTR{idProduct}=="*", RUN+="/bin/systemctl start displaylink.service"
EOF
udevadm control --reload-rules
# Problem 4: Permissions
usermod -a -G plugdev $SUDO_USER 2>/dev/null || true
# Problem 5: Wayland Kompatibilität (für GNOME)
if [ "$XDG_SESSION_TYPE" = "wayland" ]; then
warn "Wayland erkannt. DisplayLink funktioniert besser mit X11."
log "Erstelle GDM Custom Config für X11..."
mkdir -p /etc/gdm3
cat > /etc/gdm3/custom.conf << EOF
[daemon]
WaylandEnable=false
DefaultSession=gnome-xorg
EOF
fi
}
check_installation() {
log "Überprüfe Installation..."
# Service Status
if systemctl is-active --quiet dlm.service || systemctl is-active --quiet displaylink-driver.service || systemctl is-active --quiet displaylink.service; then
log "DisplayLink Service läuft erfolgreich"
else
warn "DisplayLink Service läuft nicht. Starte Service..."
systemctl start displaylink.service 2>/dev/null || systemctl start dlm.service 2>/dev/null || true
fi
# Modul Status
if lsmod | grep -q evdi; then
log "EVDI Kernel Modul erfolgreich geladen"
else
warn "EVDI Kernel Modul nicht geladen. Versuche manuelles Laden..."
modprobe evdi || error "EVDI Modul konnte nicht geladen werden"
fi
# USB Geräte check
if lsusb | grep -i displaylink; then
log "DisplayLink USB-Gerät erkannt"
else
warn "Kein DisplayLink USB-Gerät erkannt. Schließen Sie ein Gerät an."
fi
}
create_troubleshooting_script() {
log "Erstelle Troubleshooting-Skript..."
cat > /usr/local/bin/displaylink-troubleshoot << 'EOF'
#!/bin/bash
echo "=== DisplayLink Troubleshooting ==="
echo ""
echo "1. Service Status:"
systemctl status displaylink.service dlm.service displaylink-driver.service 2>/dev/null || echo "Services nicht gefunden"
echo ""
echo "2. Kernel Module:"
lsmod | grep evdi || echo "EVDI Modul nicht geladen"
echo ""
echo "3. USB Devices:"
lsusb | grep -i displaylink || echo "Keine DisplayLink Geräte gefunden"
echo ""
echo "4. Displays:"
xrandr --listproviders 2>/dev/null || echo "Xrandr nicht verfügbar"
echo ""
echo "5. Logs:"
journalctl -u displaylink.service --no-pager -n 10 2>/dev/null || echo "Keine Service Logs"
echo ""
echo "=== Schnelle Fixes ==="
echo "Service neu starten:"
echo " sudo systemctl restart displaylink.service"
echo ""
echo "Modul neu laden:"
echo " sudo modprobe -r evdi && sudo modprobe evdi"
echo ""
echo "Display erkennung:"
echo " xrandr --setprovideroutputsource 1 0 && xrandr --auto"
EOF
chmod +x /usr/local/bin/displaylink-troubleshoot
log "Troubleshooting-Skript erstellt: /usr/local/bin/displaylink-troubleshoot"
}
cleanup() {
log "Räume temporäre Dateien auf..."
cd /
rm -rf "$TEMP_DIR" 2>/dev/null || true
}
main() {
log "Starte DisplayLink Installation..."
check_root
detect_distro
install_dependencies
download_displaylink_driver
install_displaylink_driver
configure_services
fix_common_issues
check_installation
create_troubleshooting_script
cleanup
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN} Installation abgeschlossen!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
log "Installation erfolgreich abgeschlossen!"
log "Bitte starten Sie das System neu für beste Ergebnisse."
log "Bei Problemen verwenden Sie: displaylink-troubleshoot"
echo ""
echo -e "${YELLOW}Nächste Schritte:${NC}"
echo "1. System neu starten"
echo "2. DisplayLink Gerät anschließen"
echo "3. Monitor-Konfiguration mit: xrandr --auto"
echo "4. Bei Problemen: displaylink-troubleshoot ausführen"
}
# Trap für Cleanup
trap cleanup EXIT
# Hauptfunktion ausführen
main "$@"
```
## Zusätzliche Konfigurationsdateien
### 1. Desktop-Shortcut für schnelle Display-Konfiguration:
```bash
#!/bin/bash
# Erstelle Desktop-Shortcut
cat > ~/Desktop/configure-displays.desktop << EOF
[Desktop Entry]
Version=1.0
Type=Application
Name=Configure DisplayLink Displays
Comment=Configure external displays via DisplayLink
Exec=bash -c 'xrandr --setprovideroutputsource 1 0 && xrandr --auto && notify-send "Displays konfiguriert"'
Icon=preferences-desktop-display
Terminal=false
Categories=System;Settings;
EOF
chmod +x ~/Desktop/configure-displays.desktop
```
### 2. Automatische Display-Konfiguration bei USB-Anschluss:
```bash
# Udev-Regel für automatische Konfiguration
cat > /etc/udev/rules.d/99-displaylink-autoconfig.rules << EOF
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="17e9", RUN+="/usr/local/bin/displaylink-autoconfig.sh"
EOF
# Autoconfig-Skript
cat > /usr/local/bin/displaylink-autoconfig.sh << 'EOF'
#!/bin/bash
sleep 3
export DISPLAY=:0
xrandr --setprovideroutputsource 1 0
xrandr --auto
EOF
chmod +x /usr/local/bin/displaylink-autoconfig.sh
```
## Verwendung:
1. Skript als root ausführen:
```bash
sudo bash displaylink-install.sh
```
2. Nach der Installation System neu starten
3. Bei Problemen Troubleshooting ausführen:
```bash
displaylink-troubleshoot
```
Das Skript automatisiert die komplette Installation und behebt die häufigsten Probleme mit DisplayLink-Treibern unter verschiedenen Linux-Distributionen.