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

12 KiB

Hier ist ein umfassendes Shell-Skript für die Installation von DisplayLink-Treibern unter Linux:

#!/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:

#!/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:

# 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:
sudo bash displaylink-install.sh
  1. Nach der Installation System neu starten

  2. Bei Problemen Troubleshooting ausführen:

displaylink-troubleshoot

Das Skript automatisiert die komplette Installation und behebt die häufigsten Probleme mit DisplayLink-Treibern unter verschiedenen Linux-Distributionen.