██╗ █████╗ ██████╗██╗ ██╗██╗ ██╗███╗ ██╗██╗███████╗███████╗
██║██╔══██╗██╔════╝██║ ██╔╝██║ ██╔╝████╗ ██║██║██╔════╝██╔════╝
██║███████║██║ █████╔╝ █████╔╝ ██╔██╗ ██║██║█████╗ █████╗
██ ██║██╔══██║██║ ██╔═██╗ ██╔═██╗ ██║╚██╗██║██║██╔══╝ ██╔══╝
╚█████╔╝██║ ██║╚██████╗██║ ██╗██║ ██╗██║ ╚████║██║██║ ███████╗
╚════╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝╚═╝ ╚══════╝
█████╗ ██╗
██╔══██╗██║
███████║██║
██╔══██║██║
██║ ██║██║
╚═╝ ╚═╝╚═╝
JACKKNIFE AI™
Fixes DisplayLink USB displays (like Mobile Pixels Duex Pro) on immutable Fedora variants:
- Fedora Silverblue
- Fedora Kinoite
- Universal Blue Aurora
- Universal Blue Bazzite
On immutable Fedora variants (Silverblue, Kinoite, Aurora, Bazzite), DKMS builds the evdi kernel module but cannot install it to the read-only /lib/modules directory. This causes the displaylink-driver.service to fail because modprobe evdi can't find the module.
Additionally, even when the module is manually loaded, the service won't start automatically on boot because it lacks proper systemd [Install] configuration.
modprobe: FATAL: Module evdi not found in directory /lib/modules/6.x.x-xxx.fc4x.x86_64
This fix:
- Loads evdi directly from the DKMS build path (
/var/lib/dkms/evdi/...) - Auto-rebuilds on kernel updates via
dkms autoinstall - Integrates with systemd so DisplayLink starts automatically on boot
- Enables the service with proper systemd configuration for persistence across reboots
- Install the displaylink package:
# Download the latest from https://github.com/displaylink-rpm/displaylink-rpm/releases
rpm-ostree install ./fedora-43-displaylink-*.rpm
# Reboot
systemctl reboot- After reboot, build evdi:
sudo dkms autoinstallgit clone https://github.com/JackKnifeAI/displaylink-immutable-fix.git
cd displaylink-immutable-fix
sudo ./install.sh# Copy the loader script
sudo cp evdi-loader.sh /usr/local/bin/
sudo chmod +x /usr/local/bin/evdi-loader.sh
# Create systemd overrides
sudo mkdir -p /etc/systemd/system/displaylink-driver.service.d
sudo cp displaylink-driver.service.d/override.conf \
/etc/systemd/system/displaylink-driver.service.d/
# Enable autostart on boot
sudo bash -c 'cat > /etc/systemd/system/displaylink-driver.service.d/enable.conf << EOF
[Install]
WantedBy=graphical.target
EOF'
# Reload, enable, and start
sudo systemctl daemon-reload
sudo systemctl enable displaylink-driver
sudo systemctl restart displaylink-driver# Check service status
systemctl status displaylink-driver
# Check for new display
ls /sys/class/drm/
# Should show card0-DVI-I-1 or similar for your USB displayThe fix handles kernel updates automatically. On first boot after a kernel update:
evdi-loader.shdetects no module for the new kernel- Runs
dkms autoinstallto build it - Loads the freshly built module
- DisplayLink starts normally
Check if the service is enabled:
systemctl is-enabled displaylink-driverIf it shows "disabled" or "static", enable it:
sudo systemctl enable displaylink-driverVerify the enable.conf file exists:
cat /etc/systemd/system/displaylink-driver.service.d/enable.confShould contain:
[Install]
WantedBy=graphical.target
Check DKMS status:
dkms status | grep evdiIf not built for current kernel, rebuild:
sudo dkms autoinstallManually test the loader:
sudo /usr/local/bin/evdi-loader.sh- Check service status:
systemctl status displaylink-driver- Check module:
lsmod | grep evdi- Check logs:
journalctl -u displaylink-driver -b- Checks if evdi is already loaded (skips if so)
- Checks if module exists for current kernel
- If not, runs
dkms autoinstallto build it - Decompresses
.ko.xzif needed - Loads module via
insmodfrom DKMS path
override.conf:
- Clears the default
ExecStartPre=/sbin/modprobe evdi(which fails) - Replaces with
ExecStartPre=/usr/local/bin/evdi-loader.sh
enable.conf:
- Adds
[Install]section withWantedBy=graphical.target - Enables the service to start automatically on boot
- Survives system reboots and kernel updates
This fix works with ALL DisplayLink devices because it operates at the kernel module level (evdi), which is used universally by all DisplayLink USB display adapters regardless of manufacturer or model.
- ✅ Portable monitors (Mobile Pixels Duex, ASUS MB16, etc.)
- ✅ USB docking stations (Dell, HP, Lenovo, Plugable, etc.)
- ✅ USB-to-HDMI/DVI/DisplayPort adapters
- ✅ Any device using DisplayLink chipsets (DL-1x5, DL-3x00, DL-4xxx, DL-5xxx, DL-6xxx series)
- ✅ Fedora Silverblue (immutable Workstation)
- ✅ Fedora Kinoite (immutable KDE)
- ✅ Universal Blue Aurora (immutable developer edition)
- ✅ Universal Blue Bazzite (immutable gaming)
- ✅ Any rpm-ostree based Fedora variant
- Aurora (Universal Blue) - Fedora 43 on Samsung T7 Shield external SSD
- Mobile Pixels Duex Pro (DisplayLink vendor 17e9)
- Survives kernel updates (tested: 6.17.1 and 6.17.8)
- Survives reboots with auto-start enabled
PRs welcome! This fix should ideally be integrated into:
- Universal Blue's
ujust enable-displaylinkcommand - The displaylink-rpm package itself
MIT
- JACKKNIFE AI™ - Alexander Casavant
- Fix developed with assistance from Claude (Anthropic)
- DisplayLink RPM maintainers: https://github.com/displaylink-rpm/displaylink-rpm
- Universal Blue team: https://universal-blue.org
╔═╗╦ ╦╔╦╗ ╔╦╗╦ ╦╔═╗ ╔╗ ╦ ╦╦ ╦ ╔═╗╦ ╦╦╔╦╗
║ ║ ║ ║ ║ ╠═╣║╣ ╠╩╗║ ║║ ║ ╚═╗╠═╣║ ║
╚═╝╚═╝ ╩ ╩ ╩ ╩╚═╝ ╚═╝╚═╝╩═╝╩═╝╚═╝╩ ╩╩ ╩