When the printer stays silent
You plug a USB printer into your Fedora machine or point it at a network device, but the queue sits idle. Applications report that the job was sent, yet the paper tray remains empty. Sometimes the system throws a Permission denied error, other times it just drops the job into the void. Printing on Linux relies on CUPS, and while it handles most modern devices automatically, older hardware or corporate network setups often require manual configuration.
How CUPS actually works
CUPS stands for Common Unix Printing System. It acts as the translation layer between your desktop applications and the printer's native language. When you send a document to print, your application hands the file to CUPS. CUPS then applies a driver, converts the document into a format the printer understands, and pushes it through a queue to the device.
Think of CUPS as a postal sorting facility. Your application drops off a package. CUPS reads the address, stamps it with the correct routing instructions, and hands it to the delivery driver. If the address is wrong, the driver is on strike, or the sorting facility is closed, the package never leaves the building.
The system tracks three main pieces of information for every printer. The device URI tells CUPS where to find the hardware on the network or USB bus. The PPD file describes the printer's capabilities and tells CUPS how to translate PostScript or PDF into machine code. The queue name is the label you and your applications use to target the device. If any of these three pieces is missing or misconfigured, the job fails.
CUPS stores its configuration in /etc/cups/. Never edit files in /usr/lib/cups/. Those ship with the package and get overwritten on the next update. Always modify /etc/cups/cupsd.conf or use the provided CLI tools to change settings.
Check the service state before troubleshooting hardware.
Enable the printing service
Fedora starts CUPS automatically on desktop installations, but minimal server setups or custom spins might leave it disabled. Verify the daemon is active before chasing driver issues.
sudo systemctl status cups
# Verify the service is active and running. If it shows inactive or dead, enable it.
sudo systemctl enable --now cups
# --now starts the service immediately and enables it for future boots.
# CUPS listens on port 631 by default. The firewall usually allows localhost access automatically.
Reboot before you debug. Half the time the symptom is gone.
Add a printer through the desktop
The GNOME Settings interface handles most consumer printers without friction. Open Settings, navigate to Printers, and click the Add button. Fedora scans the USB bus and broadcasts mDNS queries to find network devices. Select your printer from the list. CUPS automatically downloads the matching PPD from the internal database and creates the queue.
This method works best for plug-and-play devices. It hides the underlying URI and driver selection, which is fine for home use but makes it harder to audit or script later.
Run lpstat -p to confirm the queue appeared after the graphical setup.
Add a printer from the terminal
Command-line configuration gives you exact control over the queue name, device URI, and driver selection. It is also the only reliable method for headless servers or remote desktop sessions.
Start by listing every device CUPS can currently see.
lpinfo -v
# -v prints the device classes and URIs. Look for direct:usb, network:ipp, or network:lpd.
# The output shows exactly how CUPS addresses each hardware endpoint.
Create the queue and attach a driver. Modern printers often support the everywhere driver, which relies on the printer's built-in conversion engine instead of local PostScript translation.
sudo lpadmin -p OfficeLaser -E -v ipp://192.168.1.50/ipp/print -m everywhere
# -p sets the queue name. -E enables the printer and accepts jobs immediately.
# -v defines the device URI. Replace the IP with your actual printer address.
# -m specifies the PPD or driver model. everywhere uses the printer's native IPP capabilities.
Set the new queue as the system default so applications target it automatically.
sudo lpoptions -d OfficeLaser
# -d marks the specified queue as the default destination for lp and lpr commands.
Send a minimal test job to verify the pipeline.
echo "Test page from Fedora" | lp -d OfficeLaser
# lp sends the stdin stream to the specified queue. The printer should output the text immediately.
Run lpstat -o to watch the job move from pending to processing. If it stalls, check the error log before restarting the service.
Install missing drivers
Fedora's default repositories include foomatic-db and gutenprint, which cover a wide range of legacy and consumer printers. If the automatic detection fails, install the database packages and let CUPS search for a compatible PPD.
sudo dnf install foomatic-db foomatic-db-ppds gutenprint-cups
# foomatic-db provides the PPD repository. gutenprint-cups adds driver support for Epson and older Canon models.
# After installation, run lpinfo -m to see the newly available driver list.
HP devices require the hplip package, which bundles proprietary firmware and the hp-setup configuration tool.
sudo dnf install hplip
# hplip handles driver installation, firmware upload, and queue creation in one step.
hp-setup -i
# -i runs the interactive installer. It prompts for connection type and automatically configures CUPS.
Brother and some Epson models ship vendor-specific RPMs. Download the exact package for your Fedora release from the manufacturer's Linux support page. Install it locally with dnf to resolve dependencies correctly.
sudo dnf install ./brother-hl-L2350dw-lpr-4.2.1-1.x86_64.rpm
# dnf handles local RPMs the same way it handles repositories. It pulls missing dependencies automatically.
# Vendor packages often include a post-install script that runs lpadmin for you.
Trust the package manager. Manual file edits drift, snapshots stay.
Verify the setup
Check the queue status and recent job history to confirm everything is routing correctly.
lpstat -p -d
# -p lists all printers and their enabled/accepting status. -d shows the current default queue.
# Look for "enabled, accepting" next to your printer name.
If the job is stuck in the queue, clear it and retry.
cancel -a
# cancel removes all pending jobs from all queues. Use this when a corrupted page blocks the pipeline.
Run journalctl -xeu cups to read the spooler logs. The x flag adds explanatory context to each log line, and the e flag jumps to the end of the journal. Most sysadmins type this muscle-memory style when a service misbehaves.
Check the logs before guessing.
Common pitfalls and error patterns
CUPS permissions are strict by design. If you receive lp: Permission denied when trying to print from a standard user account, your user is missing from the lp group.
sudo usermod -aG lp $USER
# -aG appends the user to the lp group without removing existing group memberships.
# Log out and log back in for the group change to take effect.
Network printers sometimes drop jobs with connection errors. The CUPS error log will show the exact failure point.
E [15/Oct/2024:14:22:01 +0000] [Client 10] Returning HTTP Forbidden for POST /printers/OfficeLaser (user @localhost)
E [15/Oct/2024:14:22:01 +0000] [Client 10] Error: Unable to connect to remote host (Connection refused).
This usually means the firewall is blocking outbound IPP traffic or the printer's IP changed. Run firewall-cmd --reload after modifying rules, and verify the URI matches the current network assignment.
If you see [FAILED] Failed to start cups.service during boot, your configuration file likely contains a syntax error or references a missing module. Check /var/log/cups/error_log for the exact line number. CUPS refuses to start if the config is malformed.
SELinux occasionally blocks non-standard printer paths. Denials show up in journalctl -t setroubleshoot with a one-line summary. Read those before disabling SELinux. The policy usually just needs a file context adjustment or a missing boolean toggle.
Read the actual error before guessing.
Choose the right method
Use GNOME Settings when you want a quick graphical setup for a single home printer. Use lpadmin when you need precise control over queue names, URIs, and driver selection. Use hplip when you are configuring an HP multifunction device that requires firmware uploads. Use vendor RPMs when the manufacturer provides a dedicated driver that bypasses the generic PPD database. Stick to the everywhere driver when your printer supports modern IPP and you want to avoid legacy PostScript conversion.