-
-
Save cretudorin/23ae354f41cc89f641d674b9948d66c5 to your computer and use it in GitHub Desktop.
| No longer maintained, moved to: | |
| https://github.com/cretudorin/SteamdeckDisplayLink |
@trey-a-12 well, you will have to run the script after every steamOs update. AFAIK they push full os images and reenable read only every time
Yes, that much is known, I was just clarifying that it truly does not persist even after minor ZZ (assuming X.Y.ZZ) updates, but that it does let you set it right back up in under 2 minutes! Thanks again!
Created a git repo for it
after the September update. it does not work again.
Loaded your script on another AI and tried to make it work again:
Root cause:
EVDI 1.14.10 was registered with DKMS but could not compile against the SteamOS 6.18.50 kernel.
Because evdi.ko was never installed, displaylink.service failed at ExecStartPre=/sbin/modprobe evdi.
evdi-dkms provides the required EVDI module and supports the 6.18 kernel series.
A stale unowned /usr/lib/libevdi.so.1 can also stop the package transaction, so the script now preserves it before installation.
The service is started only after modprobe evdi succeeds.
#!/usr/bin/env bash
set -Eeuo pipefail
echo "=== DisplayLink on SteamOS / Neptune Setup ==="
echo
# Verify we're running on SteamOS
if ! command -v steamos-readonly >/dev/null 2>&1; then
echo "This does not appear to be SteamOS."
exit 1
fi
echo "WARNING: This script will disable SteamOS read-only mode."
echo "This modifies the base operating system and may be overwritten by SteamOS updates."
echo
read -r -p "Type Y to continue: " CONFIRM </dev/tty
if [ "$CONFIRM" != "Y" ]; then
echo "Aborted."
exit 0
fi
echo "=== Disabling SteamOS read-only mode ==="
sudo steamos-readonly disable
echo "=== Initializing pacman keys ==="
sudo pacman-key --init
sudo pacman-key --populate archlinux
sudo pacman-key --populate holo
echo "=== Updating package database ==="
sudo pacman -Sy --noconfirm
echo "=== Installing Plymouth ==="
sudo pacman -S --needed --noconfirm plymouth
echo "=== Discovering current linux-neptune kernel ==="
KERNEL_RELEASE="$(uname -r)"
KERNEL_VARIANT="$(sed -n 's/.*-neptune-\([0-9][0-9]*\)-.*/\1/p' <<< "$KERNEL_RELEASE")"
if [[ -z "$KERNEL_VARIANT" ]]; then
echo "Unable to determine the Neptune kernel variant from: $KERNEL_RELEASE"
exit 1
fi
KERNEL_PKG="linux-neptune-${KERNEL_VARIANT}"
echo "Running kernel: $KERNEL_RELEASE"
echo "Using kernel package: $KERNEL_PKG"
echo "=== Installing kernel and matching headers ==="
sudo pacman -S --needed --noconfirm \
"$KERNEL_PKG" \
"${KERNEL_PKG}-headers"
echo "=== Installing build dependencies ==="
sudo pacman -S --needed --noconfirm \
python \
python-setuptools \
linux-api-headers \
glibc \
pybind11 \
base-devel \
dkms \
libdrm \
libusb \
gawk \
grep \
git
WORKDIR="$(mktemp -d)"
trap 'rm -rf "$WORKDIR"' EXIT
# Preserve an unowned library left by an earlier DisplayLink installation.
EVDI_LIBRARY="/usr/lib/libevdi.so.1"
if [[ -e "$EVDI_LIBRARY" || -L "$EVDI_LIBRARY" ]]; then
if ! sudo pacman -Qo "$EVDI_LIBRARY" >/dev/null 2>&1; then
EVDI_BACKUP="${EVDI_LIBRARY}.displaylink-backup.$(date +%Y%m%d%H%M%S)"
echo "Preserving unowned EVDI library as: $EVDI_BACKUP"
sudo mv "$EVDI_LIBRARY" "$EVDI_BACKUP"
fi
fi
echo "=== Building and installing EVDI DKMS ==="
cd "$WORKDIR"
# evdi-dkms provides the evdi dependency and supports Linux kernel 6.18.
git clone https://aur.archlinux.org/evdi-dkms.git
cd evdi-dkms
makepkg -si --noconfirm
echo "=== Building EVDI for the running kernel ==="
sudo dkms autoinstall -k "$KERNEL_RELEASE"
sudo depmod -a "$KERNEL_RELEASE"
if ! sudo modprobe evdi; then
echo "EVDI failed to load. Recent DKMS build output:"
sudo find /var/lib/dkms/evdi -name make.log -print -exec tail -n 100 {} \; || true
exit 1
fi
if ! lsmod | grep -q '^evdi'; then
echo "EVDI did not appear in the loaded kernel modules."
exit 1
fi
echo "=== Building and installing DisplayLink ==="
cd "$WORKDIR"
sudo rm -rf /opt/displaylink
git clone https://aur.archlinux.org/displaylink.git
cd displaylink
makepkg -si --noconfirm
echo "=== Enabling DisplayLink service ==="
sudo systemctl enable --now displaylink.service
if ! systemctl is-active --quiet displaylink.service; then
systemctl status displaylink.service --no-pager -l || true
exit 1
fi
echo
echo "=== Installation complete ==="
echo "EVDI is loaded and the DisplayLink service is active."
echo "A reboot is recommended."
echo
dkms status | grep evdi || true
script above solved it for me. .
This script is no longer maintained, moved to
https://github.com/cretudorin/SteamdeckDisplayLink
@gordonhimoura updated main repo based on your script, I hope that's ok with you.
Thanks
@cretudorin by all means yes. I don't know how this (github) works but I would suggest a documentation what script works for specific kernels. The one that I happy shared is for SteamOS 6.18.50 kernel. Great work here. I hope you continue to look into this. I will always share if I fix things until my steamdeck dies.
Steam Deck DisplayLink Environment Fix
A comprehensive troubleshooting guide and one-line setup solution for enabling DisplayLink docks (such as the Dell Universal Dock D6000) on modern SteamOS installations.
Tested System Environment
- Operating System: SteamOS 3.9.5 (Holo) [Build 20261023.100]
- Kernel Version:
7.2.7-valve2-2-neptune-72-g31504582a073 - Target Hardware: Steam Deck (LCD/OLED) + DisplayLink Video Hubs
What Broke (The Environmental Root Cause)
To optimize local storage performance, Valve designs SteamOS by stripping out standard developer tracking headers, runtime layouts, and compilation definitions from the default image.
When attempting to build the evdi display driver module and its Python bindings (pyevdi) on this kernel environment, the compilation process crashes due to missing architectural dependencies:
fatal error: stdint.h: No such file or directory(Core C compilation toolchain missing)Package libdrm was not found in the pkg-config search path(Stripped display runtime development paths)fatal error: Python.h: No such file or directory(Missing Python C++ binding layouts)
The Fix
This workaround bypasses SteamOS package-tracking placeholder flags, manually forces the re-population of complete development components via pacman, and streams the deployment utility without triggering standard keyboard/input terminal crashes.
One-Line Combined Installation Script
Copy and paste this exact command block into your Konsole while in Desktop Mode. The layout runs dependencies safely in order, and the terminal window remains open so you can audit the complete installation status:
sudo pacman -Syy && \
sudo pacman -S --needed --noconfirm glibc base-devel linux-api-headers && \
sudo pacman -S --overwrite "*" linux-api-headers glibc libdrm python --noconfirm && \
rm -rf evdi-dkms/ displaylink/ && \
curl -fsSL https://raw.githubusercontent.com/cretudorin/SteamdeckDisplayLink/refs/heads/main/DisplayLink.sh | bash && \
read -p "Press Enter to exit..."Important Maintenance Notes
- SteamOS Updates: Major system updates pushed by Valve will re-lock your file system and clear out non-standard driver layers. Keep this script handy to re-apply your build parameters if your monitors drop signal after an update.
Update 2026-07-04: I had to reapply the script, but it worked instantly (not even a reboot was needed this time)! You've really done it!
System details: