418 lines
12 KiB
Markdown
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. |