6.6 KiB
Niri + 4-Monitor Intel (DP) Migration Notes (Ubuntu 24.04+ → NixOS)
OWNER / CONTEXT
- User: sam (IT)
- Goal: Move to NixOS and daily-drive Niri on a 4-monitor setup.
- Priority: Reliability and broad tool compatibility over “polish”.
- Testing style: often SSH in from another machine because local display can go black during compositor/DM experiments.
REMOTE REQUIREMENT (clarified)
- SSH is sufficient even when nobody is logged in locally (sshd runs pre-login).
- Remote GUI login is optional/rare. Do not design around RustDesk-at-greeter on Wayland.
- If remote GUI login is ever needed later, consider adding GNOME+GDM+RDP as a separate capability; keep Niri as main local session.
HARDWARE SUMMARY
- GPU: Intel iGPU (exact model TBD)
- Outputs: 4x DisplayPort to 4x HP LA2205 monitors
- DRM nodes observed on Ubuntu (node numbering may differ on NixOS):
- Primary KMS card for the 4 DP outputs: /dev/dri/card2
- Render node: /dev/dri/renderD129
- Notes: There may be multiple /dev/dri/card* devices. Session must pick the correct device driving the 4 DP outputs.
NOTE (2026-01 recon):
- Current Ubuntu hardware scan shows NVIDIA Quadro P620 is driving /dev/fb0 at 1680x1050.
- This suggests the monitors may actually be attached to the Quadro, not the Intel outputs.
- Before finalizing GPU/device selection, verify:
- ls -l /dev/dri/by-path
- loginctl seat-status seat0
- (optional) niri output listing once in session
KNOWN KERNEL / PLATFORM ISSUES
- IOMMU faults / “Operation not permitted” style crashes were avoided on Ubuntu
with kernel flags:
- intel_iommu=off
- dev_mem_signed_off=1
- These flags may or may not be needed on NixOS; keep them as a known-good baseline and only remove once stable.
UBUNTU WORKING STATE (IMPORTANT BEHAVIORAL FINDINGS)
-
GDM “gear icon” / Wayland sessions
- GDM did not show Wayland sessions until Wayland was enabled.
- /etc/gdm3/custom.conf had WaylandEnable=false. Commenting it out fixed session availability after restarting GDM.
-
.desktop Exec path issue
- Session .desktop pointing Exec to /home/sam/start-niri.sh caused GDM issues.
- Home perms were drwxr-x--- (750), so greeter user couldn’t traverse /home reliably.
- Fix: Exec must point to a system path (/usr/bin or /usr/local/bin), not /home.
-
niri-session issue (major root cause of login loop)
- /usr/bin/niri-session existed but session immediately returned to login.
- Logs showed: Failed to start niri.service: Unit niri.service not found. Failed to start niri-shutdown.target: Unit niri-shutdown.target not found.
- Therefore niri-session was not usable as packaged (missing systemd user units).
-
FINAL WORKING FIX ON UBUNTU (proven)
- /usr/share/wayland-sessions/niri.desktop set to start Niri directly: Exec=/usr/bin/niri --session
- This bypassed niri-session and made Niri start successfully from GDM.
SESSION START METHOD (proven)
- Known working from a display manager: Exec =
niri --session - Avoid relying on
niri-sessionunless NixOS packaging provides the required systemd user units (niri.service, niri-shutdown.target).
PERMISSIONS / SECURITY WORKAROUNDS USED DURING TESTING
- User group membership on Ubuntu: video, render, seat
- Custom udev rules were created to chmod 666 DRM nodes.
- Result: /dev/dri/card2 and /dev/dri/renderD129 became world-writable.
- This is NOT desired long term; prefer logind seat ACLs.
- On NixOS, aim to avoid chmod 666 rules unless absolutely needed for debugging.
NIRI CONFIG NOTES
- Config validated successfully on Ubuntu: ~/.config/niri/config.kdl
- Xwayland started via config:
- spawn-at-startup "Xwayland" ":" "1"
- Avoid exporting XDG_RUNTIME_DIR manually; let pam/systemd-logind manage it.
- If needed to force GPU device, Niri supports choosing a render DRM device (exact config syntax/version dependent). On Ubuntu, correct render node was renderD129.
NIXOS TARGET STATE (WHAT WE WANT)
- Boot to a login method that reliably starts Niri on the Intel GPU with 4 monitors.
- Must keep a working fallback (at minimum TTY + SSH; optionally a full DE).
- Remote recovery/admin always possible via SSH.
LOGIN / DISPLAY MANAGER STRATEGY OPTIONS (pick one) Option A: greetd + tuigreet (recommended for Niri-first reliability)
- Minimal moving parts, compositor-agnostic.
- Start the session with:
niri --session. - Ideal when “polish doesn’t matter” and reliability does.
Option B: GDM (works; proven on Ubuntu)
- Ensure Wayland sessions enabled.
- Ensure session Exec is not in /home.
- If
niri-sessionis incomplete, startniri --sessiondirectly.
DISPLAY MANAGER DECISION NOTE
- If SSH-only remote is the requirement: prefer greetd for simplicity.
- If remote graphical login is ever required: consider GDM + GNOME RDP later as a separate capability. (Not required now.)
SCREENSHARE / PORTALS REQUIREMENTS (broad tool compatibility)
- Enable PipeWire + WirePlumber.
- Ensure xdg-desktop-portal is installed and functional in the user session.
- Choose a portal backend compatible with Niri (often portal-gnome and/or portal gtk; exact best choice may be NixOS-specific).
- If screencast/screen-share fails in apps: check portal backend selection, permissions prompts, and PipeWire.
GPU/DRM PERMISSIONS
- Avoid global chmod 666 udev rules in final config.
- Use logind seat/ACLs; add user to video/render groups if needed.
- When debugging device selection:
- ls -l /dev/dri /dev/dri/by-path
- loginctl seat-status seat0
FALLBACK PLAN
- Minimum: TTY + SSH access always available.
- Optional: install a full fallback DE only if needed (GNOME or Plasma).
- Not required for Niri; just a safety net.
DEBUG / TROUBLESHOOTING CHECKLIST (capture these on failure)
- niri config:
- niri validate
- user session logs:
- journalctl --user -b -l --no-pager | tail -n 300
- kernel DRM messages:
- journalctl -b -k -l --no-pager | grep -iE "drm|i915|kms|atomic|permission" | tail
- device inventory:
- ls -l /dev/dri /dev/dri/by-path
- session type:
- echo $XDG_SESSION_TYPE
- loginctl session-status
ACCEPTANCE CRITERIA (DONE WHEN)
- Niri starts reliably after reboot from the chosen DM
- All 4 monitors are active consistently
- Screen sharing works in at least one browser-based app and one native app
- SSH recovery works even if local display is broken
- No chmod 666 DRM hacks required in the final config (preferred)
OPEN QUESTIONS FOR NIXOS MIGRATION
- Exact Intel GPU model + correct DRM node mapping on NixOS (may differ)
- Whether the kernel flags are still required on NixOS
- Whether NixOS niri packaging includes full systemd integration units (niri.service, niri-shutdown.target)
- Best portal backend combo for Niri screencast on NixOS