How to Set Up Emulators on Linux in 2026 — Ubuntu, Fedora, Arch (Complete Guide)
I have a Linux desktop (Ubuntu, Fedora, Arch, or similar distro) and want to run emulators natively — not Batocera, just normal emulators on my existing desktop. Which emulators work on Linux, what's the best install method (Flatpak vs AppImage vs package manager), and how do I get controllers working since they don't seem to be recognized?
Solutions
solution #1629
Why Linux Is Great for Emulation in 2026:
Linux is arguably the best OS for emulation: Flatpak gives you always-current emulator versions independent of your distro's package lag; Vulkan on Linux is consistently faster than on Windows for AMD GPUs (no DirectX translation overhead); and no Windows Defender quarantining your BIOS files mid-session. The main Linux-specific challenge is controller udev rules — Linux doesn't auto-trust game controller input the way Windows does. This guide covers that first because it blocks every emulator equally.
Step 1: Install Flatpak (if not already present):
Ubuntu / Debian / Mint:
- Run:
sudo apt install flatpak - Add Flathub:
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo - Restart your session after adding Flathub.
Fedora: Flatpak is pre-installed. Add Flathub if needed: flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
Arch: sudo pacman -S flatpak then add Flathub as above.
Step 2: Fix Controller Detection (Do This Before Installing Any Emulator):
Without the correct udev rules, your controller either won't be detected or won't have permission for rumble/force-feedback in any emulator.
- Install the joystick package:
sudo apt install joystick(Ubuntu/Debian) orsudo dnf install joystick(Fedora) orsudo pacman -S joystick(Arch). - Install the SDL gamepad database rules:
sudo cp /usr/share/games/joystick/gamecontrollerdb.txt /etc/udev/rules.d/ - Reload:
sudo udevadm control --reload-rules && sudo udevadm trigger
Xbox Bluetooth controllers specifically: install xpadneo for the best Linux Xbox Bluetooth driver:
sudo apt install dkmsgit clone https://github.com/atar-axis/xpadneo.git && cd xpadneo && sudo ./install.sh
PlayStation DualSense / DS4: These work natively on kernel 5.12+. If yours shows as "unknown gamepad," add a udev rule: echo 'KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="0ce6", MODE="0664", GROUP="input"' | sudo tee /etc/udev/rules.d/70-dualsense.rules then reload rules. Substitute 0ce6 with 05c4 for DS4.
Verify: Run jstest /dev/input/js0 and move your sticks — axis values should change. If nothing responds, reboot to apply udev rules.
Recommended Install Methods:
- Flatpak (Flathub): best for RetroArch, PCSX2, Dolphin, PPSSPP, mGBA, melonDS — always current, sandboxed, distro-agnostic
- AppImage: best for DuckStation and Eden — self-contained, no install, portable
- Distro package (apt/dnf/pacman): easy but often 6–12 months behind; avoid for emulators
solution #1630
RetroArch (Multi-system: SNES, GBA, NDS, PS1, N64, Sega):
- Install:
flatpak install flathub org.libretro.RetroArch - Run:
flatpak run org.libretro.RetroArch - First run: Online Updater → Core System Files Downloader — download core system files (also fixes the "Sys folder missing" error in Dolphin-within-RetroArch).
- Online Updater → Core Downloader — install needed cores:
bsnes-hd beta(SNES),mGBA(GBA),melonDS(NDS),Mednafen PSX(PS1),Mupen64Plus-Next(N64). - BIOS placement for the Flatpak build:
~/.var/app/org.libretro.RetroArch/config/retroarch/system/— NOT~/.config/retroarch/system/. Put PS1 BIOS files (scph5501.bin etc.), DC BIOS (dc_boot.bin + dc_flash.bin), NDS BIOS files here.
PCSX2 (PlayStation 2):
- Install:
flatpak install flathub net.pcsx2.PCSX2 - BIOS: place PS2 BIOS file (SCPH-77004.BIN or similar) at
~/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios/ - Settings → Graphics → Renderer → Vulkan. On AMD GPUs, Vulkan on Linux often outperforms the Windows equivalent.
- Enable Multithreaded VU (MTVU) for most games.
Dolphin (GameCube and Wii):
- Install:
flatpak install flathub org.DolphinEmu.dolphin-emu - GameCube adapter udev rule (official Nintendo GCN adapter):
echo 'SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="057e", ATTRS{idProduct}=="0337", TAG+="uaccess"' | sudo tee /etc/udev/rules.d/51-gcadapter.rulesthen reload and replug the adapter. - Real Wiimote passthrough works on Linux via native Bluetooth. Controllers → Wii Remotes → Real Wiimote → Enable passthrough. You may need:
sudo usermod -aG bluetooth $USERand relogin. - Shader caching: first launch of any game compiles shaders (normal). Subsequent launches are smooth — Mesa's shader cache persists across sessions on AMD/Intel.
PPSSPP (PSP):
- Install:
flatpak install flathub org.ppsspp.PPSSPP - Settings → Graphics → Backend → Vulkan — outperforms OpenGL on Linux for most PSP titles.
- No BIOS required — PPSSPP uses HLE. Point it at your PSP ISO/CSO files.
solution #1631
DuckStation (PlayStation 1) — AppImage:
- Download from duckstation.org → Linux → AppImage.
chmod +x duckstation-qt-x64.AppImage && ./duckstation-qt-x64.AppImage- Wayland note: DuckStation runs better on Wayland than XWayland. If you see visual tearing on GNOME/KDE with Wayland, add
SDL_VIDEODRIVER=waylandto your environment. - BIOS: Settings → BIOS → add your BIOS directory. DuckStation auto-detects region from filename.
Eden (Nintendo Switch) — AppImage:
- Download the official Linux AppImage from eden-emu.dev. (No official Flatpak as of mid-2026 — check the site for updates.)
chmod +x Eden-*.AppImage && ./Eden-*.AppImage- Keys + firmware location:
~/.local/share/eden/keys/prod.keysand firmware via Eden's Tools → Install Firmware. - Vulkan 1.1+ required. Check:
vulkaninfo | grep "Vulkan Instance Version". AMD Mesa on Ubuntu 22.04+ has Vulkan 1.3 — no extra steps. NVIDIA: ensure driver 470+.
Flatpak Sandbox Permissions (common fix):
Flatpak emulators are sandboxed and can't access your ROM folder until you grant it:
- Grant access:
flatpak override --user --filesystem=~/Emulation <flatpak-id> - Example:
flatpak override --user --filesystem=~/Emulation org.DolphinEmu.dolphin-emu
Recommended Directory Structure:
Linux paths are case-sensitive and absolute — keeping ROMs organized matters more than on Windows.
~/Emulation/roms/ps1/— .bin/.cue, .chd~/Emulation/roms/ps2/— .iso, .chd~/Emulation/roms/gamecube/— .iso, .rvz, .gcz~/Emulation/roms/switch/— .nsp, .xci~/Emulation/bios/— all BIOS files, flat structure~/Emulation/saves/— manual backups
Point each emulator at the relevant subfolder in its settings. Grant Flatpak sandbox access per emulator as above.
solution #1632
Optional: Gamescope for Better Fullscreen:
Gamescope (Valve's micro-compositor) gives better fullscreen behavior and optional FSR upscaling — useful for multi-monitor setups or if you want upscaling without configuring each emulator individually.
- Install:
sudo apt install gamescope(Ubuntu) orsudo pacman -S gamescope(Arch). - Example — run Dolphin at 1440p upscaled from 1080p:
gamescope -W 2560 -H 1440 -w 1920 -h 1080 --fsr -- flatpak run org.DolphinEmu.dolphin-emu
Quick Reference — Emulator Install Methods:
- RetroArch: Flatpak —
org.libretro.RetroArch - DuckStation: AppImage — duckstation.org
- PCSX2: Flatpak —
net.pcsx2.PCSX2 - Dolphin: Flatpak —
org.DolphinEmu.dolphin-emu - PPSSPP: Flatpak —
org.ppsspp.PPSSPP - Eden (Switch): AppImage — eden-emu.dev
- mGBA: Flatpak —
io.mgba.mGBA - melonDS: Flatpak —
net.kuribo64.melonDS - xemu (Xbox): Flatpak —
app.xemu.xemu - Flycast (Dreamcast): Flatpak —
com.flycast.Flycast
Common Issues:
- Controller not detected in any emulator: udev rules not applied — run
udevadm control --reload-rules && udevadm trigger, reboot if needed. - Flatpak emulator can't read ROM folder: sandbox blocks access — run
flatpak override --user --filesystem=~/Emulation <flatpak-id>. - BIOS not found in Flatpak RetroArch: sandboxed path is different — BIOS go to
~/.var/app/org.libretro.RetroArch/config/retroarch/system/not~/.config/retroarch/system/. - Eden shows black screen: Vulkan version too old — update Mesa (Ubuntu:
sudo add-apt-repository ppa:kisak/kisak-mesa && sudo apt upgrade). - DualSense shows as "unknown gamepad": kernel HID driver version — update kernel (5.12+ has native DualSense HID) or add manual udev rule above.
- PCSX2 audio crackling on PipeWire: buffer underrun — PCSX2 Settings → Audio → Module → Cubeb → raise Latency to 80ms.
- Screen tearing in fullscreen: KMS/VSync not enabled — enable Adaptive Sync/FreeSync in compositor settings (KDE: Screen Configuration → Adaptive Sync).
- Dolphin can't find GCN adapter: USB udev rule missing — add the 057e/0337 rule above, replug adapter after reload.
- AppImage won't launch: missing FUSE or exec bit —
chmod +x *.AppImageand installlibfuse2(not FUSE3 on older distros). - Saves don't persist across Flatpak updates: save path inside app sandbox — back up
~/.var/app/<flatpak-id>/before major updates.
See also: which emulators need a BIOS and where they go — RetroArch complete setup guide
Comments (0)
Sign in to_leave_comment