You plugged in the printer and Fedora sees nothing
You just connected a new Epson EcoTank to your desk or added it to your Wi-Fi network. You open a document to print, and the dialog shows "No printers found" or defaults to a generic PDF writer. The hardware works. The network connection is fine. Fedora just does not speak Epson's proprietary language out of the box.
What is actually happening
CUPS (Common UNIX Printing System) is the printing spooler that runs on Fedora. It handles job queues, filters, and device communication. CUPS itself is open source. The drivers that translate your document into the specific inkjet commands your Epson understands are proprietary. Red Hat and Fedora follow a strict policy of shipping only free and open-source software in the default repositories. That means the Epson PPD files and backend utilities live in a third-party repository. RPM Fusion bridges that gap. It packages proprietary firmware and drivers so they integrate cleanly with dnf and follow Fedora's packaging standards. Think of CUPS as a universal translator. RPM Fusion hands it the specific dialect your printer uses.
When you send a print job, CUPS reads the PPD (PostScript Printer Description) file to understand what features the hardware supports. It then passes the document through a filter chain that converts it to a raster format. Finally, a backend program sends the raw data to the USB port or network socket. If the PPD or backend is missing, CUPS drops the job or falls back to a generic driver that cannot control ink levels, duplexing, or photo quality. The spooler does not guess. It requires explicit mapping between the device URI and the installed filter.
Reboot before you debug. Half the time the symptom is gone.
Add the repository and install the driver
Fedora's default repositories will not find Epson packages. You need to enable RPM Fusion first. The repository splits into free and nonfree sections. The nonfree section contains the proprietary Epson drivers. You only need to run the repository setup once per system. RPM Fusion signs its packages with a GPG key that dnf verifies automatically. The repository metadata includes dependency resolution rules that match Fedora's current library versions.
Here is how to safely add RPM Fusion and verify it is active.
# Download the release packages for your current Fedora version
# rpm -E %fedora expands to your release number so the command works across versions
sudo dnf install -y https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm \
https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
# Enable the nonfree repository if your Fedora version disables it by default
sudo dnf config-manager --set-enabled rpmfusion-nonfree
# Refresh the package cache so dnf sees the new repository metadata
sudo dnf makecache
Convention aside: dnf upgrade --refresh is the normal weekly maintenance command. dnf system-upgrade is for crossing major Fedora releases. They are different commands. Don't conflate them. Running makecache after adding a repo is just a one-time step to populate the local metadata.
Epson splits its drivers into three main packages. The naming matches the underlying communication protocol. You need to pick the one that matches your printer series. The package names are long because they encode the protocol version and hardware class.
Here is how to search for the correct package before installing.
# Search enabled repositories for Epson inkjet packages
# The output lists package names and short descriptions
dnf search epson-inkjet-printer
# Install the driver package that matches your hardware
# escpr2 covers most modern EcoTank and Expression models
sudo dnf install -y epson-inkjet-printer-escpr2
The package installs PPD files into /usr/share/cups/model/ and backend scripts into /usr/lib/cups/backend/. CUPS scans these directories automatically when the daemon starts. You do not need to move files manually. Config files in /etc/ are user-modified. Files in /usr/lib/ ship with the package. Edit /etc/. Never edit /usr/lib/.
Run journalctl first. Read the actual error before guessing.
Configure the printer in CUPS
The driver is installed. CUPS still needs to know about the physical device. You can use the graphical system-config-printer tool or the CUPS web interface. Both methods write to the same configuration database. The graphical tool is faster for desktop users. The web interface gives you direct access to the PPD dropdown and backend URI fields.
Here is how to restart the spooler and check its current state.
# Restart the CUPS daemon to load the newly installed backend and filter files
sudo systemctl restart cups
# Check the service status and recent log lines in one view
systemctl status cups
# Verify the daemon is listening on the local loopback interface
ss -tlnp | grep cups
Open system-config-printer from your application menu. Click the Add button. The tool will scan for USB and network devices. Select your Epson model. When the driver selection screen appears, choose the Epson ESCPR2 or ESCPR driver that matches your model number. Apply the settings and print a test page. The tool will prompt you to set default options like paper size and color mode. Leave the duplex setting at the hardware default unless your printer explicitly supports automatic two-sided printing.
If you prefer the command line or a headless server, open a browser and navigate to http://localhost:631. Log in with your user credentials. CUPS will prompt you for the password. Go to Administration, click Add Printer, and follow the same selection steps. The web interface shows the exact PPD name being used. You can also edit the device URI directly if you need to switch from a hostname to a static IP address.
Snapshot the system before the upgrade. Future-you will thank you.
Verify it worked
A successful installation shows the printer in the active queue and accepts test jobs without errors. The spooler will report the device as idle and enabled. Jobs will move from the queue to the hardware within seconds.
Here is how to query the spooler and confirm the device is ready.
# List all configured printers and mark the default destination
lpstat -p -d
# Send a simple text file to the printer to verify the filter chain
lp -d YOUR_PRINTER_NAME /etc/hosts
# Watch the job queue in real time to see status transitions
lpstat -o
Check the physical printer display. It should show "Receiving" or "Printing". If the job sits in the queue with a stopped status, CUPS encountered a backend error or a permission denial. Run journalctl -xe to read the actual error before guessing. The x flag adds explanatory text and the e flag jumps to the end. Most sysadmins type journalctl -xeu cups muscle-memory style.
Trust the package manager. Manual file edits drift, snapshots stay.
Common pitfalls and what the error looks like
The system-config-printer tool will refuse to save settings and print Unable to set printer options: org.freedesktop.DBus.Error.AccessDenied. This happens when your user account lacks policykit privileges for CUPS administration. Add your user to the lpadmin group with sudo usermod -aG lpadmin $USER and log out completely. Group membership does not apply to already running sessions.
Network printers sometimes disappear after a reboot. The lpstat command shows printer is idle, enabled since ... but jobs fail with Error: Unable to connect to remote host. Your router changed the DHCP lease. Assign a static IP to the printer in your router settings. Then update the device URI in CUPS to use the fixed address instead of the hostname. Run firewall-cmd --reload after every rule change. Otherwise the runtime config and the persistent config diverge.
SELinux denials show up in journalctl -t setroubleshoot with a one-line summary. Read those before disabling SELinux. CUPS runs in a confined domain. If you moved a custom PPD file into /etc/cups/ppd/ without restoring the context, the spooler will silently reject it. Run sudo restorecon -Rv /etc/cups/ to fix the labels. Fedora's release cadence is 6 months. The N-2 release goes EOL when N+1 ships. Plan upgrades on that cycle.
If the boot menu is gone, GRUB rescue is your friend, not your enemy.
When to use this vs alternatives
Use epson-inkjet-printer-escpr when you have an older WorkForce or Stylus model from the 2010s. Use epson-inkjet-printer-escpr2 when you are running a modern EcoTank, Expression, or L-series printer. Use epson-inkjet-printer-escp2 when your device relies on the legacy ESC/P2 protocol instead of the newer ESCPR variant. Stay with the generic cups-browsed and IPP drivers when your printer supports AirPrint or native IPP and you want to avoid proprietary packages entirely.